1
1
package requests
2
2
3
- import java .io .*
4
- import java .net .http .*
5
- import java .net .{UnknownHostException as _ , * }
3
+ import java .io ._
4
+ import java .net .http ._
5
+ import java .net .{UnknownHostException => _ , _ }
6
6
import java .nio .ByteBuffer
7
7
import java .time .Duration
8
8
import java .util .concurrent .Flow
9
9
import java .util .function .Supplier
10
10
import java .util .zip .{GZIPInputStream , InflaterInputStream }
11
11
12
- import scala .collection .JavaConverters .*
12
+ import scala .collection .JavaConverters ._
13
13
import scala .collection .mutable
14
14
import scala .concurrent .{ExecutionException , Future }
15
15
@@ -200,26 +200,6 @@ case class Requester(verb: String,
200
200
.connectTimeout(Duration .ofMillis(connectTimeout))
201
201
.build()
202
202
203
- val requestBodyInputStream = new PipedInputStream ()
204
-
205
- val requestBuilder =
206
- HttpRequest .newBuilder()
207
- .uri(url1.toURI)
208
- .method(upperCaseVerb, HttpRequest .BodyPublishers .ofInputStream(new Supplier [InputStream ] {
209
- override def get () = requestBodyInputStream
210
- }))
211
- .timeout(Duration .ofMillis(readTimeout))
212
-
213
- for ((k, v) <- blobHeaders) requestBuilder.header(k, v)
214
-
215
- for ((k, v) <- sess.headers) requestBuilder.header(k, v)
216
-
217
- for ((k, v) <- headers) requestBuilder.header(k, v)
218
-
219
- for ((k, v) <- compress.headers) requestBuilder.header(k, v)
220
-
221
- auth.header.foreach(requestBuilder.header(" Authorization" , _))
222
-
223
203
val sessionCookieValues = for {
224
204
c <- (sess.cookies ++ cookies).valuesIterator
225
205
if ! c.hasExpired
@@ -228,20 +208,44 @@ case class Requester(verb: String,
228
208
} yield (c.getName, c.getValue)
229
209
230
210
val allCookies = sessionCookieValues ++ cookieValues
231
- if (allCookies.nonEmpty) {
232
- requestBuilder.header(
233
- " Cookie" ,
234
- allCookies
211
+
212
+ val allHeaders =
213
+ blobHeaders ++
214
+ sess.headers ++
215
+ headers ++
216
+ compress.headers ++
217
+ auth.header.map(" Authorization" -> _) ++
218
+ (if (allCookies.isEmpty) None
219
+ else Some (" Cookie" -> allCookies
235
220
.map { case (k, v) => s """ $k=" $v" """ }
236
221
.mkString(" ; " )
237
- )
238
- }
222
+ ))
223
+ val allHeadersFlat = allHeaders.toList.flatMap { case (k, v) => Seq (k, v) }
224
+
225
+ val requestBodyInputStream = new PipedInputStream ()
226
+ val requestBodyOutputStream = new PipedOutputStream (requestBodyInputStream)
227
+
228
+ val bodyPublisher : HttpRequest .BodyPublisher =
229
+ HttpRequest .BodyPublishers .ofInputStream(new Supplier [InputStream ] {
230
+ override def get () = requestBodyInputStream
231
+ })
239
232
240
- val request = requestBuilder.build()
233
+ val requestBuilder =
234
+ HttpRequest .newBuilder()
235
+ .uri(url1.toURI)
236
+ .timeout(Duration .ofMillis(readTimeout))
237
+ .headers(allHeadersFlat : _* )
238
+ .method(upperCaseVerb,
239
+ data.contentLength match {
240
+ case Some (0 ) => HttpRequest .BodyPublishers .noBody()
241
+ case Some (n) if compress == Compress .None => HttpRequest .BodyPublishers .fromPublisher(bodyPublisher, n)
242
+ case _ => bodyPublisher
243
+ }
244
+ )
241
245
242
- val fut = httpClient.sendAsync(request , HttpResponse .BodyHandlers .ofInputStream())
246
+ val fut = httpClient.sendAsync(requestBuilder.build() , HttpResponse .BodyHandlers .ofInputStream())
243
247
244
- usingOutputStream(compress.wrap(new PipedOutputStream (requestBodyInputStream) )) { os =>
248
+ usingOutputStream(compress.wrap(requestBodyOutputStream )) { os =>
245
249
data.write(os)
246
250
}
247
251
0 commit comments