diff options
Diffstat (limited to 'okhttp-handler/src/main/scala/com')
-rw-r--r-- | okhttp-handler/src/main/scala/com/softwaremill/sttp/okhttp/OkHttpClientHandler.scala | 52 |
1 files changed, 42 insertions, 10 deletions
diff --git a/okhttp-handler/src/main/scala/com/softwaremill/sttp/okhttp/OkHttpClientHandler.scala b/okhttp-handler/src/main/scala/com/softwaremill/sttp/okhttp/OkHttpClientHandler.scala index 2250859..d670b62 100644 --- a/okhttp-handler/src/main/scala/com/softwaremill/sttp/okhttp/OkHttpClientHandler.scala +++ b/okhttp-handler/src/main/scala/com/softwaremill/sttp/okhttp/OkHttpClientHandler.scala @@ -2,6 +2,7 @@ package com.softwaremill.sttp.okhttp import java.io.IOException import java.nio.charset.Charset +import java.util.concurrent.TimeUnit import com.softwaremill.sttp._ import ResponseAs.EagerResponseHandler @@ -20,6 +21,7 @@ import okhttp3.{ import okio.{BufferedSink, Okio} import scala.collection.JavaConverters._ +import scala.concurrent.duration.FiniteDuration import scala.concurrent.{ExecutionContext, Future} import scala.language.higherKinds import scala.util.{Failure, Try} @@ -142,18 +144,34 @@ abstract class OkHttpHandler[R[_], S](client: OkHttpClient, } object OkHttpHandler { - def buildClientNoRedirects(): OkHttpClient = + def defaultBuilder(): OkHttpClient.Builder = new OkHttpClient.Builder() .followRedirects(false) .followSslRedirects(false) - .build() + + def updateClientIfCustomReadTimeout[T, S]( + r: Request[T, S], + client: OkHttpClient): OkHttpClient = { + if (r.readTimeout == SttpHandler.DefaultConnectionTimeout) client + else + client + .newBuilder() + .readTimeout(if (r.readTimeout.isFinite()) r.readTimeout.toMillis + else 0, + TimeUnit.MILLISECONDS) + .build() + + } } class OkHttpSyncHandler private (client: OkHttpClient, closeClient: Boolean) extends OkHttpHandler[Id, Nothing](client, closeClient) { override def send[T](r: Request[T, Nothing]): Response[T] = { val request = convertRequest(r) - val response = client.newCall(request).execute() + val response = OkHttpHandler + .updateClientIfCustomReadTimeout(r, client) + .newCall(request) + .execute() readResponse(response, r.response) } @@ -166,9 +184,15 @@ object OkHttpSyncHandler { new FollowRedirectsHandler[Id, Nothing]( new OkHttpSyncHandler(client, closeClient)) - def apply(): SttpHandler[Id, Nothing] = - OkHttpSyncHandler(OkHttpHandler.buildClientNoRedirects(), - closeClient = true) + def apply( + connectionTimeout: FiniteDuration = SttpHandler.DefaultConnectionTimeout) + : SttpHandler[Id, Nothing] = + OkHttpSyncHandler( + OkHttpHandler + .defaultBuilder() + .connectTimeout(connectionTimeout.toMillis, TimeUnit.MILLISECONDS) + .build(), + closeClient = true) def usingClient(client: OkHttpClient): SttpHandler[Id, Nothing] = OkHttpSyncHandler(client, closeClient = false) @@ -185,7 +209,8 @@ abstract class OkHttpAsyncHandler[R[_], S](client: OkHttpClient, def success(r: R[Response[T]]) = cb(Right(r)) def error(t: Throwable) = cb(Left(t)) - client + OkHttpHandler + .updateClientIfCustomReadTimeout(r, client) .newCall(request) .enqueue(new Callback { override def onFailure(call: Call, e: IOException): Unit = @@ -213,10 +238,17 @@ object OkHttpFutureHandler { new FollowRedirectsHandler[Future, Nothing]( new OkHttpFutureHandler(client, closeClient)) - def apply()(implicit ec: ExecutionContext = ExecutionContext.Implicits.global) + def apply(connectionTimeout: FiniteDuration = SttpHandler.DefaultConnectionTimeout)( + implicit ec: ExecutionContext = ExecutionContext.Implicits.global) : SttpHandler[Future, Nothing] = - OkHttpFutureHandler(OkHttpHandler.buildClientNoRedirects(), - closeClient = true) + OkHttpFutureHandler( + OkHttpHandler + .defaultBuilder() + .connectTimeout(connectionTimeout.toMillis, TimeUnit.MILLISECONDS) + .readTimeout(SttpHandler.DefaultConnectionTimeout.toMillis, TimeUnit.MILLISECONDS) + .build(), + closeClient = true + ) def usingClient(client: OkHttpClient)(implicit ec: ExecutionContext = ExecutionContext.Implicits.global) |