diff options
author | adamw <adam@warski.org> | 2017-08-29 14:58:12 +0200 |
---|---|---|
committer | adamw <adam@warski.org> | 2017-08-29 14:58:12 +0200 |
commit | f7373e2d9ad23e7b64a710222e0638d3efbdb8cf (patch) | |
tree | 1cff72f0353b51bce1fbc4d555e61557a0196d93 | |
parent | acbf6567533011afe0479dffefa3a918fc570f32 (diff) | |
download | sttp-f7373e2d9ad23e7b64a710222e0638d3efbdb8cf.tar.gz sttp-f7373e2d9ad23e7b64a710222e0638d3efbdb8cf.tar.bz2 sttp-f7373e2d9ad23e7b64a710222e0638d3efbdb8cf.zip |
Multipart support in ok http client
-rw-r--r-- | okhttp-client-handler/src/main/scala/com/softwaremill/sttp/okhttp/OkHttpClientHandler.scala | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/okhttp-client-handler/src/main/scala/com/softwaremill/sttp/okhttp/OkHttpClientHandler.scala b/okhttp-client-handler/src/main/scala/com/softwaremill/sttp/okhttp/OkHttpClientHandler.scala index 758fbb5..6bef4fa 100644 --- a/okhttp-client-handler/src/main/scala/com/softwaremill/sttp/okhttp/OkHttpClientHandler.scala +++ b/okhttp-client-handler/src/main/scala/com/softwaremill/sttp/okhttp/OkHttpClientHandler.scala @@ -1,6 +1,7 @@ package com.softwaremill.sttp.okhttp import java.io.IOException +import java.net.URLEncoder import java.nio.charset.Charset import com.softwaremill.sttp._ @@ -9,8 +10,10 @@ import okhttp3.internal.http.HttpMethod import okhttp3.{ Call, Callback, + Headers, MediaType, OkHttpClient, + MultipartBody => OkHttpMultipartBody, Request => OkHttpRequest, RequestBody => OkHttpRequestBody, Response => OkHttpResponse @@ -28,7 +31,7 @@ abstract class OkHttpClientHandler[R[_], S](client: OkHttpClient) val builder = new OkHttpRequest.Builder() .url(request.uri.toString) - val body = setBody(request) + val body = bodyToOkHttp(request.body) builder.method(request.method.m, body.getOrElse { if (HttpMethod.requiresRequestBody(request.method.m)) OkHttpRequestBody.create(null, "") @@ -45,8 +48,8 @@ abstract class OkHttpClientHandler[R[_], S](client: OkHttpClient) builder.build() } - private def setBody[T](request: Request[T, S]): Option[OkHttpRequestBody] = { - request.body match { + private def bodyToOkHttp[T](body: RequestBody[S]): Option[OkHttpRequestBody] = { + body match { case NoBody => None case StringBody(b, _, _) => Some(OkHttpRequestBody.create(null, b)) @@ -64,9 +67,25 @@ abstract class OkHttpClientHandler[R[_], S](client: OkHttpClient) Some(OkHttpRequestBody.create(null, b.toFile)) case StreamBody(s) => streamToRequestBody(s) + case MultipartBody(ps) => + val b = new OkHttpMultipartBody.Builder() + .setType(OkHttpMultipartBody.FORM) + ps.foreach(addMultipart(b, _)) + Some(b.build()) } } + private def addMultipart(builder: OkHttpMultipartBody.Builder, + mp: Multipart): Unit = { + val disposition = s"""form-data; name="${URLEncoder.encode(mp.name, Utf8)}"""" + + mp.fileName.fold("")(fn => + s"""; filename="${URLEncoder.encode(fn, Utf8)}"""") + val allHeaders = mp.additionalHeaders + ("Content-Disposition" -> disposition) + val headers = Headers.of(allHeaders.asJava) + + bodyToOkHttp(mp.body).foreach(builder.addPart(headers, _)) + } + private[okhttp] def readResponse[T]( res: OkHttpResponse, responseAs: ResponseAs[T, S]): R[Response[T]] = { |