diff --git a/src/main/scala/algoliasearch/api/AbtestingClient.scala b/src/main/scala/algoliasearch/api/AbtestingClient.scala index 875ac095..aaf13f4a 100644 --- a/src/main/scala/algoliasearch/api/AbtestingClient.scala +++ b/src/main/scala/algoliasearch/api/AbtestingClient.scala @@ -52,15 +52,15 @@ object AbtestingClient { ) private def readTimeout(): Duration = { - Duration(5, TimeUnit.SECONDS) + Duration(5000, TimeUnit.MILLISECONDS) } private def connectTimeout(): Duration = { - Duration(2, TimeUnit.SECONDS) + Duration(2000, TimeUnit.MILLISECONDS) } private def writeTimeout(): Duration = { - Duration(30, TimeUnit.SECONDS) + Duration(30000, TimeUnit.MILLISECONDS) } private def hosts(region: Option[String] = None): Seq[Host] = { diff --git a/src/main/scala/algoliasearch/api/AnalyticsClient.scala b/src/main/scala/algoliasearch/api/AnalyticsClient.scala index f1124c5f..0ba2484c 100644 --- a/src/main/scala/algoliasearch/api/AnalyticsClient.scala +++ b/src/main/scala/algoliasearch/api/AnalyticsClient.scala @@ -66,15 +66,15 @@ object AnalyticsClient { ) private def readTimeout(): Duration = { - Duration(5, TimeUnit.SECONDS) + Duration(5000, TimeUnit.MILLISECONDS) } private def connectTimeout(): Duration = { - Duration(2, TimeUnit.SECONDS) + Duration(2000, TimeUnit.MILLISECONDS) } private def writeTimeout(): Duration = { - Duration(30, TimeUnit.SECONDS) + Duration(30000, TimeUnit.MILLISECONDS) } private def hosts(region: Option[String] = None): Seq[Host] = { diff --git a/src/main/scala/algoliasearch/api/IngestionClient.scala b/src/main/scala/algoliasearch/api/IngestionClient.scala index 423b41eb..96928146 100644 --- a/src/main/scala/algoliasearch/api/IngestionClient.scala +++ b/src/main/scala/algoliasearch/api/IngestionClient.scala @@ -112,15 +112,15 @@ object IngestionClient { ) private def readTimeout(): Duration = { - Duration(25, TimeUnit.SECONDS) + Duration(25000, TimeUnit.MILLISECONDS) } private def connectTimeout(): Duration = { - Duration(25, TimeUnit.SECONDS) + Duration(25000, TimeUnit.MILLISECONDS) } private def writeTimeout(): Duration = { - Duration(25, TimeUnit.SECONDS) + Duration(25000, TimeUnit.MILLISECONDS) } private def hosts(region: String): Seq[Host] = { @@ -1223,7 +1223,16 @@ class IngestionClient( .withBody(pushTaskPayload) .withQueryParameter("watch", watch) .build() - execute[WatchResponse](request, requestOptions) + execute[WatchResponse]( + request, + Some( + RequestOptions( + writeTimeout = Some(Duration(180000, TimeUnit.MILLISECONDS)), + readTimeout = Some(Duration(180000, TimeUnit.MILLISECONDS)), + connectTimeout = Some(Duration(180000, TimeUnit.MILLISECONDS)) + ) + requestOptions + ) + ) } /** Runs all tasks linked to a source, only available for Shopify sources. It will create 1 run per task. @@ -1453,7 +1462,16 @@ class IngestionClient( .withMethod("POST") .withPath(s"/1/sources/${escape(sourceID)}/discover") .build() - execute[WatchResponse](request, requestOptions) + execute[WatchResponse]( + request, + Some( + RequestOptions( + writeTimeout = Some(Duration(180000, TimeUnit.MILLISECONDS)), + readTimeout = Some(Duration(180000, TimeUnit.MILLISECONDS)), + connectTimeout = Some(Duration(180000, TimeUnit.MILLISECONDS)) + ) + requestOptions + ) + ) } /** Try a transformation before creating it. @@ -1676,7 +1694,16 @@ class IngestionClient( .withPath(s"/1/sources/validate") .withBody(sourceCreate) .build() - execute[WatchResponse](request, requestOptions) + execute[WatchResponse]( + request, + Some( + RequestOptions( + writeTimeout = Some(Duration(180000, TimeUnit.MILLISECONDS)), + readTimeout = Some(Duration(180000, TimeUnit.MILLISECONDS)), + connectTimeout = Some(Duration(180000, TimeUnit.MILLISECONDS)) + ) + requestOptions + ) + ) } /** Validates an update of a source payload to ensure it can be created and that the data source can be reached by @@ -1704,7 +1731,16 @@ class IngestionClient( .withPath(s"/1/sources/${escape(sourceID)}/validate") .withBody(sourceUpdate) .build() - execute[WatchResponse](request, requestOptions) + execute[WatchResponse]( + request, + Some( + RequestOptions( + writeTimeout = Some(Duration(180000, TimeUnit.MILLISECONDS)), + readTimeout = Some(Duration(180000, TimeUnit.MILLISECONDS)), + connectTimeout = Some(Duration(180000, TimeUnit.MILLISECONDS)) + ) + requestOptions + ) + ) } } diff --git a/src/main/scala/algoliasearch/api/InsightsClient.scala b/src/main/scala/algoliasearch/api/InsightsClient.scala index a969fd45..3123780c 100644 --- a/src/main/scala/algoliasearch/api/InsightsClient.scala +++ b/src/main/scala/algoliasearch/api/InsightsClient.scala @@ -46,15 +46,15 @@ object InsightsClient { ) private def readTimeout(): Duration = { - Duration(5, TimeUnit.SECONDS) + Duration(5000, TimeUnit.MILLISECONDS) } private def connectTimeout(): Duration = { - Duration(2, TimeUnit.SECONDS) + Duration(2000, TimeUnit.MILLISECONDS) } private def writeTimeout(): Duration = { - Duration(30, TimeUnit.SECONDS) + Duration(30000, TimeUnit.MILLISECONDS) } private def hosts(region: Option[String] = None): Seq[Host] = { diff --git a/src/main/scala/algoliasearch/api/MonitoringClient.scala b/src/main/scala/algoliasearch/api/MonitoringClient.scala index e0543526..6c8d6efc 100644 --- a/src/main/scala/algoliasearch/api/MonitoringClient.scala +++ b/src/main/scala/algoliasearch/api/MonitoringClient.scala @@ -52,15 +52,15 @@ object MonitoringClient { ) private def readTimeout(): Duration = { - Duration(5, TimeUnit.SECONDS) + Duration(5000, TimeUnit.MILLISECONDS) } private def connectTimeout(): Duration = { - Duration(2, TimeUnit.SECONDS) + Duration(2000, TimeUnit.MILLISECONDS) } private def writeTimeout(): Duration = { - Duration(30, TimeUnit.SECONDS) + Duration(30000, TimeUnit.MILLISECONDS) } private def hosts(): Seq[Host] = { diff --git a/src/main/scala/algoliasearch/api/PersonalizationClient.scala b/src/main/scala/algoliasearch/api/PersonalizationClient.scala index 0ee2c50a..5ae0754e 100644 --- a/src/main/scala/algoliasearch/api/PersonalizationClient.scala +++ b/src/main/scala/algoliasearch/api/PersonalizationClient.scala @@ -48,15 +48,15 @@ object PersonalizationClient { ) private def readTimeout(): Duration = { - Duration(5, TimeUnit.SECONDS) + Duration(5000, TimeUnit.MILLISECONDS) } private def connectTimeout(): Duration = { - Duration(2, TimeUnit.SECONDS) + Duration(2000, TimeUnit.MILLISECONDS) } private def writeTimeout(): Duration = { - Duration(30, TimeUnit.SECONDS) + Duration(30000, TimeUnit.MILLISECONDS) } private def hosts(region: String): Seq[Host] = { diff --git a/src/main/scala/algoliasearch/api/QuerySuggestionsClient.scala b/src/main/scala/algoliasearch/api/QuerySuggestionsClient.scala index bc3c7007..157b4f07 100644 --- a/src/main/scala/algoliasearch/api/QuerySuggestionsClient.scala +++ b/src/main/scala/algoliasearch/api/QuerySuggestionsClient.scala @@ -50,15 +50,15 @@ object QuerySuggestionsClient { ) private def readTimeout(): Duration = { - Duration(5, TimeUnit.SECONDS) + Duration(5000, TimeUnit.MILLISECONDS) } private def connectTimeout(): Duration = { - Duration(2, TimeUnit.SECONDS) + Duration(2000, TimeUnit.MILLISECONDS) } private def writeTimeout(): Duration = { - Duration(30, TimeUnit.SECONDS) + Duration(30000, TimeUnit.MILLISECONDS) } private def hosts(region: String): Seq[Host] = { diff --git a/src/main/scala/algoliasearch/api/RecommendClient.scala b/src/main/scala/algoliasearch/api/RecommendClient.scala index 5e6e6296..8035e94d 100644 --- a/src/main/scala/algoliasearch/api/RecommendClient.scala +++ b/src/main/scala/algoliasearch/api/RecommendClient.scala @@ -50,15 +50,15 @@ object RecommendClient { ) private def readTimeout(): Duration = { - Duration(5, TimeUnit.SECONDS) + Duration(5000, TimeUnit.MILLISECONDS) } private def connectTimeout(): Duration = { - Duration(2, TimeUnit.SECONDS) + Duration(2000, TimeUnit.MILLISECONDS) } private def writeTimeout(): Duration = { - Duration(30, TimeUnit.SECONDS) + Duration(30000, TimeUnit.MILLISECONDS) } private def hosts(appId: String): Seq[Host] = { diff --git a/src/main/scala/algoliasearch/api/SearchClient.scala b/src/main/scala/algoliasearch/api/SearchClient.scala index e72ed407..fcfe9877 100644 --- a/src/main/scala/algoliasearch/api/SearchClient.scala +++ b/src/main/scala/algoliasearch/api/SearchClient.scala @@ -107,15 +107,15 @@ object SearchClient { ) private def readTimeout(): Duration = { - Duration(5, TimeUnit.SECONDS) + Duration(5000, TimeUnit.MILLISECONDS) } private def connectTimeout(): Duration = { - Duration(2, TimeUnit.SECONDS) + Duration(2000, TimeUnit.MILLISECONDS) } private def writeTimeout(): Duration = { - Duration(30, TimeUnit.SECONDS) + Duration(30000, TimeUnit.MILLISECONDS) } private def hosts(appId: String): Seq[Host] = { diff --git a/src/main/scala/algoliasearch/config/RequestOptions.scala b/src/main/scala/algoliasearch/config/RequestOptions.scala index 9717367c..0711cfc6 100644 --- a/src/main/scala/algoliasearch/config/RequestOptions.scala +++ b/src/main/scala/algoliasearch/config/RequestOptions.scala @@ -16,13 +16,27 @@ import scala.concurrent.duration.Duration * HTTP read timeout * @param writeTimeout * HTTP write timeout + * @param connectTimeout + * HTTP connect timeout */ case class RequestOptions( headers: Map[String, String] = Map.empty, queryParameters: Map[String, String] = Map.empty, readTimeout: Option[Duration] = None, - writeTimeout: Option[Duration] = None -) + writeTimeout: Option[Duration] = None, + connectTimeout: Option[Duration] = None +) { + def +(other: Option[RequestOptions]): RequestOptions = { + val some = other.getOrElse(return this) + new RequestOptions( + headers = this.headers ++ some.headers, + queryParameters = this.queryParameters ++ some.queryParameters, + readTimeout = some.readTimeout.orElse(this.readTimeout), + writeTimeout = some.writeTimeout.orElse(this.writeTimeout), + connectTimeout = some.connectTimeout.orElse(this.connectTimeout) + ) + } +} object RequestOptions { @@ -33,6 +47,7 @@ object RequestOptions { private val queryParameters: mutable.Map[String, String] = mutable.Map() private var readTimeout: Option[Duration] = None private var writeTimeout: Option[Duration] = None + private var connectTimeout: Option[Duration] = None /** Adds a header to the request. */ @@ -62,6 +77,13 @@ object RequestOptions { this } + /** Sets the write timeout for the request. + */ + def withConnectTimeout(connectTimeout: Option[Duration]): Builder = { + this.connectTimeout = connectTimeout + this + } + /** Builds the [[RequestOptions]]. */ def build(): RequestOptions = { @@ -69,7 +91,8 @@ object RequestOptions { headers = headers.toMap, queryParameters = queryParameters.toMap, readTimeout = readTimeout, - writeTimeout = writeTimeout + writeTimeout = writeTimeout, + connectTimeout = connectTimeout ) } } diff --git a/src/main/scala/algoliasearch/internal/HttpRequester.scala b/src/main/scala/algoliasearch/internal/HttpRequester.scala index 4c347488..533441b1 100644 --- a/src/main/scala/algoliasearch/internal/HttpRequester.scala +++ b/src/main/scala/algoliasearch/internal/HttpRequester.scala @@ -115,6 +115,7 @@ private[algoliasearch] class HttpRequester private ( requestOptions.foreach(options => { options.readTimeout.foreach(timeout => builder.readTimeout(timeout.toMillis, TimeUnit.MILLISECONDS)) options.writeTimeout.foreach(timeout => builder.writeTimeout(timeout.toMillis, TimeUnit.MILLISECONDS)) + options.connectTimeout.foreach(timeout => builder.connectTimeout(timeout.toMillis, TimeUnit.MILLISECONDS)) }) builder.build }