diff --git a/eng/code-quality-reports/src/main/resources/checkstyle/checkstyle-suppressions.xml b/eng/code-quality-reports/src/main/resources/checkstyle/checkstyle-suppressions.xml index eb9a2ca478d2b..725adce69d21f 100755 --- a/eng/code-quality-reports/src/main/resources/checkstyle/checkstyle-suppressions.xml +++ b/eng/code-quality-reports/src/main/resources/checkstyle/checkstyle-suppressions.xml @@ -124,7 +124,7 @@ the main ServiceBusClientBuilder. --> - + diff --git a/sdk/core/azure-core-http-jdk-httpclient/README.md b/sdk/core/azure-core-http-jdk-httpclient/README.md index 5281de6d78d1e..33c95070c0cac 100644 --- a/sdk/core/azure-core-http-jdk-httpclient/README.md +++ b/sdk/core/azure-core-http-jdk-httpclient/README.md @@ -35,13 +35,13 @@ The following sections provide several code snippets covering some of the most c Create a HttpClient. ```java readme-sample-createBasicClient -HttpClient client = new JdkAsyncHttpClientBuilder().build(); +HttpClient client = new JdkHttpClientBuilder().build(); ``` Create a HttpClient using a connection timeout of 60 seconds. ```java readme-sample-createClientWithConnectionTimeout -HttpClient client = new JdkAsyncHttpClientBuilder().connectionTimeout(Duration.ofSeconds(60)).build(); +HttpClient client = new JdkHttpClientBuilder().connectionTimeout(Duration.ofSeconds(60)).build(); ``` ### Create a Client with Proxy @@ -49,7 +49,7 @@ HttpClient client = new JdkAsyncHttpClientBuilder().connectionTimeout(Duration.o Create a HttpClient that is using a proxy. ```java readme-sample-createProxyClient -HttpClient client = new JdkAsyncHttpClientBuilder() +HttpClient client = new JdkHttpClientBuilder() .proxy(new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("", 8888))) .build(); ``` diff --git a/sdk/core/azure-core-http-jdk-httpclient/src/main/java/com/azure/core/http/jdk/httpclient/JdkAsyncHttpClientBuilder.java b/sdk/core/azure-core-http-jdk-httpclient/src/main/java/com/azure/core/http/jdk/httpclient/JdkHttpClientBuilder.java similarity index 86% rename from sdk/core/azure-core-http-jdk-httpclient/src/main/java/com/azure/core/http/jdk/httpclient/JdkAsyncHttpClientBuilder.java rename to sdk/core/azure-core-http-jdk-httpclient/src/main/java/com/azure/core/http/jdk/httpclient/JdkHttpClientBuilder.java index e78b0a880f1cd..0ec406a6c5a6a 100644 --- a/sdk/core/azure-core-http-jdk-httpclient/src/main/java/com/azure/core/http/jdk/httpclient/JdkAsyncHttpClientBuilder.java +++ b/sdk/core/azure-core-http-jdk-httpclient/src/main/java/com/azure/core/http/jdk/httpclient/JdkHttpClientBuilder.java @@ -28,7 +28,7 @@ * Builder to configure and build an instance of the azure-core {@link HttpClient} type using the JDK HttpClient APIs, * first introduced as preview in JDK 9, but made generally available from JDK 11 onwards. */ -public class JdkAsyncHttpClientBuilder { +public class JdkHttpClientBuilder { private static final Duration DEFAULT_CONNECT_TIMEOUT = Duration.ofSeconds(60); private static final String JAVA_HOME = System.getProperty("java.home"); @@ -55,7 +55,7 @@ public class JdkAsyncHttpClientBuilder { DEFAULT_RESTRICTED_HEADERS = Collections.unmodifiableSet(treeSet); } - private static final ClientLogger LOGGER = new ClientLogger(JdkAsyncHttpClientBuilder.class); + private static final ClientLogger LOGGER = new ClientLogger(JdkHttpClientBuilder.class); private java.net.http.HttpClient.Builder httpClientBuilder; private Duration connectionTimeout; @@ -64,18 +64,18 @@ public class JdkAsyncHttpClientBuilder { private Executor executor; /** - * Creates JdkAsyncHttpClientBuilder. + * Creates JdkHttpClientBuilder. */ - public JdkAsyncHttpClientBuilder() { + public JdkHttpClientBuilder() { } /** - * Creates JdkAsyncHttpClientBuilder from the builder of an existing {@link java.net.http.HttpClient.Builder}. + * Creates JdkHttpClientBuilder from the builder of an existing {@link java.net.http.HttpClient.Builder}. * * @param httpClientBuilder the HttpClient builder to use * @throws NullPointerException if {@code httpClientBuilder} is null */ - public JdkAsyncHttpClientBuilder(java.net.http.HttpClient.Builder httpClientBuilder) { + public JdkHttpClientBuilder(java.net.http.HttpClient.Builder httpClientBuilder) { this.httpClientBuilder = Objects.requireNonNull(httpClientBuilder, "'httpClientBuilder' cannot be null."); } @@ -86,10 +86,10 @@ public JdkAsyncHttpClientBuilder(java.net.http.HttpClient.Builder httpClientBuil * newly built {@code HttpClient}. * * @param executor the executor to be used for asynchronous and dependent tasks - * @return the updated JdkAsyncHttpClientBuilder object + * @return the updated JdkHttpClientBuilder object * @throws NullPointerException if {@code executor} is null */ - public JdkAsyncHttpClientBuilder executor(Executor executor) { + public JdkHttpClientBuilder executor(Executor executor) { this.executor = Objects.requireNonNull(executor, "executor can not be null"); return this; } @@ -99,20 +99,20 @@ public JdkAsyncHttpClientBuilder executor(Executor executor) { * *

Code Samples

* - * + * *
-     * HttpClient client = new JdkAsyncHttpClientBuilder()
+     * HttpClient client = new JdkHttpClientBuilder()
      *         .connectionTimeout(Duration.ofSeconds(250)) // connection timeout of 250 seconds
      *         .build();
      * 
