diff --git a/clients/algoliasearch-client-java/algoliasearch/src/main/java/com/algolia/ApiClient.java b/clients/algoliasearch-client-java/algoliasearch/src/main/java/com/algolia/ApiClient.java index a9bf5e50e43..67bf34bfa36 100644 --- a/clients/algoliasearch-client-java/algoliasearch/src/main/java/com/algolia/ApiClient.java +++ b/clients/algoliasearch-client-java/algoliasearch/src/main/java/com/algolia/ApiClient.java @@ -11,7 +11,6 @@ import com.fasterxml.jackson.core.type.TypeReference; import java.io.Closeable; import java.io.IOException; -import java.time.Duration; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; @@ -32,16 +31,7 @@ public abstract class ApiClient implements Closeable { public AuthInterceptor authInterceptor; /** Constructs a new instance of the {@link ApiClient}. */ - protected ApiClient( - String appId, - String apiKey, - String clientName, - @Nullable ClientOptions options, - List defaultHosts, - Duration connectTimeout, - Duration readTimeout, - Duration writeTimeout - ) { + protected ApiClient(String appId, String apiKey, String clientName, @Nullable ClientOptions options, List defaultHosts) { if (appId == null || appId.isEmpty()) { throw new AlgoliaRuntimeException("`appId` is missing."); } @@ -52,20 +42,11 @@ protected ApiClient( executor = clientOptions.getExecutor(); requester = clientOptions.getCustomRequester() != null ? clientOptions.getCustomRequester() - : defaultRequester(appId, apiKey, clientName, clientOptions, defaultHosts, connectTimeout, readTimeout, writeTimeout); + : defaultRequester(appId, apiKey, clientName, clientOptions, defaultHosts); } /** Creates a default {@link Requester} for executing API requests. */ - private Requester defaultRequester( - String appId, - String apiKey, - String clientName, - ClientOptions options, - List defaultHosts, - Duration connectTimeout, - Duration readTimeout, - Duration writeTimeout - ) { + private Requester defaultRequester(String appId, String apiKey, String clientName, ClientOptions options, List defaultHosts) { AlgoliaAgent algoliaAgent = new AlgoliaAgent(BuildConfig.VERSION) .addSegment(new AlgoliaAgent.Segment(clientName, BuildConfig.VERSION)) .addSegments(options.getAlgoliaAgentSegments()); @@ -78,10 +59,7 @@ private Requester defaultRequester( HttpRequester.Builder builder = new HttpRequester.Builder(serializer) .addInterceptor(authInterceptor) .addInterceptor(new UserAgentInterceptor(algoliaAgent)) - .addInterceptor(new RetryStrategy(statefulHosts)) - .setConnectTimeout(connectTimeout) - .setReadTimeout(readTimeout) - .setWriteTimeout(writeTimeout); + .addInterceptor(new RetryStrategy(statefulHosts)); if (options.getRequesterConfig() != null) { options.getRequesterConfig().accept(builder); } diff --git a/generators/src/main/java/com/algolia/codegen/AlgoliaJavaGenerator.java b/generators/src/main/java/com/algolia/codegen/AlgoliaJavaGenerator.java index 8a09bbba4bb..308d2d839bf 100644 --- a/generators/src/main/java/com/algolia/codegen/AlgoliaJavaGenerator.java +++ b/generators/src/main/java/com/algolia/codegen/AlgoliaJavaGenerator.java @@ -95,6 +95,7 @@ public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List models, Map stepOut.put("isCreateClient", true); // TODO: remove once kotlin is converted boolean hasCustomHosts = step.parameters != null && step.parameters.containsKey("customHosts"); - if (hasCustomHosts) testOut.put("useEchoRequester", false); stepOut.put("hasCustomHosts", hasCustomHosts); if (hasCustomHosts) { + testOut.put("useEchoRequester", false); stepOut.put("customHosts", step.parameters.get("customHosts")); } + boolean hasCustomWriteTimeout = step.parameters != null && step.parameters.containsKey("writeTimeout"); + stepOut.put("hasCustomWriteTimeout", hasCustomWriteTimeout); + if (hasCustomWriteTimeout) { + stepOut.put("writeTimeout", step.parameters.get("writeTimeout")); + } + + stepOut.put("hasCustomClientCreate", hasCustomWriteTimeout || hasCustomHosts); + boolean hasTransformationRegion = step.parameters != null && step.parameters.containsKey("transformationRegion"); - if (hasTransformationRegion) testOut.put("useEchoRequester", false); stepOut.put("hasTransformationRegion", hasTransformationRegion); if (hasTransformationRegion) { + testOut.put("useEchoRequester", false); stepOut.put("transformationRegion", step.parameters.get("transformationRegion")); } diff --git a/generators/src/main/java/com/algolia/codegen/utils/Timeouts.java b/generators/src/main/java/com/algolia/codegen/utils/Timeouts.java index 2b09bd2fb1a..82112a2cbcf 100644 --- a/generators/src/main/java/com/algolia/codegen/utils/Timeouts.java +++ b/generators/src/main/java/com/algolia/codegen/utils/Timeouts.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.*; import io.swagger.v3.oas.models.OpenAPI; import java.util.*; +import org.openapitools.codegen.model.OperationsMap; class TimeoutsValues { @@ -20,9 +21,11 @@ class TimeoutsBundle { public class Timeouts { + private static TimeoutsBundle defaults; + /** Inject timeouts in miliseconds into the given bundle, under the x-timeouts property * */ public static void enrichBundle(OpenAPI spec, Map bundle) throws ConfigException { - TimeoutsBundle defaults = new TimeoutsBundle(); + defaults = new TimeoutsBundle(); // the default below are what the search API expect, which was previously used for any client defaults.browser.connect = 1000; defaults.browser.read = 2000; @@ -33,18 +36,40 @@ public static void enrichBundle(OpenAPI spec, Map bundle) throws defaults.server.write = 30000; TimeoutsBundle specTimeouts = new ObjectMapper().convertValue(spec.getExtensions().get("x-timeouts"), TimeoutsBundle.class); - if (specTimeouts == null) { - specTimeouts = new TimeoutsBundle(); - specTimeouts.browser = defaults.browser; - specTimeouts.server = defaults.server; - } - if (specTimeouts.browser == null) { - specTimeouts.browser = defaults.browser; - } - if (specTimeouts.server == null) { - specTimeouts.server = defaults.server; + if (specTimeouts != null) { + if (specTimeouts.browser != null) { + defaults.browser = specTimeouts.browser; + } + if (specTimeouts.server == null) { + defaults.server = specTimeouts.server; + } } - bundle.put("x-timeouts", specTimeouts); + bundle.put("x-timeouts", defaults); + } + + public static void propagate(OperationsMap operations) throws ConfigException { + operations + .getOperations() + .getOperation() + .forEach(entry -> { + if (!entry.vendorExtensions.containsKey("x-timeouts")) { + Map vendor = new HashMap<>(); + + Map browser = new HashMap<>(); + browser.put("connect", defaults.browser.connect); + browser.put("read", defaults.browser.read); + browser.put("write", defaults.browser.write); + vendor.put("browser", browser); + + Map server = new HashMap<>(); + server.put("connect", defaults.server.connect); + server.put("read", defaults.server.read); + server.put("write", defaults.server.write); + vendor.put("server", server); + + entry.vendorExtensions.put("x-timeouts", vendor); + } + }); } } diff --git a/templates/csharp/tests/client/createClient.mustache b/templates/csharp/tests/client/createClient.mustache index 41e5c9a449d..e39275b0216 100644 --- a/templates/csharp/tests/client/createClient.mustache +++ b/templates/csharp/tests/client/createClient.mustache @@ -1,5 +1,6 @@ -{{#hasCustomHosts}} +{{#hasCustomClientCreate}} {{clientPrefix}}Config _config = new {{clientPrefix}}Config("{{parametersWithDataTypeMap.appId.value}}","{{parametersWithDataTypeMap.apiKey.value}}"{{#hasRegionalHost}}{{#parametersWithDataTypeMap.region}},"{{parametersWithDataTypeMap.region.value}}"{{/parametersWithDataTypeMap.region}}{{/hasRegionalHost}}) { +{{#hasCustomHosts}} CustomHosts = new List { {{#customHosts}}new () { @@ -11,8 +12,12 @@ Accept = CallType.Read | CallType.Write, }{{^-last}},{{/-last}}{{/customHosts}} }{{#gzipEncoding}},Compression = CompressionType.Gzip{{/gzipEncoding}} +{{/hasCustomHosts}} +{{#hasCustomWriteTimeout}} + WriteTimeout = {{writeTimeout}} +{{/hasCustomWriteTimeout}} }; {{^autoCreateClient}}var client = {{/autoCreateClient}}new {{client}}(_config); -{{/hasCustomHosts}} +{{/hasCustomClientCreate}} {{#useEchoRequester}} {{^autoCreateClient}}var client = {{/autoCreateClient}}new {{client}}(new {{clientPrefix}}Config("{{parametersWithDataTypeMap.appId.value}}","{{parametersWithDataTypeMap.apiKey.value}}"{{#hasRegionalHost}}{{#parametersWithDataTypeMap.region}},"{{parametersWithDataTypeMap.region.value}}"{{/parametersWithDataTypeMap.region}}{{/hasRegionalHost}}), _echo);{{/useEchoRequester}} \ No newline at end of file diff --git a/templates/go/tests/client/createClient.mustache b/templates/go/tests/client/createClient.mustache index f0ff743823e..f803ce0678c 100644 --- a/templates/go/tests/client/createClient.mustache +++ b/templates/go/tests/client/createClient.mustache @@ -8,6 +8,9 @@ cfg = {{clientPrefix}}.{{clientName}}Configuration{ {{#hasCustomHosts}} Hosts: []transport.StatefulHost{ {{#customHosts}}transport.NewStatefulHost("http", tests.GetLocalhost() + ":{{port}}", call.IsReadWrite),{{/customHosts}} }, {{/hasCustomHosts}} + {{#hasCustomWriteTimeout}} + WriteTimeout: {{writeTimeout}}, + {{/hasCustomWriteTimeout}} {{#gzipEncoding}} Compression: compression.GZIP, {{/gzipEncoding}} diff --git a/templates/java/api.mustache b/templates/java/api.mustache index beaf00b0eab..280157e61b6 100644 --- a/templates/java/api.mustache +++ b/templates/java/api.mustache @@ -85,7 +85,7 @@ public class {{classname}} extends ApiClient { } public {{classname}}(String appId, String apiKey, String region, ClientOptions options) { - super(appId, apiKey, "{{{baseName}}}", options, getDefaultHosts(region), Duration.ofMillis({{{x-timeouts.server.connect}}}L), Duration.ofMillis({{{x-timeouts.server.read}}}L), Duration.ofMillis({{{x-timeouts.server.write}}}L)); + super(appId, apiKey, "{{{baseName}}}", options, getDefaultHosts(region)); } {{/hasRegionalHost}} @@ -95,7 +95,7 @@ public class {{classname}} extends ApiClient { } public {{classname}}(String appId, String apiKey, ClientOptions options) { - super(appId, apiKey, "{{{baseName}}}", options, getDefaultHosts({{#hostWithAppID}}appId{{/hostWithAppID}}), Duration.ofMillis({{{x-timeouts.server.connect}}}L), Duration.ofMillis({{{x-timeouts.server.read}}}L), Duration.ofMillis({{{x-timeouts.server.write}}}L)); + super(appId, apiKey, "{{{baseName}}}", options, getDefaultHosts({{#hostWithAppID}}appId{{/hostWithAppID}})); } {{/hasRegionalHost}} @@ -218,7 +218,7 @@ public class {{classname}} extends ApiClient { {{#headerParams}}.addHeader("{{baseName}}", {{paramName}}){{/headerParams}} {{#vendorExtensions}}{{#queryParams}}{{^x-is-custom-request}}.addQueryParameter("{{baseName}}", {{paramName}}){{/x-is-custom-request}}{{#x-is-custom-request}}.addQueryParameters(parameters){{/x-is-custom-request}}{{/queryParams}}{{/vendorExtensions}} .build(); - return executeAsync(request, {{#vendorExtensions.x-timeouts}}new RequestOptions().setReadTimeout(Duration.ofMillis({{{read}}}L)).setWriteTimeout(Duration.ofMillis({{{write}}}L)).setConnectTimeout(Duration.ofMillis({{{connect}}}L)).mergeRight({{/vendorExtensions.x-timeouts}}requestOptions{{#vendorExtensions.x-timeouts}}){{/vendorExtensions.x-timeouts}}, {{#vendorExtensions}}{{#x-is-generic}}{{{returnType}}}.class, innerType{{/x-is-generic}}{{/vendorExtensions}}{{^vendorExtensions.x-is-generic}}{{^returnType}}null{{/returnType}}{{#returnType}}new TypeReference<{{{.}}}>(){}{{/returnType}}{{/vendorExtensions.x-is-generic}}); + return executeAsync(request, new RequestOptions(){{#vendorExtensions.x-timeouts.server}}.setReadTimeout(clientOptions.getReadTimeout() != null ? clientOptions.getReadTimeout() : Duration.ofMillis({{{read}}}L)).setWriteTimeout(clientOptions.getWriteTimeout() != null ? clientOptions.getWriteTimeout() : Duration.ofMillis({{{write}}}L)).setConnectTimeout(clientOptions.getConnectTimeout() != null ? clientOptions.getConnectTimeout() : Duration.ofMillis({{{connect}}}L)){{/vendorExtensions.x-timeouts.server}}.mergeRight(requestOptions), {{#vendorExtensions}}{{#x-is-generic}}{{{returnType}}}.class, innerType{{/x-is-generic}}{{/vendorExtensions}}{{^vendorExtensions.x-is-generic}}{{^returnType}}null{{/returnType}}{{#returnType}}new TypeReference<{{{.}}}>(){}{{/returnType}}{{/vendorExtensions.x-is-generic}}); } {{! This case only sets `requestOptions` as optional }} diff --git a/templates/java/tests/client/client.mustache b/templates/java/tests/client/client.mustache index b41ffcb6604..9b6b642ef8f 100644 --- a/templates/java/tests/client/client.mustache +++ b/templates/java/tests/client/client.mustache @@ -42,11 +42,15 @@ class {{client}}ClientTests { } {{client}} createClient() { - return new {{client}}("appId", "apiKey", {{#hasRegionalHost}}"{{defaultRegion}}", {{/hasRegionalHost}}withEchoRequester()); + return new {{client}}("appId", "apiKey", {{#hasRegionalHost}}"{{defaultRegion}}", {{/hasRegionalHost}}withEchoRequester(null)); } - private ClientOptions withEchoRequester() { - return ClientOptions.builder().setRequesterConfig(requester -> requester.addInterceptor(echo)).build(); + private ClientOptions withEchoRequester(Integer writeTimeout) { + if (writeTimeout == null) { + return ClientOptions.builder().setRequesterConfig(requester -> requester.addInterceptor(echo)).build(); + } + + return ClientOptions.builder().setRequesterConfig(requester -> requester.addInterceptor(echo)).setWriteTimeout(Duration.ofMillis(writeTimeout)).build(); } private ClientOptions withCustomHosts(List hosts, boolean gzipEncoding) { diff --git a/templates/java/tests/client/createClient.mustache b/templates/java/tests/client/createClient.mustache index 9716557c655..3345cfd17ed 100644 --- a/templates/java/tests/client/createClient.mustache +++ b/templates/java/tests/client/createClient.mustache @@ -1,2 +1,2 @@ -{{^autoCreateClient}}{{client}} client = {{/autoCreateClient}}new {{client}}("{{parametersWithDataTypeMap.appId.value}}","{{parametersWithDataTypeMap.apiKey.value}}"{{#hasRegionalHost}}{{#parametersWithDataTypeMap.region}},"{{parametersWithDataTypeMap.region.value}}"{{/parametersWithDataTypeMap.region}}{{/hasRegionalHost}}{{#useEchoRequester}},withEchoRequester(){{/useEchoRequester}}{{#hasCustomHosts}},withCustomHosts(Arrays.asList({{#customHosts}}new Host("true".equals(System.getenv("CI")) ? "localhost" : "host.docker.internal", EnumSet.of(CallType.READ, CallType.WRITE), "http", {{port}}){{^-last}},{{/-last}}{{/customHosts}}), {{gzipEncoding}}){{/hasCustomHosts}}); +{{^autoCreateClient}}{{client}} client = {{/autoCreateClient}}new {{client}}("{{parametersWithDataTypeMap.appId.value}}","{{parametersWithDataTypeMap.apiKey.value}}"{{#hasRegionalHost}}{{#parametersWithDataTypeMap.region}},"{{parametersWithDataTypeMap.region.value}}"{{/parametersWithDataTypeMap.region}}{{/hasRegionalHost}}{{#useEchoRequester}},withEchoRequester({{#hasCustomWriteTimeout}}{{writeTimeout}}{{/hasCustomWriteTimeout}}{{^hasCustomWriteTimeout}}null{{/hasCustomWriteTimeout}}){{/useEchoRequester}}{{#hasCustomHosts}},withCustomHosts(Arrays.asList({{#customHosts}}new Host("true".equals(System.getenv("CI")) ? "localhost" : "host.docker.internal", EnumSet.of(CallType.READ, CallType.WRITE), "http", {{port}}){{^-last}},{{/-last}}{{/customHosts}}), {{gzipEncoding}}){{/hasCustomHosts}}); {{#hasTransformationRegion}}client.setTransformationRegion("{{{transformationRegion}}}");{{/hasTransformationRegion}} \ No newline at end of file diff --git a/templates/javascript/tests/client/createClient.mustache b/templates/javascript/tests/client/createClient.mustache index 04537b1f96b..df1b5a4c623 100644 --- a/templates/javascript/tests/client/createClient.mustache +++ b/templates/javascript/tests/client/createClient.mustache @@ -19,6 +19,9 @@ {{/customHosts}} ], {{/hasCustomHosts}} + {{#hasCustomWriteTimeout}} + writeTimeout: {{writeTimeout}}, + {{/hasCustomWriteTimeout}} {{#hasTransformationRegion}} transformation: { region : "{{{transformationRegion}}}" }, {{/hasTransformationRegion}} @@ -41,7 +44,10 @@ }, {{/customHosts}} ] - {{/hasCustomHosts}} + {{/hasCustomHosts}} + {{#hasCustomWriteTimeout}} + writeTimeout: {{writeTimeout}}, + {{/hasCustomWriteTimeout}} }, {{#hasRegionalHost}} // @ts-ignore diff --git a/templates/kotlin/tests/client/createClient.mustache b/templates/kotlin/tests/client/createClient.mustache index 54eb24ca605..ddc5aa2a67c 100644 --- a/templates/kotlin/tests/client/createClient.mustache +++ b/templates/kotlin/tests/client/createClient.mustache @@ -1 +1 @@ -{{^autoCreateClient}}val client = {{/autoCreateClient}}{{client}}(appId = "{{parametersWithDataTypeMap.appId.value}}", apiKey = "{{parametersWithDataTypeMap.apiKey.value}}",{{#hasRegionalHost}}{{#parametersWithDataTypeMap.region}}"{{parametersWithDataTypeMap.region.value}}",{{/parametersWithDataTypeMap.region}}{{/hasRegionalHost}}{{#hasCustomHosts}}options = ClientOptions(hosts = listOf({{#customHosts}}Host(url = if (System.getenv("CI") == "true") "localhost" else "host.docker.internal", protocol = "http", port = {{port}}){{^-last}},{{/-last}}{{/customHosts}}){{#gzipEncoding}}, compressionType = CompressionType.GZIP{{/gzipEncoding}}){{/hasCustomHosts}}) \ No newline at end of file +{{^autoCreateClient}}val client = {{/autoCreateClient}}{{client}}(appId = "{{parametersWithDataTypeMap.appId.value}}", apiKey = "{{parametersWithDataTypeMap.apiKey.value}}",{{#hasRegionalHost}}{{#parametersWithDataTypeMap.region}}"{{parametersWithDataTypeMap.region.value}}",{{/parametersWithDataTypeMap.region}}{{/hasRegionalHost}}{{#hasCustomClientCreate}}options = ClientOptions({{#hasCustomHosts}}hosts = listOf({{#customHosts}}Host(url = if (System.getenv("CI") == "true") "localhost" else "host.docker.internal", protocol = "http", port = {{port}}){{^-last}},{{/-last}}{{/customHosts}}){{/hasCustomHosts}}{{#hasCustomWriteTimeout}} writeTimeout = {{writeTimeout}}{{/hasCustomWriteTimeout}}{{#gzipEncoding}}, compressionType = CompressionType.GZIP{{/gzipEncoding}}){{/hasCustomClientCreate}}) \ No newline at end of file diff --git a/templates/php/tests/client/createClient.mustache b/templates/php/tests/client/createClient.mustache index 54b508fbab0..74a379e94a7 100644 --- a/templates/php/tests/client/createClient.mustache +++ b/templates/php/tests/client/createClient.mustache @@ -4,9 +4,9 @@ $client = $this->createClient( {{#parametersWithDataTypeMap.apiKey}}"{{parametersWithDataTypeMap.apiKey.value}}"{{/parametersWithDataTypeMap.apiKey}}{{^parametersWithDataTypeMap.apiKey}}null{{/parametersWithDataTypeMap.apiKey}}{{#hasRegionalHost}}, {{#parametersWithDataTypeMap.region}}"{{parametersWithDataTypeMap.region.value}}"{{/parametersWithDataTypeMap.region}}{{^parametersWithDataTypeMap.region}}null{{/parametersWithDataTypeMap.region}}{{/hasRegionalHost}} ); -{{^isError}}$this->assertIsObject($client);{{/isError}}{{/useEchoRequester}}{{^hasTransformationRegion}}{{#hasCustomHosts}} -$client = {{client}}::createWithConfig({{clientPrefix}}Config::create("{{parametersWithDataTypeMap.appId.value}}","{{parametersWithDataTypeMap.apiKey.value}}"{{#hasRegionalHost}}{{#parametersWithDataTypeMap.region}},"{{parametersWithDataTypeMap.region.value}}"{{/parametersWithDataTypeMap.region}}{{/hasRegionalHost}})->setFullHosts([{{#customHosts}}"http://" . (getenv("CI") == "true" ? "localhost" : "host.docker.internal") . ":{{port}}"{{^-last}},{{/-last}}{{/customHosts}}])); -{{/hasCustomHosts}}{{/hasTransformationRegion}} +{{^isError}}$this->assertIsObject($client);{{/isError}}{{/useEchoRequester}}{{^hasTransformationRegion}}{{#hasCustomClientCreate}} +$client = {{client}}::createWithConfig({{clientPrefix}}Config::create("{{parametersWithDataTypeMap.appId.value}}","{{parametersWithDataTypeMap.apiKey.value}}"{{#hasRegionalHost}}{{#parametersWithDataTypeMap.region}},"{{parametersWithDataTypeMap.region.value}}"{{/parametersWithDataTypeMap.region}}{{/hasRegionalHost}}){{#hasCustomHosts}}->setFullHosts([{{#customHosts}}"http://" . (getenv("CI") == "true" ? "localhost" : "host.docker.internal") . ":{{port}}"{{^-last}},{{/-last}}{{/customHosts}}]){{/hasCustomHosts}}{{#hasCustomWriteTimeout}}->setWriteTimeout({{writeTimeout}}){{/hasCustomWriteTimeout}}); +{{/hasCustomClientCreate}}{{/hasTransformationRegion}} {{#hasTransformationRegion}} $client = {{client}}::createWithConfig({{clientPrefix}}Config::create("{{parametersWithDataTypeMap.appId.value}}","{{parametersWithDataTypeMap.apiKey.value}}")->setFullHosts([{{#customHosts}}"http://" . (getenv("CI") == "true" ? "localhost" : "host.docker.internal") . ":{{port}}"{{^-last}},{{/-last}}{{/customHosts}}])->setTransformationRegion("{{{transformationRegion}}}")); {{/hasTransformationRegion}} \ No newline at end of file diff --git a/templates/python/tests/client/createClient.mustache b/templates/python/tests/client/createClient.mustache index b6f08df43e4..65212a93744 100644 --- a/templates/python/tests/client/createClient.mustache +++ b/templates/python/tests/client/createClient.mustache @@ -2,6 +2,9 @@ _config = {{#lambda.pascalcase}}{{clientPrefix}}Config{{/lambda.pascalcase}}("{{ {{#hasCustomHosts}} {{#isError}} {{/isError}}_config.hosts = HostsCollection([{{#customHosts}}Host(url='localhost' if environ.get('CI') == 'true' else 'host.docker.internal', scheme='http', port={{port}}){{^-last}},{{/-last}}{{/customHosts}}]) {{/hasCustomHosts}} + {{#hasCustomWriteTimeout}} + {{#isError}} {{/isError}}_config.write_timeout = {{writeTimeout}} + {{/hasCustomWriteTimeout}} {{#hasTransformationRegion}} {{#isError}} {{/isError}}_config.set_transformation_region("{{{transformationRegion}}}") {{/hasTransformationRegion}} diff --git a/templates/ruby/tests/client/createClient.mustache b/templates/ruby/tests/client/createClient.mustache index 2fa4ab9a21a..fbed4ce3e9a 100644 --- a/templates/ruby/tests/client/createClient.mustache +++ b/templates/ruby/tests/client/createClient.mustache @@ -1,14 +1,17 @@ -{{#hasCustomHosts}} +{{#hasCustomClientCreate}} client = Algolia::{{#lambda.pascalcase}}{{{client}}}{{/lambda.pascalcase}}.create_with_config(Algolia::Configuration.new( '{{parametersWithDataTypeMap.appId.value}}', '{{parametersWithDataTypeMap.apiKey.value}}', + {{#hasCustomHosts}} [{{#customHosts}}Algolia::Transport::StatefulHost.new(ENV.fetch('CI', nil) == 'true' ? 'localhost' : 'host.docker.internal', protocol: 'http://', port: {{port}}, accept: CallType::READ | CallType::WRITE),{{/customHosts}}], + {{/hasCustomHosts}} '{{client}}'{{#gzipEncoding}}, compression_type: 'gzip'{{/gzipEncoding}} -)){{/hasCustomHosts}}{{^hasCustomHosts}} + {{#hasCustomWriteTimeout}},write_timeout: {{writeTimeout}}{{/hasCustomWriteTimeout}} +)){{/hasCustomClientCreate}}{{^hasCustomClientCreate}} {{^isError}}client = {{/isError}}Algolia::{{#lambda.pascalcase}}{{{client}}}{{/lambda.pascalcase}}.create( '{{parametersWithDataTypeMap.appId.value}}', '{{parametersWithDataTypeMap.apiKey.value}}', {{#hasRegionalHost}}{{#parametersWithDataTypeMap.region}}'{{parametersWithDataTypeMap.region.value}}',{{/parametersWithDataTypeMap.region}}{{/hasRegionalHost}} { requester: Algolia::Transport::EchoRequester.new } -){{/hasCustomHosts}} \ No newline at end of file +){{/hasCustomClientCreate}} \ No newline at end of file diff --git a/templates/scala/tests/client/createClient.mustache b/templates/scala/tests/client/createClient.mustache index c2667107ae5..e915009633b 100644 --- a/templates/scala/tests/client/createClient.mustache +++ b/templates/scala/tests/client/createClient.mustache @@ -1,13 +1,18 @@ {{#useEchoRequester}} -val (client, echo) = testClient(appId = "{{parametersWithDataTypeMap.appId.value}}", apiKey = "{{parametersWithDataTypeMap.apiKey.value}}"{{#hasRegionalHost}}{{#parametersWithDataTypeMap.region}}, region = "{{value}}"{{/parametersWithDataTypeMap.region}}{{/hasRegionalHost}}){{/useEchoRequester}}{{#hasCustomHosts}} +val (client, echo) = testClient(appId = "{{parametersWithDataTypeMap.appId.value}}", apiKey = "{{parametersWithDataTypeMap.apiKey.value}}"{{#hasRegionalHost}}{{#parametersWithDataTypeMap.region}}, region = "{{value}}"{{/parametersWithDataTypeMap.region}}{{/hasRegionalHost}}){{/useEchoRequester}}{{#hasCustomClientCreate}} val client = {{client}}( appId = "{{parametersWithDataTypeMap.appId.value}}", apiKey = "{{parametersWithDataTypeMap.apiKey.value}}", {{#hasRegionalHost}}{{#parametersWithDataTypeMap.region}} region = {{#fallbackToAliasHost}}Option({{/fallbackToAliasHost}}"{{value}}"{{#fallbackToAliasHost}}){{/fallbackToAliasHost}},{{/parametersWithDataTypeMap.region}}{{/hasRegionalHost}} clientOptions = ClientOptions .builder() + {{#hasCustomHosts}} .withHosts(List({{#customHosts}}Host(if (System.getenv("CI") == "true") "localhost" else "host.docker.internal", Set(CallType.Read, CallType.Write), "http", Option({{port}})){{^-last}},{{/-last}}{{/customHosts}})) + {{/hasCustomHosts}} {{#gzipEncoding}}.withCompressionType(CompressionType.Gzip){{/gzipEncoding}} + {{#hasCustomWriteTimeout}} + .withWriteTimeout({{writeTimeout}}) + {{/hasCustomWriteTimeout}} .build() ) -{{/hasCustomHosts}} \ No newline at end of file +{{/hasCustomClientCreate}} \ No newline at end of file diff --git a/templates/swift/tests/client/createClient.mustache b/templates/swift/tests/client/createClient.mustache index 8092d301eed..8335d8688ef 100644 --- a/templates/swift/tests/client/createClient.mustache +++ b/templates/swift/tests/client/createClient.mustache @@ -1,3 +1,3 @@ -let configuration = try {{client}}Configuration(appID: "{{parametersWithDataTypeMap.appId.value}}", apiKey: "{{parametersWithDataTypeMap.apiKey.value}}"{{#hasRegionalHost}}, region: {{#parametersWithDataTypeMap.region}}Region(rawValue: "{{parametersWithDataTypeMap.region.value}}"){{/parametersWithDataTypeMap.region}}{{^parametersWithDataTypeMap.region}}nil{{/parametersWithDataTypeMap.region}}{{/hasRegionalHost}}{{#hasCustomHosts}}, hosts: [{{#customHosts}}RetryableHost(url: URL(string: "http://" + (ProcessInfo.processInfo.environment["CI"] == "true" ? "localhost" : "host.docker.internal") + ":{{port}}")!){{^-last}}, {{/-last}}{{/customHosts}}]{{/hasCustomHosts}}{{#gzipEncoding}}, compression: .gzip{{/gzipEncoding}}) +let configuration = try {{client}}Configuration(appID: "{{parametersWithDataTypeMap.appId.value}}", apiKey: "{{parametersWithDataTypeMap.apiKey.value}}"{{#hasRegionalHost}}, region: {{#parametersWithDataTypeMap.region}}Region(rawValue: "{{parametersWithDataTypeMap.region.value}}"){{/parametersWithDataTypeMap.region}}{{^parametersWithDataTypeMap.region}}nil{{/parametersWithDataTypeMap.region}}{{/hasRegionalHost}}{{#hasCustomHosts}}, hosts: [{{#customHosts}}RetryableHost(url: URL(string: "http://" + (ProcessInfo.processInfo.environment["CI"] == "true" ? "localhost" : "host.docker.internal") + ":{{port}}")!){{^-last}}, {{/-last}}{{/customHosts}}]{{/hasCustomHosts}}{{#hasCustomWriteTimeout}}, writeTimeout: {{writeTimeout}}{{/hasCustomWriteTimeout}}{{#gzipEncoding}}, compression: .gzip{{/gzipEncoding}}) let transporter: Transporter = Transporter(configuration: configuration{{#useEchoRequester}}, requestBuilder: EchoRequestBuilder(){{/useEchoRequester}}) {{^autoCreateClient}}let client = {{/autoCreateClient}}{{client}}(configuration: configuration, transporter: transporter) \ No newline at end of file diff --git a/tests/CTS/client/ingestion/api.json b/tests/CTS/client/ingestion/api.json index b5c9f063cf7..b8efc883b9b 100644 --- a/tests/CTS/client/ingestion/api.json +++ b/tests/CTS/client/ingestion/api.json @@ -77,6 +77,38 @@ } ] }, + { + "testName": "calls api with custom write timeouts", + "autoCreateClient": false, + "steps": [ + { + "type": "createClient", + "parameters": { + "appId": "test-app-id", + "apiKey": "test-api-key", + "region": "us", + "writeTimeout": 3355 + } + }, + { + "type": "method", + "method": "validateSourceBeforeUpdate", + "parameters": { + "sourceID": "6c02aeb1-775e-418e-870b-1faccd4b2c0f", + "sourceUpdate": { + "name": "newName" + } + }, + "expected": { + "type": "timeouts", + "match": { + "connectTimeout": 180000, + "responseTimeout": 3355 + } + } + } + ] + }, { "testName": "can leave call opened for a long time", "autoCreateClient": false,