- * + * * * The default connection timeout is 60 seconds. * * @param connectionTimeout the connection timeout - * @return the updated JdkAsyncHttpClientBuilder object + * @return the updated JdkHttpClientBuilder object */ - public JdkAsyncHttpClientBuilder connectionTimeout(Duration connectionTimeout) { + public JdkHttpClientBuilder connectionTimeout(Duration connectionTimeout) { // setConnectionTimeout can be null this.connectionTimeout = connectionTimeout; return this; @@ -123,22 +123,22 @@ public JdkAsyncHttpClientBuilder connectionTimeout(Duration connectionTimeout) { * *

Code Samples

* - * + * *
      * final String proxyHost = "<proxy-host>"; // e.g. localhost
      * final int proxyPort = 9999; // Proxy port
      * ProxyOptions proxyOptions = new ProxyOptions(ProxyOptions.Type.HTTP,
      *         new InetSocketAddress(proxyHost, proxyPort));
-     * HttpClient client = new JdkAsyncHttpClientBuilder()
+     * HttpClient client = new JdkHttpClientBuilder()
      *         .proxy(proxyOptions)
      *         .build();
      * 
- * + * * * @param proxyOptions The proxy configuration to use. - * @return the updated {@link JdkAsyncHttpClientBuilder} object + * @return the updated JdkHttpClientBuilder object */ - public JdkAsyncHttpClientBuilder proxy(ProxyOptions proxyOptions) { + public JdkHttpClientBuilder proxy(ProxyOptions proxyOptions) { // proxyOptions can be null this.proxyOptions = proxyOptions; return this; @@ -151,9 +151,9 @@ public JdkAsyncHttpClientBuilder proxy(ProxyOptions proxyOptions) { * configuration store}, use {@link Configuration#NONE} to bypass using configuration settings during construction. * * @param configuration The configuration store used to - * @return The updated JdkAsyncHttpClientBuilder object. + * @return The updated JdkHttpClientBuilder object. */ - public JdkAsyncHttpClientBuilder configuration(Configuration configuration) { + public JdkHttpClientBuilder configuration(Configuration configuration) { this.configuration = configuration; return this; } diff --git a/sdk/core/azure-core-http-jdk-httpclient/src/main/java/com/azure/core/http/jdk/httpclient/JdkHttpClientProvider.java b/sdk/core/azure-core-http-jdk-httpclient/src/main/java/com/azure/core/http/jdk/httpclient/JdkHttpClientProvider.java index 54f9e179e0294..1ed9e81fa688d 100644 --- a/sdk/core/azure-core-http-jdk-httpclient/src/main/java/com/azure/core/http/jdk/httpclient/JdkHttpClientProvider.java +++ b/sdk/core/azure-core-http-jdk-httpclient/src/main/java/com/azure/core/http/jdk/httpclient/JdkHttpClientProvider.java @@ -6,6 +6,7 @@ import com.azure.core.http.HttpClient; import com.azure.core.http.HttpClientProvider; import com.azure.core.util.Configuration; +import com.azure.core.util.HttpClientOptions; /** * An {@link HttpClientProvider} that provides an implementation of HttpClient based on native JDK HttpClient. @@ -20,7 +21,7 @@ public final class JdkHttpClientProvider implements HttpClientProvider { // Enum Singleton Pattern private enum GlobalJdkAsyncHttpClient { - HTTP_CLIENT(new JdkAsyncHttpClientBuilder().build()); + HTTP_CLIENT(new JdkHttpClientBuilder().build()); private final HttpClient httpClient; @@ -50,6 +51,20 @@ public HttpClient createInstance() { if (enableHttpClientSharing) { return GlobalJdkAsyncHttpClient.HTTP_CLIENT.getHttpClient(); } - return new JdkAsyncHttpClientBuilder().build(); + return new JdkHttpClientBuilder().build(); + } + + @Override + public HttpClient createInstance(HttpClientOptions clientOptions) { + if (clientOptions == null) { + return createInstance(); + } + + JdkHttpClientBuilder builder = new JdkHttpClientBuilder(); + builder = builder.proxy(clientOptions.getProxyOptions()) + .configuration(clientOptions.getConfiguration()) + .connectionTimeout(clientOptions.getConnectTimeout()); + + return builder.build(); } } diff --git a/sdk/core/azure-core-http-jdk-httpclient/src/samples/java/com/azure/core/http/jdk/httpclient/JdkAsyncHttpClientBuilderJavaDocCodeSnippets.java b/sdk/core/azure-core-http-jdk-httpclient/src/samples/java/com/azure/core/http/jdk/httpclient/JdkHttpClientBuilderJavaDocCodeSnippets.java similarity index 63% rename from sdk/core/azure-core-http-jdk-httpclient/src/samples/java/com/azure/core/http/jdk/httpclient/JdkAsyncHttpClientBuilderJavaDocCodeSnippets.java rename to sdk/core/azure-core-http-jdk-httpclient/src/samples/java/com/azure/core/http/jdk/httpclient/JdkHttpClientBuilderJavaDocCodeSnippets.java index 623c7b7fe468a..9de11811543d8 100644 --- a/sdk/core/azure-core-http-jdk-httpclient/src/samples/java/com/azure/core/http/jdk/httpclient/JdkAsyncHttpClientBuilderJavaDocCodeSnippets.java +++ b/sdk/core/azure-core-http-jdk-httpclient/src/samples/java/com/azure/core/http/jdk/httpclient/JdkHttpClientBuilderJavaDocCodeSnippets.java @@ -10,36 +10,36 @@ import java.time.Duration; /** - * Code snippets for {@link JdkAsyncHttpClientBuilder} + * Code snippets for {@link JdkHttpClientBuilder} */ -public class JdkAsyncHttpClientBuilderJavaDocCodeSnippets { +public class JdkHttpClientBuilderJavaDocCodeSnippets { /** * Code snippet for simple http client instantiation. */ public void simpleInstantiation() { // BEGIN: com.azure.core.http.jdk.httpclient.instantiation-simple - HttpClient client = new JdkAsyncHttpClientBuilder() + HttpClient client = new JdkHttpClientBuilder() .build(); // END: com.azure.core.http.jdk.httpclient.instantiation-simple } public void proxySample() { - // BEGIN: com.azure.core.http.jdk.httpclient.JdkAsyncHttpClientBuilder.proxy#ProxyOptions + // BEGIN: com.azure.core.http.jdk.httpclient.JdkHttpClientBuilder.proxy#ProxyOptions final String proxyHost = ""; // e.g. localhost final int proxyPort = 9999; // Proxy port ProxyOptions proxyOptions = new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort)); - HttpClient client = new JdkAsyncHttpClientBuilder() + HttpClient client = new JdkHttpClientBuilder() .proxy(proxyOptions) .build(); - // END: com.azure.core.http.jdk.httpclient.JdkAsyncHttpClientBuilder.proxy#ProxyOptions + // END: com.azure.core.http.jdk.httpclient.JdkHttpClientBuilder.proxy#ProxyOptions } public void proxyBasicAuthenticationSample() { - // BEGIN: com.azure.core.http.jdk.httpclient.JdkAsyncHttpClientBuilder#setProxyAuthenticator + // BEGIN: com.azure.core.http.jdk.httpclient.JdkHttpClientBuilder#setProxyAuthenticator final String proxyHost = ""; // e.g. localhost final int proxyPort = 9999; // Proxy port final String proxyUser = ""; @@ -48,20 +48,20 @@ public void proxyBasicAuthenticationSample() { ProxyOptions proxyOptions = new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort)); proxyOptions = proxyOptions.setCredentials(proxyUser, proxyPassword); - HttpClient client = new JdkAsyncHttpClientBuilder() + HttpClient client = new JdkHttpClientBuilder() .proxy(proxyOptions) .build(); - // END: com.azure.core.http.jdk.httpclient.JdkAsyncHttpClientBuilder#setProxyAuthenticator + // END: com.azure.core.http.jdk.httpclient.JdkHttpClientBuilder#setProxyAuthenticator } public void connectionTimeoutSample() { - // BEGIN: com.azure.core.http.jdk.httpclient.JdkAsyncHttpClientBuilder.connectionTimeout#Duration - HttpClient client = new JdkAsyncHttpClientBuilder() + // BEGIN: com.azure.core.http.jdk.httpclient.JdkHttpClientBuilder.connectionTimeout#Duration + HttpClient client = new JdkHttpClientBuilder() .connectionTimeout(Duration.ofSeconds(250)) // connection timeout of 250 seconds .build(); - // END: com.azure.core.http.jdk.httpclient.JdkAsyncHttpClientBuilder.connectionTimeout#Duration + // END: com.azure.core.http.jdk.httpclient.JdkHttpClientBuilder.connectionTimeout#Duration } } diff --git a/sdk/core/azure-core-http-jdk-httpclient/src/samples/java/com/azure/core/http/jdk/httpclient/ReadmeSamples.java b/sdk/core/azure-core-http-jdk-httpclient/src/samples/java/com/azure/core/http/jdk/httpclient/ReadmeSamples.java index b7c3982de4bb9..d3d4327417c07 100644 --- a/sdk/core/azure-core-http-jdk-httpclient/src/samples/java/com/azure/core/http/jdk/httpclient/ReadmeSamples.java +++ b/sdk/core/azure-core-http-jdk-httpclient/src/samples/java/com/azure/core/http/jdk/httpclient/ReadmeSamples.java @@ -22,7 +22,7 @@ public class ReadmeSamples { */ public void createBasicClient() { // BEGIN: readme-sample-createBasicClient - HttpClient client = new JdkAsyncHttpClientBuilder().build(); + HttpClient client = new JdkHttpClientBuilder().build(); // END: readme-sample-createBasicClient } @@ -31,7 +31,7 @@ public void createBasicClient() { */ public void createClientWithConnectionTimeout() { // BEGIN: readme-sample-createClientWithConnectionTimeout - HttpClient client = new JdkAsyncHttpClientBuilder().connectionTimeout(Duration.ofSeconds(60)).build(); + HttpClient client = new JdkHttpClientBuilder().connectionTimeout(Duration.ofSeconds(60)).build(); // END: readme-sample-createClientWithConnectionTimeout } @@ -40,7 +40,7 @@ public void createClientWithConnectionTimeout() { */ public void createProxyClient() { // BEGIN: readme-sample-createProxyClient - HttpClient client = new JdkAsyncHttpClientBuilder() + HttpClient client = new JdkHttpClientBuilder() .proxy(new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("", 8888))) .build(); // END: readme-sample-createProxyClient diff --git a/sdk/core/azure-core-http-jdk-httpclient/src/test/java/com/azure/core/http/jdk/httpclient/JdkHttpClientBuilderTests.java b/sdk/core/azure-core-http-jdk-httpclient/src/test/java/com/azure/core/http/jdk/httpclient/JdkHttpClientBuilderTests.java index 4400a3f73716c..ea815ebb60c78 100644 --- a/sdk/core/azure-core-http-jdk-httpclient/src/test/java/com/azure/core/http/jdk/httpclient/JdkHttpClientBuilderTests.java +++ b/sdk/core/azure-core-http-jdk-httpclient/src/test/java/com/azure/core/http/jdk/httpclient/JdkHttpClientBuilderTests.java @@ -43,7 +43,7 @@ import static org.mockito.Mockito.when; /** - * Tests {@link JdkAsyncHttpClientBuilder}. + * Tests {@link JdkHttpClientBuilder}. */ @DisabledForJreRange(max = JRE.JAVA_11) public class JdkHttpClientBuilderTests { @@ -70,8 +70,7 @@ public void execute(Runnable command) { } }); - final JdkHttpClient client = (JdkHttpClient) new JdkAsyncHttpClientBuilder(existingClientBuilder) - .build(); + final JdkHttpClient client = (JdkHttpClient) new JdkHttpClientBuilder(existingClientBuilder).build(); final String defaultPath = "/default"; final WireMockServer server @@ -93,12 +92,12 @@ public void execute(Runnable command) { } /** - * Tests that instantiating an {@link JdkAsyncHttpClientBuilder} with a {@code null} {@link JdkHttpClient} + * Tests that instantiating an {@link JdkHttpClientBuilder} with a {@code null} {@link JdkHttpClient} * will throw a {@link NullPointerException}. */ @Test public void startingWithNullClientThrows() { - assertThrows(NullPointerException.class, () -> new JdkAsyncHttpClientBuilder(null)); + assertThrows(NullPointerException.class, () -> new JdkHttpClientBuilder(null)); } /** @@ -107,7 +106,7 @@ public void startingWithNullClientThrows() { @Test public void buildWithExecutor() { final String[] marker = new String[1]; - final HttpClient httpClient = new JdkAsyncHttpClientBuilder() + final HttpClient httpClient = new JdkHttpClientBuilder() .executor(new Executor() { private final ExecutorService executorService = Executors.newFixedThreadPool(10); @Override @@ -143,7 +142,7 @@ public void execute(Runnable command) { */ @Test public void nullExecutorThrows() { - assertThrows(NullPointerException.class, () -> new JdkAsyncHttpClientBuilder().executor(null)); + assertThrows(NullPointerException.class, () -> new JdkHttpClientBuilder().executor(null)); } /** @@ -161,7 +160,7 @@ public void buildWithHttpProxy() { new InetSocketAddress(proxyEndpoint.getHost(), proxyEndpoint.getPort())) .setCredentials(PROXY_USERNAME, PROXY_PASSWORD); - HttpClient httpClient = new JdkAsyncHttpClientBuilder(java.net.http.HttpClient.newBuilder()) + HttpClient httpClient = new JdkHttpClientBuilder(java.net.http.HttpClient.newBuilder()) .proxy(clientProxyOptions) .build(); // Url of the service behind proxy @@ -215,7 +214,7 @@ public void buildWithHttpProxyFromExplicitConfiguration() { @Test public void buildWithConfigurationNone() { - final HttpClient httpClient = new JdkAsyncHttpClientBuilder() + final HttpClient httpClient = new JdkHttpClientBuilder() .configuration(Configuration.NONE) .build(); @@ -239,7 +238,7 @@ public void buildWithConfigurationNone() { @ParameterizedTest @MethodSource("buildWithExplicitConfigurationProxySupplier") public void buildWithNonProxyConfigurationProxy(Configuration configuration) { - final HttpClient httpClient = new JdkAsyncHttpClientBuilder() + final HttpClient httpClient = new JdkHttpClientBuilder() .configuration(configuration) .build(); @@ -283,16 +282,16 @@ private static Stream buildWithExplicitConfigurationProxySupplier() { @Test void testAllowedHeadersFromNetworkProperties() { - JdkAsyncHttpClientBuilder jdkAsyncHttpClientBuilder = spy(new JdkAsyncHttpClientBuilder()); + JdkHttpClientBuilder jdkHttpClientBuilder = spy(new JdkHttpClientBuilder()); Properties properties = new Properties(); properties.put("jdk.httpclient.allowRestrictedHeaders", "content-length, upgrade"); - when(jdkAsyncHttpClientBuilder.getNetworkProperties()).thenReturn(properties); + when(jdkHttpClientBuilder.getNetworkProperties()).thenReturn(properties); Set expectedRestrictedHeaders = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); - expectedRestrictedHeaders.addAll(JdkAsyncHttpClientBuilder.DEFAULT_RESTRICTED_HEADERS); + expectedRestrictedHeaders.addAll(com.azure.core.http.jdk.httpclient.JdkHttpClientBuilder.DEFAULT_RESTRICTED_HEADERS); expectedRestrictedHeaders.removeAll(Arrays.asList("content-length", "upgrade")); - validateRestrictedHeaders(jdkAsyncHttpClientBuilder, expectedRestrictedHeaders, 3); + validateRestrictedHeaders(jdkHttpClientBuilder, expectedRestrictedHeaders, 3); } @Test @@ -302,17 +301,17 @@ void testAllowedHeadersFromConfiguration() { EMPTY_SOURCE) .build(); - JdkAsyncHttpClientBuilder jdkAsyncHttpClientBuilder = spy( - new JdkAsyncHttpClientBuilder().configuration(configuration)); + JdkHttpClientBuilder jdkHttpClientBuilder = spy( + new JdkHttpClientBuilder().configuration(configuration)); Properties properties = new Properties(); - when(jdkAsyncHttpClientBuilder.getNetworkProperties()).thenReturn(properties); + when(jdkHttpClientBuilder.getNetworkProperties()).thenReturn(properties); Set expectedRestrictedHeaders = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); - expectedRestrictedHeaders.addAll(JdkAsyncHttpClientBuilder.DEFAULT_RESTRICTED_HEADERS); + expectedRestrictedHeaders.addAll(com.azure.core.http.jdk.httpclient.JdkHttpClientBuilder.DEFAULT_RESTRICTED_HEADERS); expectedRestrictedHeaders.removeAll(Arrays.asList("content-length", "upgrade")); - validateRestrictedHeaders(jdkAsyncHttpClientBuilder, expectedRestrictedHeaders, 3); + validateRestrictedHeaders(jdkHttpClientBuilder, expectedRestrictedHeaders, 3); } @Test @@ -322,18 +321,18 @@ void testAllowedHeadersFromBoth() { new TestConfigurationSource()) .build(); - JdkAsyncHttpClientBuilder jdkAsyncHttpClientBuilder = spy( - new JdkAsyncHttpClientBuilder().configuration(configuration)); + JdkHttpClientBuilder jdkHttpClientBuilder = spy( + new JdkHttpClientBuilder().configuration(configuration)); Properties properties = new Properties(); properties.put("jdk.httpclient.allowRestrictedHeaders", "host, connection, upgrade"); - when(jdkAsyncHttpClientBuilder.getNetworkProperties()).thenReturn(properties); + when(jdkHttpClientBuilder.getNetworkProperties()).thenReturn(properties); Set expectedRestrictedHeaders = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); - expectedRestrictedHeaders.addAll(JdkAsyncHttpClientBuilder.DEFAULT_RESTRICTED_HEADERS); + expectedRestrictedHeaders.addAll(com.azure.core.http.jdk.httpclient.JdkHttpClientBuilder.DEFAULT_RESTRICTED_HEADERS); expectedRestrictedHeaders.removeAll(Arrays.asList("content-length", "host", "connection", "upgrade")); - validateRestrictedHeaders(jdkAsyncHttpClientBuilder, expectedRestrictedHeaders, 1); + validateRestrictedHeaders(jdkHttpClientBuilder, expectedRestrictedHeaders, 1); } @Test @@ -341,14 +340,14 @@ void testAllowedHeadersFromSystemProperties() { Properties properties = new Properties(); properties.setProperty("jdk.httpclient.allowRestrictedHeaders", "content-length, upgrade"); - JdkAsyncHttpClientBuilder jdkAsyncHttpClientBuilder = spy(new JdkAsyncHttpClientBuilder()); - when(jdkAsyncHttpClientBuilder.getNetworkProperties()).thenReturn(properties); + JdkHttpClientBuilder jdkHttpClientBuilder = spy(new JdkHttpClientBuilder()); + when(jdkHttpClientBuilder.getNetworkProperties()).thenReturn(properties); Set expectedRestrictedHeaders = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); - expectedRestrictedHeaders.addAll(JdkAsyncHttpClientBuilder.DEFAULT_RESTRICTED_HEADERS); + expectedRestrictedHeaders.addAll(com.azure.core.http.jdk.httpclient.JdkHttpClientBuilder.DEFAULT_RESTRICTED_HEADERS); expectedRestrictedHeaders.removeAll(Arrays.asList("content-length", "upgrade")); - validateRestrictedHeaders(jdkAsyncHttpClientBuilder, expectedRestrictedHeaders, 3); + validateRestrictedHeaders(jdkHttpClientBuilder, expectedRestrictedHeaders, 3); } @Test @@ -356,10 +355,10 @@ void testCaseInsensitivity() { Properties properties = new Properties(); properties.setProperty("jdk.httpclient.allowRestrictedHeaders", "content-LENGTH"); - JdkAsyncHttpClientBuilder jdkAsyncHttpClientBuilder = spy(new JdkAsyncHttpClientBuilder()); - when(jdkAsyncHttpClientBuilder.getNetworkProperties()).thenReturn(properties); + JdkHttpClientBuilder jdkHttpClientBuilder = spy(new JdkHttpClientBuilder()); + when(jdkHttpClientBuilder.getNetworkProperties()).thenReturn(properties); - Set restrictedHeaders = jdkAsyncHttpClientBuilder.getRestrictedHeaders(); + Set restrictedHeaders = jdkHttpClientBuilder.getRestrictedHeaders(); assertTrue(restrictedHeaders.contains("Connection"), "connection header is missing"); assertTrue(restrictedHeaders.contains("connection"), "connection header is missing"); assertTrue(restrictedHeaders.contains("CONNECTION"), "connection header is missing"); @@ -371,7 +370,7 @@ void testCaseInsensitivity() { private static void configurationProxyTest(Configuration configuration) { - HttpClient httpClient = new JdkAsyncHttpClientBuilder(java.net.http.HttpClient.newBuilder()) + HttpClient httpClient = new JdkHttpClientBuilder(java.net.http.HttpClient.newBuilder()) .configuration(configuration) .build(); // Url of the service behind proxy @@ -381,9 +380,9 @@ private static void configurationProxyTest(Configuration configuration) { .verifyComplete(); } - private void validateRestrictedHeaders(JdkAsyncHttpClientBuilder jdkAsyncHttpClientBuilder, + private void validateRestrictedHeaders(JdkHttpClientBuilder jdkHttpClientBuilder, Set expectedRestrictedHeaders, int expectedRestrictedHeadersSize) { - Set restrictedHeaders = jdkAsyncHttpClientBuilder.getRestrictedHeaders(); + Set restrictedHeaders = jdkHttpClientBuilder.getRestrictedHeaders(); assertEquals(expectedRestrictedHeadersSize, restrictedHeaders.size()); assertEquals(expectedRestrictedHeaders, restrictedHeaders); } diff --git a/sdk/core/azure-core-http-jdk-httpclient/src/test/java/com/azure/core/http/jdk/httpclient/JdkHttpClientTests.java b/sdk/core/azure-core-http-jdk-httpclient/src/test/java/com/azure/core/http/jdk/httpclient/JdkHttpClientTests.java index 9fc5a3845f576..8c9b0506b55b4 100644 --- a/sdk/core/azure-core-http-jdk-httpclient/src/test/java/com/azure/core/http/jdk/httpclient/JdkHttpClientTests.java +++ b/sdk/core/azure-core-http-jdk-httpclient/src/test/java/com/azure/core/http/jdk/httpclient/JdkHttpClientTests.java @@ -110,15 +110,15 @@ public void testResponseLongBodyAsByteArraySync() throws IOException { } @Test - public void testBufferResponseSync() throws IOException { - HttpClient client = new JdkAsyncHttpClientBuilder().build(); + public void testBufferResponseSync() { + HttpClient client = new JdkHttpClientBuilder().build(); HttpResponse response = doRequestSync(client, "/long").buffer(); Assertions.assertArrayEquals(LONG_BODY, response.getBodyAsBinaryData().toBytes()); } @Test public void testBufferedResponseSync() { - HttpClient client = new JdkAsyncHttpClientBuilder().build(); + HttpClient client = new JdkHttpClientBuilder().build(); HttpRequest request = new HttpRequest(HttpMethod.GET, url(server, "/long")); HttpResponse response = client.sendSync(request, new Context("azure-eagerly-read-response", true)); Assertions.assertArrayEquals(LONG_BODY, response.getBodyAsBinaryData().toBytes()); @@ -146,7 +146,7 @@ public void testMultipleSubscriptionsEmitsError() { @Test public void testMultipleGetBodyBytesSync() { - HttpClient client = new JdkAsyncHttpClientBuilder().build(); + HttpClient client = new JdkHttpClientBuilder().build(); HttpResponse response = doRequestSync(client, "/short"); Mono responseBody = response.getBodyAsByteArray(); @@ -168,7 +168,7 @@ public void testMultipleGetBodyBytesSync() { @Test @Timeout(20) public void testMultipleGetBinaryDataSync() { - HttpClient client = new JdkAsyncHttpClientBuilder().build(); + HttpClient client = new JdkHttpClientBuilder().build(); HttpResponse response = doRequestSync(client, "/short"); Assertions.assertArrayEquals(SHORT_BODY, response.getBodyAsBinaryData().toBytes()); @@ -190,7 +190,7 @@ public void testFlowableWhenServerReturnsBodyAndNoErrorsWhenHttp500Returned() { @Test @Timeout(20) public void testFlowableWhenServerReturnsBodyAndNoErrorsWhenHttp500ReturnedSync() { - HttpClient client = new JdkAsyncHttpClientBuilder().build(); + HttpClient client = new JdkHttpClientBuilder().build(); HttpResponse response = doRequestSync(client, "/error"); assertEquals(500, response.getStatusCode()); assertEquals("error", response.getBodyAsString().block()); @@ -364,7 +364,7 @@ public void testRequestBodyEndsInErrorShouldPropagateToResponseSync() { @Test public void testServerShutsDownSocketShouldPushErrorToContentFlowable() { - HttpClient client = new JdkAsyncHttpClientBuilder().build(); + HttpClient client = new JdkHttpClientBuilder().build(); HttpRequest request = new HttpRequest(HttpMethod.GET, url(server, "/connectionClose")); @@ -374,7 +374,7 @@ public void testServerShutsDownSocketShouldPushErrorToContentFlowable() { @Test public void testServerShutsDownSocketShouldPushErrorToContentSync() { - HttpClient client = new JdkAsyncHttpClientBuilder().build(); + HttpClient client = new JdkHttpClientBuilder().build(); HttpRequest request = new HttpRequest(HttpMethod.GET, url(server, "/connectionClose")); assertThrows(UncheckedIOException.class, () -> client.sendSync(request, Context.NONE)); @@ -425,7 +425,7 @@ public void testConcurrentRequestsSync() { } private Mono getResponse(String path) { - HttpClient client = new JdkAsyncHttpClientBuilder().build(); + HttpClient client = new JdkHttpClientBuilder().build(); return doRequest(client, path); } @@ -449,14 +449,14 @@ private static byte[] createLongBody() { } private void checkBodyReceived(byte[] expectedBody, String path) { - HttpClient client = new JdkAsyncHttpClientBuilder().build(); + HttpClient client = new JdkHttpClientBuilder().build(); StepVerifier.create(doRequest(client, path).flatMap(HttpResponse::getBodyAsByteArray)) .assertNext(bytes -> Assertions.assertArrayEquals(expectedBody, bytes)) .verifyComplete(); } private void checkBodyReceivedSync(byte[] expectedBody, String path) throws IOException { - HttpClient client = new JdkAsyncHttpClientBuilder().build(); + HttpClient client = new JdkHttpClientBuilder().build(); HttpResponse response = doRequestSync(client, path); ByteArrayOutputStream outStream = new ByteArrayOutputStream(); WritableByteChannel body = Channels.newChannel(outStream); diff --git a/sdk/core/azure-core-http-jdk-httpclient/src/test/java/com/azure/core/http/jdk/httpclient/RestProxyWithHttpProxyJdkHttpClientTests.java b/sdk/core/azure-core-http-jdk-httpclient/src/test/java/com/azure/core/http/jdk/httpclient/RestProxyWithHttpProxyJdkHttpClientTests.java index bc416b32ad68d..1473d5d2ddc19 100644 --- a/sdk/core/azure-core-http-jdk-httpclient/src/test/java/com/azure/core/http/jdk/httpclient/RestProxyWithHttpProxyJdkHttpClientTests.java +++ b/sdk/core/azure-core-http-jdk-httpclient/src/test/java/com/azure/core/http/jdk/httpclient/RestProxyWithHttpProxyJdkHttpClientTests.java @@ -25,7 +25,7 @@ public static void getWireMockServer() { } @AfterAll - public static void shutJdkAsyncHttpClientBuilderdownWireMockServer() { + public static void shutJdkHttpClientBuilderDownWireMockServer() { if (server != null) { server.shutdown(); } @@ -39,6 +39,6 @@ protected int getWireMockPort() { @Override protected HttpClient createHttpClient() { InetSocketAddress address = new InetSocketAddress("localhost", 8888); - return new JdkAsyncHttpClientBuilder().proxy(new ProxyOptions(ProxyOptions.Type.HTTP, address)).build(); + return new JdkHttpClientBuilder().proxy(new ProxyOptions(ProxyOptions.Type.HTTP, address)).build(); } } diff --git a/sdk/core/azure-core-http-jdk-httpclient/src/test/java/com/azure/core/http/jdk/httpclient/RestProxyWithJdkHttpClientTests.java b/sdk/core/azure-core-http-jdk-httpclient/src/test/java/com/azure/core/http/jdk/httpclient/RestProxyWithJdkHttpClientTests.java index 61af11412ff0a..e28ce37a2cc29 100644 --- a/sdk/core/azure-core-http-jdk-httpclient/src/test/java/com/azure/core/http/jdk/httpclient/RestProxyWithJdkHttpClientTests.java +++ b/sdk/core/azure-core-http-jdk-httpclient/src/test/java/com/azure/core/http/jdk/httpclient/RestProxyWithJdkHttpClientTests.java @@ -36,6 +36,6 @@ protected int getWireMockPort() { @Override protected HttpClient createHttpClient() { - return new JdkAsyncHttpClientBuilder().build(); + return new JdkHttpClientBuilder().build(); } } diff --git a/sdk/core/azure-core-http-netty/CHANGELOG.md b/sdk/core/azure-core-http-netty/CHANGELOG.md index 8009abd04e9ef..2a70a2286fb2a 100644 --- a/sdk/core/azure-core-http-netty/CHANGELOG.md +++ b/sdk/core/azure-core-http-netty/CHANGELOG.md @@ -8,6 +8,8 @@ ### Bugs Fixed +- Fixed a bug where `HttpClientOptions.connectTimeout` wasn't being passed when using `HttpClientProvider(ClientOptions)`. ([#31079](https://github.com/Azure/azure-sdk-for-java/pull/31079)) + ### Other Changes ## 1.12.5 (2022-09-01) diff --git a/sdk/core/azure-core-http-netty/src/main/java/com/azure/core/http/netty/NettyAsyncHttpClientProvider.java b/sdk/core/azure-core-http-netty/src/main/java/com/azure/core/http/netty/NettyAsyncHttpClientProvider.java index 33fb181fc1c5d..fa76e471160bd 100644 --- a/sdk/core/azure-core-http-netty/src/main/java/com/azure/core/http/netty/NettyAsyncHttpClientProvider.java +++ b/sdk/core/azure-core-http-netty/src/main/java/com/azure/core/http/netty/NettyAsyncHttpClientProvider.java @@ -17,6 +17,7 @@ public final class NettyAsyncHttpClientProvider implements HttpClientProvider { Configuration.getGlobalConfiguration().get("AZURE_ENABLE_HTTP_CLIENT_SHARING", Boolean.FALSE); private final boolean enableHttpClientSharing; private static final int DEFAULT_MAX_CONNECTIONS = 500; + // Enum Singleton Pattern private enum GlobalNettyHttpClient { HTTP_CLIENT(new NettyAsyncHttpClientBuilder().build()); @@ -33,8 +34,8 @@ private HttpClient getHttpClient() { } /** - * For testing purpose only, assigning 'AZURE_ENABLE_HTTP_CLIENT_SHARING' to 'enableHttpClientSharing' for - * 'final' modifier. + * For testing purpose only, assigning 'AZURE_ENABLE_HTTP_CLIENT_SHARING' to 'enableHttpClientSharing' for 'final' + * modifier. */ public NettyAsyncHttpClientProvider() { enableHttpClientSharing = AZURE_ENABLE_HTTP_CLIENT_SHARING; @@ -60,10 +61,11 @@ public HttpClient createInstance(HttpClientOptions clientOptions) { NettyAsyncHttpClientBuilder builder = new NettyAsyncHttpClientBuilder(); builder = builder.proxy(clientOptions.getProxyOptions()) - .configuration(clientOptions.getConfiguration()) - .writeTimeout(clientOptions.getWriteTimeout()) - .responseTimeout(clientOptions.getResponseTimeout()) - .readTimeout(clientOptions.getReadTimeout()); + .configuration(clientOptions.getConfiguration()) + .connectTimeout(clientOptions.getConnectTimeout()) + .writeTimeout(clientOptions.getWriteTimeout()) + .responseTimeout(clientOptions.getResponseTimeout()) + .readTimeout(clientOptions.getReadTimeout()); ConnectionProvider.Builder connectionProviderBuilder = ConnectionProvider.builder("azure-sdk"); connectionProviderBuilder.maxIdleTime(clientOptions.getConnectionIdleTimeout()); @@ -83,7 +85,7 @@ public HttpClient createInstance(HttpClientOptions clientOptions) { // applications run and can lead to issues like this - https://github.com/Azure/azure-sdk-for-java/issues/26027 // So, we need to unfortunately hardcode the maxConnections to 500 (when user doesn't set it) to have - // consistent configuration whether or not HttpClientOptions is set. + // consistent configuration whether HttpClientOptions is set. connectionProviderBuilder.maxConnections(DEFAULT_MAX_CONNECTIONS); } diff --git a/sdk/core/azure-core-http-netty/src/test/java/com/azure/core/http/netty/NettyAsyncHttpClientProviderTests.java b/sdk/core/azure-core-http-netty/src/test/java/com/azure/core/http/netty/NettyAsyncHttpClientProviderTests.java index 5b8fb4791e328..2643588a6af05 100644 --- a/sdk/core/azure-core-http-netty/src/test/java/com/azure/core/http/netty/NettyAsyncHttpClientProviderTests.java +++ b/sdk/core/azure-core-http-netty/src/test/java/com/azure/core/http/netty/NettyAsyncHttpClientProviderTests.java @@ -6,6 +6,7 @@ import com.azure.core.http.ProxyOptions; import com.azure.core.util.Configuration; import com.azure.core.util.HttpClientOptions; +import io.netty.channel.ChannelOption; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import reactor.netty.transport.ProxyProvider; @@ -72,6 +73,7 @@ public void optionsWithTimeouts() { long expectedTimeout = 15000; Duration timeout = Duration.ofMillis(expectedTimeout); HttpClientOptions clientOptions = new HttpClientOptions() + .setConnectTimeout(timeout) .setWriteTimeout(timeout) .setResponseTimeout(timeout) .setReadTimeout(timeout); @@ -79,6 +81,9 @@ public void optionsWithTimeouts() { NettyAsyncHttpClient httpClient = (NettyAsyncHttpClient) new NettyAsyncHttpClientProvider() .createInstance(clientOptions); + Integer connectTimeout = (Integer) httpClient.nettyClient.configuration().options() + .get(ChannelOption.CONNECT_TIMEOUT_MILLIS); + assertEquals((int) expectedTimeout, connectTimeout.intValue()); assertEquals(expectedTimeout, httpClient.writeTimeout); assertEquals(expectedTimeout, httpClient.responseTimeout); assertEquals(expectedTimeout, httpClient.readTimeout); diff --git a/sdk/core/azure-core-http-okhttp/CHANGELOG.md b/sdk/core/azure-core-http-okhttp/CHANGELOG.md index 67a2de9e4c2ed..ef729a1b0d3a3 100644 --- a/sdk/core/azure-core-http-okhttp/CHANGELOG.md +++ b/sdk/core/azure-core-http-okhttp/CHANGELOG.md @@ -8,6 +8,8 @@ ### Bugs Fixed +- Fixed a bug where `HttpClientOptions.connectTimeout` wasn't being passed when using `HttpClientProvider(ClientOptions)`. ([#31079](https://github.com/Azure/azure-sdk-for-java/pull/31079)) + ### Other Changes ## 1.11.2 (2022-09-01) diff --git a/sdk/core/azure-core-http-okhttp/src/main/java/com/azure/core/http/okhttp/OkHttpAsyncClientProvider.java b/sdk/core/azure-core-http-okhttp/src/main/java/com/azure/core/http/okhttp/OkHttpAsyncClientProvider.java index 099ff2e986302..e166cbc73c92a 100644 --- a/sdk/core/azure-core-http-okhttp/src/main/java/com/azure/core/http/okhttp/OkHttpAsyncClientProvider.java +++ b/sdk/core/azure-core-http-okhttp/src/main/java/com/azure/core/http/okhttp/OkHttpAsyncClientProvider.java @@ -35,8 +35,8 @@ private HttpClient getHttpClient() { } /** - * For testing purpose only, assigning 'AZURE_ENABLE_HTTP_CLIENT_SHARING' to 'enableHttpClientSharing' for - * 'final' modifier. + * For testing purpose only, assigning 'AZURE_ENABLE_HTTP_CLIENT_SHARING' to 'enableHttpClientSharing' for 'final' + * modifier. */ public OkHttpAsyncClientProvider() { enableHttpClientSharing = AZURE_ENABLE_HTTP_CLIENT_SHARING; @@ -62,9 +62,10 @@ public HttpClient createInstance(HttpClientOptions clientOptions) { OkHttpAsyncHttpClientBuilder builder = new OkHttpAsyncHttpClientBuilder(); builder = builder.proxy(clientOptions.getProxyOptions()) - .configuration(clientOptions.getConfiguration()) - .writeTimeout(clientOptions.getWriteTimeout()) - .readTimeout(clientOptions.getReadTimeout()); + .configuration(clientOptions.getConfiguration()) + .connectionTimeout(clientOptions.getConnectTimeout()) + .writeTimeout(clientOptions.getWriteTimeout()) + .readTimeout(clientOptions.getReadTimeout()); Integer poolSize = clientOptions.getMaximumConnectionPoolSize(); int maximumConnectionPoolSize = (poolSize != null && poolSize > 0) diff --git a/sdk/core/azure-core-http-okhttp/src/test/java/com/azure/core/http/okhttp/OkHttpAsyncClientProviderTests.java b/sdk/core/azure-core-http-okhttp/src/test/java/com/azure/core/http/okhttp/OkHttpAsyncClientProviderTests.java index e7ca8bf61dfa0..d5bee72ee1d7a 100644 --- a/sdk/core/azure-core-http-okhttp/src/test/java/com/azure/core/http/okhttp/OkHttpAsyncClientProviderTests.java +++ b/sdk/core/azure-core-http-okhttp/src/test/java/com/azure/core/http/okhttp/OkHttpAsyncClientProviderTests.java @@ -71,6 +71,7 @@ public void optionsWithTimeouts() { long expectedTimeout = 15000; Duration timeout = Duration.ofMillis(expectedTimeout); HttpClientOptions clientOptions = new HttpClientOptions() + .setConnectTimeout(timeout) .setWriteTimeout(timeout) .setResponseTimeout(timeout) .setReadTimeout(timeout); @@ -78,6 +79,7 @@ public void optionsWithTimeouts() { OkHttpAsyncHttpClient httpClient = (OkHttpAsyncHttpClient) new OkHttpAsyncClientProvider() .createInstance(clientOptions); + assertEquals(expectedTimeout, httpClient.httpClient.connectTimeoutMillis()); assertEquals(expectedTimeout, httpClient.httpClient.writeTimeoutMillis()); assertEquals(expectedTimeout, httpClient.httpClient.readTimeoutMillis()); } diff --git a/sdk/core/azure-core-http-vertx/src/main/java/com/azure/core/http/vertx/VertxAsyncHttpClientProvider.java b/sdk/core/azure-core-http-vertx/src/main/java/com/azure/core/http/vertx/VertxAsyncHttpClientProvider.java index b4c44c394d61e..047950c11826b 100644 --- a/sdk/core/azure-core-http-vertx/src/main/java/com/azure/core/http/vertx/VertxAsyncHttpClientProvider.java +++ b/sdk/core/azure-core-http-vertx/src/main/java/com/azure/core/http/vertx/VertxAsyncHttpClientProvider.java @@ -32,8 +32,8 @@ private HttpClient getHttpClient() { } /** - * For testing purpose only, assigning 'AZURE_ENABLE_HTTP_CLIENT_SHARING' to 'enableHttpClientSharing' for - * 'final' modifier. + * For testing purpose only, assigning 'AZURE_ENABLE_HTTP_CLIENT_SHARING' to 'enableHttpClientSharing' for 'final' + * modifier. */ public VertxAsyncHttpClientProvider() { enableHttpClientSharing = AZURE_ENABLE_HTTP_CLIENT_SHARING;