This is an automated email from the ASF dual-hosted git repository. jamesnetherton pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
The following commit(s) were added to refs/heads/main by this push: new 465d146334 Use official azure-core-http-vertx client in Azure extensions 465d146334 is described below commit 465d1463344ba122d00855b11d72e501480b2cac Author: James Netherton <jamesnether...@gmail.com> AuthorDate: Fri Oct 21 14:01:16 2022 +0100 Use official azure-core-http-vertx client in Azure extensions Fixes #4180 --- .../deployment/pom.xml | 59 --- .../vertx/AzureCoreHttpClientVertxProcessor.java | 7 +- .../azure/core/http/vertx/DeadlockTests.java | 92 ---- .../http/vertx/SimpleBasicAuthHttpProxyServer.java | 132 ------ .../http/vertx/VertxAsyncClientTestHelper.java | 47 --- .../VertxAsyncHttpClientAsyncHttpClientTests.java | 70 ---- .../vertx/VertxAsyncHttpClientBuilderTests.java | 464 --------------------- .../vertx/VertxAsyncHttpClientProviderTests.java | 213 ---------- .../VertxAsyncHttpClientResponseTransformer.java | 56 --- .../vertx/VertxAsyncHttpClientRestProxyTests.java | 145 ------- ...HttpClientRestProxyWithAsyncHttpProxyTests.java | 192 --------- .../vertx/VertxAsyncHttpClientSingletonTests.java | 83 ---- .../core/http/vertx/VertxAsyncHttpClientTests.java | 371 ---------------- .../http/vertx/VertxHttpClientTestResource.java | 73 ---- .../deployment/src/test/resources/upload.txt | 1 - .../azure-core-http-client-vertx/runtime/pom.xml | 4 + .../core/http/vertx/QuarkusVertxProvider.java | 1 + .../core/http/vertx/VertxAsyncHttpClient.java | 139 ------ .../http/vertx/VertxAsyncHttpClientBuilder.java | 288 ------------- .../http/vertx/VertxAsyncHttpClientProvider.java | 82 ---- .../azure/core/http/vertx/VertxProvider.java | 34 -- .../implementation/BufferedVertxHttpResponse.java | 66 --- .../implementation/VertxHttpAsyncResponse.java | 61 --- .../implementation/VertxHttpResponseBase.java | 74 ---- .../com.azure.core.http.HttpClientProvider | 1 - ...der => com.azure.core.http.vertx.VertxProvider} | 0 .../src/main/resources/application.properties | 2 +- pom.xml | 1 + poms/bom/pom.xml | 6 + poms/bom/src/main/generated/flattened-full-pom.xml | 5 + .../src/main/generated/flattened-reduced-pom.xml | 5 + .../generated/flattened-reduced-verbose-pom.xml | 5 + 32 files changed, 32 insertions(+), 2747 deletions(-) diff --git a/extensions-support/azure-core-http-client-vertx/deployment/pom.xml b/extensions-support/azure-core-http-client-vertx/deployment/pom.xml index d9b245b462..cf20d1f738 100644 --- a/extensions-support/azure-core-http-client-vertx/deployment/pom.xml +++ b/extensions-support/azure-core-http-client-vertx/deployment/pom.xml @@ -58,65 +58,6 @@ <groupId>org.apache.camel.quarkus</groupId> <artifactId>camel-quarkus-support-azure-core-http-client-vertx</artifactId> </dependency> - - - <dependency> - <groupId>io.quarkus</groupId> - <artifactId>quarkus-junit5-internal</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.testcontainers</groupId> - <artifactId>testcontainers</artifactId> - <scope>test</scope> - <exclusions> - <exclusion> - <groupId>junit</groupId> - <artifactId>junit</artifactId> - </exclusion> - </exclusions> - </dependency> - <dependency> - <groupId>io.quarkus</groupId> - <artifactId>quarkus-junit4-mock</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.apache.camel.quarkus</groupId> - <artifactId>camel-quarkus-integration-wiremock-support</artifactId> - <scope>test</scope> - <exclusions> - <exclusion> - <groupId>org.hamcrest</groupId> - <artifactId>hamcrest-core</artifactId> - </exclusion> - </exclusions> - </dependency> - - - <!-- Azure core test support --> - <dependency> - <groupId>com.azure</groupId> - <artifactId>azure-core</artifactId> - <type>test-jar</type> - <scope>test</scope> - </dependency> - <dependency> - <groupId>com.azure</groupId> - <artifactId>azure-core-test</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>com.azure</groupId> - <artifactId>azure-core-test</artifactId> - <type>test-jar</type> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.mockito</groupId> - <artifactId>mockito-inline</artifactId> - <scope>test</scope> - </dependency> </dependencies> <build> diff --git a/extensions-support/azure-core-http-client-vertx/deployment/src/main/java/org/apache/camel/quarkus/support/azure/core/http/vertx/AzureCoreHttpClientVertxProcessor.java b/extensions-support/azure-core-http-client-vertx/deployment/src/main/java/org/apache/camel/quarkus/support/azure/core/http/vertx/AzureCoreHttpClientVertxProcessor.java index 45af42f898..15289f55c9 100644 --- a/extensions-support/azure-core-http-client-vertx/deployment/src/main/java/org/apache/camel/quarkus/support/azure/core/http/vertx/AzureCoreHttpClientVertxProcessor.java +++ b/extensions-support/azure-core-http-client-vertx/deployment/src/main/java/org/apache/camel/quarkus/support/azure/core/http/vertx/AzureCoreHttpClientVertxProcessor.java @@ -16,7 +16,7 @@ */ package org.apache.camel.quarkus.support.azure.core.http.vertx; -import com.azure.core.http.HttpClientProvider; +import com.azure.core.http.vertx.VertxProvider; import io.netty.handler.ssl.OpenSsl; import io.quarkus.deployment.annotations.BuildProducer; import io.quarkus.deployment.annotations.BuildStep; @@ -30,12 +30,13 @@ public class AzureCoreHttpClientVertxProcessor { runtimeInitializedClasses.produce(new RuntimeInitializedClassBuildItem(OpenSsl.class.getName())); runtimeInitializedClasses.produce(new RuntimeInitializedClassBuildItem("io.netty.internal.tcnative.SSL")); runtimeInitializedClasses.produce(new RuntimeInitializedClassBuildItem( - "org.apache.camel.quarkus.support.azure.core.http.vertx.VertxAsyncHttpClientProvider$GlobalVertxHttpClient")); + "com.azure.core.http.vertx.VertxAsyncHttpClientProvider$GlobalVertxHttpClient")); + runtimeInitializedClasses.produce( + new RuntimeInitializedClassBuildItem("com.azure.core.http.vertx.VertxAsyncHttpClientBuilder$DefaultVertx")); } @BuildStep void registerServiceProviders(BuildProducer<ServiceProviderBuildItem> serviceProvider) { - serviceProvider.produce(ServiceProviderBuildItem.allProvidersFromClassPath(HttpClientProvider.class.getName())); serviceProvider.produce(ServiceProviderBuildItem.allProvidersFromClassPath(VertxProvider.class.getName())); } } diff --git a/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/DeadlockTests.java b/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/DeadlockTests.java deleted file mode 100644 index 14d0fc1060..0000000000 --- a/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/DeadlockTests.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.quarkus.support.azure.core.http.vertx; - -import java.security.SecureRandom; - -import com.azure.core.http.HttpClient; -import com.azure.core.http.HttpMethod; -import com.azure.core.http.HttpRequest; -import com.azure.core.util.FluxUtil; -import com.github.tomakehurst.wiremock.WireMockServer; -import com.github.tomakehurst.wiremock.core.WireMockConfiguration; -import io.quarkus.test.QuarkusUnitTest; -import org.jboss.shrinkwrap.api.ShrinkWrap; -import org.jboss.shrinkwrap.api.spec.JavaArchive; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.RegisterExtension; -import reactor.core.publisher.Mono; -import reactor.test.StepVerifier; - -import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; -import static com.github.tomakehurst.wiremock.client.WireMock.get; -import static org.junit.jupiter.api.Assertions.assertArrayEquals; -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class DeadlockTests { - - private static final String GET_ENDPOINT = "/get"; - - private WireMockServer server; - private byte[] expectedGetBytes; - - @RegisterExtension - static final QuarkusUnitTest CONFIG = new QuarkusUnitTest() - .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)); - - @BeforeEach - public void configureWireMockServer() { - expectedGetBytes = new byte[10 * 1024 * 1024]; - new SecureRandom().nextBytes(expectedGetBytes); - - server = new WireMockServer(WireMockConfiguration.options() - .dynamicPort() - .disableRequestJournal() - .gzipDisabled(true)); - - server.stubFor(get(GET_ENDPOINT).willReturn(aResponse().withBody(expectedGetBytes))); - - server.start(); - } - - @AfterEach - public void shutdownWireMockServer() { - if (server != null) { - server.shutdown(); - } - } - - @Test - public void attemptToDeadlock() { - HttpClient httpClient = new VertxAsyncHttpClientProvider().createInstance(); - - String endpoint = server.baseUrl() + GET_ENDPOINT; - - for (int i = 0; i < 100; i++) { - StepVerifier.create(httpClient.send(new HttpRequest(HttpMethod.GET, endpoint)) - .flatMap(response -> FluxUtil.collectBytesInByteBufferStream(response.getBody()) - .zipWith(Mono.just(response.getStatusCode())))) - .assertNext(responseTuple -> { - assertEquals(200, responseTuple.getT2()); - assertArrayEquals(expectedGetBytes, responseTuple.getT1()); - }) - .verifyComplete(); - } - } -} diff --git a/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/SimpleBasicAuthHttpProxyServer.java b/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/SimpleBasicAuthHttpProxyServer.java deleted file mode 100644 index 3e1cfb9738..0000000000 --- a/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/SimpleBasicAuthHttpProxyServer.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.quarkus.support.azure.core.http.vertx; - -import java.util.Base64; - -import com.github.tomakehurst.wiremock.WireMockServer; -import com.github.tomakehurst.wiremock.client.WireMock; -import com.github.tomakehurst.wiremock.common.FileSource; -import com.github.tomakehurst.wiremock.core.WireMockConfiguration; -import com.github.tomakehurst.wiremock.extension.Parameters; -import com.github.tomakehurst.wiremock.extension.ResponseTransformer; -import com.github.tomakehurst.wiremock.http.HttpHeader; -import com.github.tomakehurst.wiremock.http.HttpHeaders; -import com.github.tomakehurst.wiremock.http.Request; -import com.github.tomakehurst.wiremock.http.Response; - -/** - * A simple Http proxy server that enforce basic proxy authentication, once authenticated - * any request matching {@code serviceEndpoints} will be responded with an empty Http 200. - */ -final class SimpleBasicAuthHttpProxyServer { - private final String userName; - private final String password; - private final String[] serviceEndpoints; - private WireMockServer proxyService; - - /** - * Creates SimpleBasicAuthHttpProxyServer. - * - * @param userName the proxy user name for basic authentication - * @param password the proxy password for basic authentication - * @param serviceEndpoints the whitelisted mock endpoints targeting the service behind proxy - */ - SimpleBasicAuthHttpProxyServer(String userName, String password, String[] serviceEndpoints) { - this.userName = userName; - this.password = password; - this.serviceEndpoints = serviceEndpoints; - } - - public ProxyEndpoint start() { - this.proxyService = new WireMockServer(WireMockConfiguration - .options() - .dynamicPort() - .extensions(new ResponseTransformer() { - @Override - public Response transform(Request request, - Response response, - FileSource fileSource, - Parameters parameters) { - String proxyAuthorization = request.getHeader("Proxy-Authorization"); - if (proxyAuthorization == null) { - HttpHeader proxyAuthenticateHeader = new HttpHeader("Proxy-Authenticate", "Basic"); - return new Response.Builder() - .status(407) - .headers(new HttpHeaders(proxyAuthenticateHeader)) - .build(); - } else { - if (!proxyAuthorization.startsWith("Basic")) { - return new Response.Builder() - .status(401) - .build(); - } - String encodedCred = proxyAuthorization.substring("Basic".length()); - encodedCred = encodedCred.trim(); - final Base64.Decoder decoder = Base64.getDecoder(); - final byte[] decodedCred = decoder.decode(encodedCred); - if (new String(decodedCred).equals(userName + ":" + password)) { - return new Response.Builder() - .status(200) - .build(); - } else { - return new Response.Builder() - .status(401) - .build(); - } - } - } - - @Override - public String getName() { - return "ProxyServer"; - } - }) - .disableRequestJournal()); - for (String endpoint : this.serviceEndpoints) { - proxyService.stubFor(WireMock.any(WireMock.urlEqualTo(endpoint)) - .willReturn(WireMock.aResponse())); - } - this.proxyService.start(); - return new ProxyEndpoint("localhost", this.proxyService.port()); - } - - public void shutdown() { - if (this.proxyService != null && this.proxyService.isRunning()) { - this.proxyService.shutdown(); - - } - } - - static class ProxyEndpoint { - private final String host; - private final int port; - - ProxyEndpoint(String host, int port) { - this.host = host; - this.port = port; - } - - String getHost() { - return this.host; - } - - int getPort() { - return this.port; - } - } -} diff --git a/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncClientTestHelper.java b/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncClientTestHelper.java deleted file mode 100644 index c3708513f2..0000000000 --- a/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncClientTestHelper.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.quarkus.support.azure.core.http.vertx; - -import java.lang.reflect.Field; -import java.util.function.Predicate; - -import io.vertx.core.http.impl.HttpClientImpl; -import io.vertx.core.net.SocketAddress; - -/** - * Utility class to reflectively retrieve configuration settings from the Vert.x HTTP Client that are - * not exposed by default. - * - * Avoids having to implement workarounds in the client code to make them available just for testing purposes. - */ -final class VertxAsyncClientTestHelper { - - private VertxAsyncClientTestHelper() { - // Utility class - } - - @SuppressWarnings("unchecked") - static Predicate<SocketAddress> getVertxInternalProxyFilter(HttpClientImpl client) { - try { - Field field = HttpClientImpl.class.getDeclaredField("proxyFilter"); - field.setAccessible(true); - return (Predicate<SocketAddress>) field.get(client); - } catch (NoSuchFieldException | IllegalAccessException e) { - throw new RuntimeException(e); - } - } -} diff --git a/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClientAsyncHttpClientTests.java b/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClientAsyncHttpClientTests.java deleted file mode 100644 index db5606d26c..0000000000 --- a/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClientAsyncHttpClientTests.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.quarkus.support.azure.core.http.vertx; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; - -import com.azure.core.http.HttpClient; -import com.azure.core.test.HttpClientTestsWireMockServer; -import com.azure.core.test.http.HttpClientTests; -import com.github.tomakehurst.wiremock.WireMockServer; -import io.vertx.core.AsyncResult; -import io.vertx.core.Handler; -import io.vertx.core.Vertx; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; - -public class VertxAsyncHttpClientAsyncHttpClientTests extends HttpClientTests { - private static WireMockServer server; - private static Vertx vertx; - - @BeforeAll - public static void beforeAll() { - server = HttpClientTestsWireMockServer.getHttpClientTestsServer(); - server.start(); - vertx = Vertx.vertx(); - } - - @AfterAll - public static void afterAll() throws Exception { - if (server != null) { - server.shutdown(); - } - - if (vertx != null) { - CountDownLatch latch = new CountDownLatch(1); - vertx.close(new Handler<AsyncResult<Void>>() { - @Override - public void handle(AsyncResult<Void> event) { - latch.countDown(); - } - }); - latch.await(5, TimeUnit.SECONDS); - } - } - - @Override - protected int getWireMockPort() { - return server.port(); - } - - @Override - protected HttpClient createHttpClient() { - return new VertxAsyncHttpClientBuilder().vertx(vertx).build(); - } -} diff --git a/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClientBuilderTests.java b/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClientBuilderTests.java deleted file mode 100644 index 0e43054761..0000000000 --- a/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClientBuilderTests.java +++ /dev/null @@ -1,464 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.quarkus.support.azure.core.http.vertx; - -import java.net.ConnectException; -import java.net.InetSocketAddress; -import java.time.Duration; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -import java.util.function.Predicate; - -import com.azure.core.http.HttpClient; -import com.azure.core.http.HttpMethod; -import com.azure.core.http.HttpRequest; -import com.azure.core.http.ProxyOptions; -import com.azure.core.test.utils.TestConfigurationSource; -import com.azure.core.util.Configuration; -import com.azure.core.util.ConfigurationBuilder; -import com.azure.core.util.ConfigurationSource; -import com.github.tomakehurst.wiremock.WireMockServer; -import com.github.tomakehurst.wiremock.client.WireMock; -import com.github.tomakehurst.wiremock.core.WireMockConfiguration; -import io.vertx.core.AsyncResult; -import io.vertx.core.Handler; -import io.vertx.core.Vertx; -import io.vertx.core.http.HttpClientOptions; -import io.vertx.core.http.impl.HttpClientImpl; -import io.vertx.core.net.SocketAddress; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; -import reactor.test.StepVerifier; - -import static io.vertx.core.net.SocketAddress.inetSocketAddress; -import static org.apache.camel.quarkus.support.azure.core.http.vertx.VertxAsyncClientTestHelper.getVertxInternalProxyFilter; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - -/** - * Tests {@link VertxAsyncHttpClientBuilder}. - */ -public class VertxAsyncHttpClientBuilderTests { - private static final String PROXY_USERNAME = "foo"; - private static final String PROXY_PASSWORD = "bar"; - private static final String PROXY_USER_INFO = PROXY_USERNAME + ":" + PROXY_PASSWORD + "@"; - private static final String SERVICE_ENDPOINT = "/default"; - private static final ConfigurationSource EMPTY_SOURCE = new TestConfigurationSource(); - private static Vertx vertx; - - @BeforeAll - public static void beforeAll() { - vertx = Vertx.vertx(); - } - - @AfterAll - public static void afterAll() { - if (vertx != null) { - CountDownLatch latch = new CountDownLatch(1); - vertx.close(new Handler<AsyncResult<Void>>() { - @Override - public void handle(AsyncResult<Void> event) { - latch.countDown(); - } - }); - try { - latch.await(5, TimeUnit.SECONDS); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } - } - } - - @Test - public void buildWithConfigurationNone() { - HttpClient httpClient = new VertxAsyncHttpClientBuilder() - .configuration(Configuration.NONE) - .vertx(vertx) - .build(); - - String defaultPath = "/default"; - WireMockServer server = new WireMockServer(WireMockConfiguration.options().dynamicPort().disableRequestJournal()); - server.stubFor(WireMock.get(defaultPath).willReturn(WireMock.aResponse().withStatus(200))); - server.start(); - String defaultUrl = "http://localhost:" + server.port() + defaultPath; - try { - StepVerifier.create(httpClient.send(new HttpRequest(HttpMethod.GET, defaultUrl))) - .assertNext(response -> assertEquals(200, response.getStatusCode())) - .verifyComplete(); - } finally { - if (server.isRunning()) { - server.shutdown(); - } - } - } - - @Test - public void buildWithDefaultConnectionOptions() { - VertxAsyncHttpClientBuilder builder = new VertxAsyncHttpClientBuilder().vertx(vertx); - HttpClient httpClient = builder.build(); - - io.vertx.core.http.HttpClient client = ((VertxAsyncHttpClient) httpClient).client; - io.vertx.core.http.HttpClientOptions options = ((HttpClientImpl) client).options(); - - String defaultPath = "/default"; - WireMockServer server = new WireMockServer(WireMockConfiguration.options().dynamicPort().disableRequestJournal()); - server.stubFor(WireMock.get(defaultPath).willReturn(WireMock.aResponse().withStatus(200))); - server.start(); - String defaultUrl = "http://localhost:" + server.port() + defaultPath; - try { - StepVerifier.create(httpClient.send(new HttpRequest(HttpMethod.GET, defaultUrl))) - .assertNext(response -> assertEquals(200, response.getStatusCode())) - .verifyComplete(); - - assertEquals(10000, options.getConnectTimeout()); - assertEquals(60, options.getIdleTimeout()); - assertEquals(60, options.getReadIdleTimeout()); - assertEquals(60, options.getWriteIdleTimeout()); - } finally { - if (server.isRunning()) { - server.shutdown(); - } - } - } - - @Test - public void buildWithConnectionOptions() { - VertxAsyncHttpClientBuilder builder = new VertxAsyncHttpClientBuilder().vertx(vertx); - VertxAsyncHttpClient httpClient = (VertxAsyncHttpClient) builder.connectTimeout(Duration.ofSeconds(10)) - .idleTimeout(Duration.ofSeconds(20)) - .readIdleTimeout(Duration.ofSeconds(30)) - .writeIdleTimeout(Duration.ofSeconds(40)) - .build(); - - io.vertx.core.http.HttpClientOptions options = ((HttpClientImpl) httpClient.client).options(); - - String defaultPath = "/default"; - WireMockServer server = new WireMockServer(WireMockConfiguration.options().dynamicPort().disableRequestJournal()); - server.stubFor(WireMock.get(defaultPath).willReturn(WireMock.aResponse().withStatus(200))); - server.start(); - String defaultUrl = "http://localhost:" + server.port() + defaultPath; - try { - StepVerifier.create(httpClient.send(new HttpRequest(HttpMethod.GET, defaultUrl))) - .assertNext(response -> assertEquals(200, response.getStatusCode())) - .verifyComplete(); - - assertEquals(10000, options.getConnectTimeout()); - assertEquals(20, options.getIdleTimeout()); - assertEquals(30, options.getReadIdleTimeout()); - assertEquals(40, options.getWriteIdleTimeout()); - } finally { - if (server.isRunning()) { - server.shutdown(); - } - } - } - - @Test - public void buildWithAllProxyTypes() throws Exception { - for (ProxyOptions.Type type : ProxyOptions.Type.values()) { - if (type.equals(ProxyOptions.Type.SOCKS5)) { - return; - } - - String proxyUser = "user"; - String proxyPassword = "secret"; - - InetSocketAddress address = new InetSocketAddress("localhost", 8888); - ProxyOptions proxyOptions = new ProxyOptions(type, address); - proxyOptions.setCredentials("user", "secret"); - proxyOptions.setNonProxyHosts("foo.*|*bar.com|microsoft.com"); - - VertxAsyncHttpClient httpClient = (VertxAsyncHttpClient) new VertxAsyncHttpClientBuilder() - .proxy(proxyOptions) - .vertx(vertx) - .build(); - - HttpClientImpl vertxHttpClientImpl = (HttpClientImpl) httpClient.client; - io.vertx.core.http.HttpClientOptions options = vertxHttpClientImpl.options(); - - io.vertx.core.net.ProxyOptions vertxProxyOptions = options.getProxyOptions(); - assertNotNull(vertxProxyOptions); - assertEquals(address.getHostName(), vertxProxyOptions.getHost()); - assertEquals(address.getPort(), vertxProxyOptions.getPort()); - assertEquals(type.name(), vertxProxyOptions.getType().name()); - assertEquals(proxyUser, vertxProxyOptions.getUsername()); - assertEquals(proxyPassword, vertxProxyOptions.getPassword()); - - Predicate<SocketAddress> proxyFilter = getVertxInternalProxyFilter(vertxHttpClientImpl); - assertFalse(proxyFilter.test(inetSocketAddress(80, "foo.com"))); - assertFalse(proxyFilter.test(inetSocketAddress(80, "foo.bar.com"))); - assertFalse(proxyFilter.test(inetSocketAddress(80, "test.bar.com"))); - assertFalse(proxyFilter.test(inetSocketAddress(80, "microsoft.com"))); - assertTrue(proxyFilter.test(inetSocketAddress(80, "allowed.host.com"))); - } - - } - - @Test - public void buildWithHttpProxy() { - SimpleBasicAuthHttpProxyServer proxyServer = new SimpleBasicAuthHttpProxyServer(PROXY_USERNAME, - PROXY_PASSWORD, - new String[] { SERVICE_ENDPOINT }); - - try { - SimpleBasicAuthHttpProxyServer.ProxyEndpoint proxyEndpoint = proxyServer.start(); - - ProxyOptions clientProxyOptions = new ProxyOptions(ProxyOptions.Type.HTTP, - new InetSocketAddress(proxyEndpoint.getHost(), proxyEndpoint.getPort())) - .setCredentials(PROXY_USERNAME, PROXY_PASSWORD); - - HttpClient httpClient = new VertxAsyncHttpClientBuilder() - .proxy(clientProxyOptions) - .vertx(vertx) - .build(); - - final String serviceUrl = "http://localhost:80" + SERVICE_ENDPOINT; - StepVerifier.create(httpClient.send(new HttpRequest(HttpMethod.GET, serviceUrl))) - .expectNextCount(1) - .verifyComplete(); - } finally { - proxyServer.shutdown(); - } - } - - @Test - public void buildWithHttpProxyFromEnvConfiguration() { - SimpleBasicAuthHttpProxyServer proxyServer = new SimpleBasicAuthHttpProxyServer(PROXY_USERNAME, - PROXY_PASSWORD, - new String[] { SERVICE_ENDPOINT }); - - try { - SimpleBasicAuthHttpProxyServer.ProxyEndpoint proxyEndpoint = proxyServer.start(); - - Configuration configuration = new ConfigurationBuilder(EMPTY_SOURCE, EMPTY_SOURCE, - new TestConfigurationSource() - .put(Configuration.PROPERTY_HTTP_PROXY, - "http://" + PROXY_USER_INFO + proxyEndpoint.getHost() + ":" + proxyEndpoint.getPort()) - .put("java.net.useSystemProxies", "true")) - .build(); - - HttpClient httpClient = new VertxAsyncHttpClientBuilder() - .configuration(configuration) - .vertx(vertx) - .build(); - - final String serviceUrl = "http://localhost:80" + SERVICE_ENDPOINT; - StepVerifier.create(httpClient.send(new HttpRequest(HttpMethod.GET, serviceUrl))) - .expectNextCount(1) - .verifyComplete(); - } finally { - proxyServer.shutdown(); - } - } - - @Test - public void buildWithHttpProxyFromExplicitConfiguration() { - SimpleBasicAuthHttpProxyServer proxyServer = new SimpleBasicAuthHttpProxyServer(PROXY_USERNAME, - PROXY_PASSWORD, - new String[] { SERVICE_ENDPOINT }); - - try { - SimpleBasicAuthHttpProxyServer.ProxyEndpoint proxyEndpoint = proxyServer.start(); - - Configuration configuration = new ConfigurationBuilder() - .putProperty("http.proxy.hostname", proxyEndpoint.getHost()) - .putProperty("http.proxy.port", String.valueOf(proxyEndpoint.getPort())) - .build(); - - HttpClient httpClient = new VertxAsyncHttpClientBuilder() - .configuration(configuration) - .vertx(vertx) - .build(); - - final String serviceUrl = "http://localhost:80" + SERVICE_ENDPOINT; - StepVerifier.create(httpClient.send(new HttpRequest(HttpMethod.GET, serviceUrl))) - .expectNextCount(1) - .verifyComplete(); - } finally { - proxyServer.shutdown(); - } - } - - @Test - public void buildWithCustomVertx() throws Exception { - Vertx vertx = Vertx.vertx(); - - HttpClient httpClient = new VertxAsyncHttpClientBuilder() - .configuration(Configuration.NONE) - .vertx(vertx) - .build(); - - String defaultPath = "/default"; - WireMockServer server = new WireMockServer(WireMockConfiguration.options().dynamicPort().disableRequestJournal()); - server.stubFor(WireMock.get(defaultPath).willReturn(WireMock.aResponse().withStatus(200))); - server.start(); - String defaultUrl = "http://localhost:" + server.port() + defaultPath; - try { - StepVerifier.create(httpClient.send(new HttpRequest(HttpMethod.GET, defaultUrl))) - .assertNext(response -> assertEquals(200, response.getStatusCode())) - .verifyComplete(); - } finally { - if (server.isRunning()) { - server.shutdown(); - } - - CountDownLatch latch = new CountDownLatch(1); - vertx.close(event -> latch.countDown()); - assertTrue(latch.await(5, TimeUnit.SECONDS)); - } - } - - @Test - public void buildWithCustomHttpClientOptions() { - HttpClientOptions options = new HttpClientOptions(); - options.setConnectTimeout(30000); - options.setIdleTimeout(50); - options.setReadIdleTimeout(60); - options.setWriteIdleTimeout(70); - - HttpClient httpClient = new VertxAsyncHttpClientBuilder() - .connectTimeout(Duration.ofSeconds(10)) - .idleTimeout(Duration.ofSeconds(20)) - .readIdleTimeout(Duration.ofSeconds(30)) - .writeIdleTimeout(Duration.ofSeconds(40)) - .httpClientOptions(options) - .vertx(vertx) - .build(); - - // Verify the original configuration was preserved and not overwritten - assertEquals(30000, options.getConnectTimeout()); - assertEquals(50, options.getIdleTimeout()); - assertEquals(60, options.getReadIdleTimeout()); - assertEquals(70, options.getWriteIdleTimeout()); - - String defaultPath = "/default"; - WireMockServer server = new WireMockServer(WireMockConfiguration.options().dynamicPort().disableRequestJournal()); - server.stubFor(WireMock.get(defaultPath).willReturn(WireMock.aResponse().withStatus(200))); - server.start(); - String defaultUrl = "http://localhost:" + server.port() + defaultPath; - try { - StepVerifier.create(httpClient.send(new HttpRequest(HttpMethod.GET, defaultUrl))) - .assertNext(response -> assertEquals(200, response.getStatusCode())) - .verifyComplete(); - } finally { - if (server.isRunning()) { - server.shutdown(); - } - } - } - - @Test - public void buildWithNullProxyAddress() { - SimpleBasicAuthHttpProxyServer proxyServer = new SimpleBasicAuthHttpProxyServer(PROXY_USERNAME, - PROXY_PASSWORD, - new String[] { SERVICE_ENDPOINT }); - - try { - proxyServer.start(); - - ProxyOptions mockPoxyOptions = Mockito.mock(ProxyOptions.class); - Mockito.when(mockPoxyOptions.getType()).thenReturn(ProxyOptions.Type.HTTP); - Mockito.when(mockPoxyOptions.getAddress()).thenReturn(null); - - HttpClient httpClient = new VertxAsyncHttpClientBuilder() - .proxy(mockPoxyOptions) - .vertx(vertx) - .build(); - - final String serviceUrl = "http://localhost:80" + SERVICE_ENDPOINT; - StepVerifier.create(httpClient.send(new HttpRequest(HttpMethod.GET, serviceUrl))) - .verifyError(ConnectException.class); - } finally { - proxyServer.shutdown(); - } - } - - @Test - public void buildWithInvalidProxyType() { - ProxyOptions.Type mockProxyType = Mockito.mock(ProxyOptions.Type.class); - Mockito.when(mockProxyType.name()).thenReturn("INVALID"); - - ProxyOptions clientProxyOptions = new ProxyOptions(mockProxyType, - new InetSocketAddress("test.com", 8080)); - - assertThrows(IllegalArgumentException.class, () -> { - new VertxAsyncHttpClientBuilder() - .proxy(clientProxyOptions) - .vertx(vertx) - .build(); - }); - } - - @Test - public void buildWithNullProxyType() { - SimpleBasicAuthHttpProxyServer proxyServer = new SimpleBasicAuthHttpProxyServer(PROXY_USERNAME, - PROXY_PASSWORD, - new String[] { SERVICE_ENDPOINT }); - - try { - SimpleBasicAuthHttpProxyServer.ProxyEndpoint proxyEndpoint = proxyServer.start(); - - ProxyOptions mockPoxyOptions = Mockito.mock(ProxyOptions.class); - Mockito.when(mockPoxyOptions.getType()).thenReturn(null); - Mockito.when(mockPoxyOptions.getAddress()) - .thenReturn(new InetSocketAddress(proxyEndpoint.getHost(), proxyEndpoint.getPort())); - - HttpClient httpClient = new VertxAsyncHttpClientBuilder() - .proxy(mockPoxyOptions) - .vertx(vertx) - .build(); - - final String serviceUrl = "http://localhost:80" + SERVICE_ENDPOINT; - StepVerifier.create(httpClient.send(new HttpRequest(HttpMethod.GET, serviceUrl))) - .expectNextCount(1) - .verifyComplete(); - } finally { - proxyServer.shutdown(); - } - } - - @Test - public void buildWithoutProxyAuthentication() { - SimpleBasicAuthHttpProxyServer proxyServer = new SimpleBasicAuthHttpProxyServer(PROXY_USERNAME, - PROXY_PASSWORD, - new String[] { SERVICE_ENDPOINT }); - - try { - SimpleBasicAuthHttpProxyServer.ProxyEndpoint proxyEndpoint = proxyServer.start(); - - ProxyOptions clientProxyOptions = new ProxyOptions(ProxyOptions.Type.HTTP, - new InetSocketAddress(proxyEndpoint.getHost(), proxyEndpoint.getPort())); - - HttpClient httpClient = new VertxAsyncHttpClientBuilder() - .proxy(clientProxyOptions) - .vertx(vertx) - .build(); - - final String serviceUrl = "http://localhost:80" + SERVICE_ENDPOINT; - StepVerifier.create(httpClient.send(new HttpRequest(HttpMethod.GET, serviceUrl))) - .expectNextCount(1) - .verifyComplete(); - } finally { - proxyServer.shutdown(); - } - } -} diff --git a/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClientProviderTests.java b/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClientProviderTests.java deleted file mode 100644 index ccd22bc6e9..0000000000 --- a/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClientProviderTests.java +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.quarkus.support.azure.core.http.vertx; - -import java.net.InetSocketAddress; -import java.time.Duration; -import java.util.HashSet; -import java.util.LinkedHashSet; -import java.util.ServiceLoader; -import java.util.Set; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -import java.util.function.Predicate; - -import com.azure.core.http.HttpClient; -import com.azure.core.http.ProxyOptions; -import com.azure.core.util.Configuration; -import com.azure.core.util.HttpClientOptions; -import io.quarkus.test.QuarkusUnitTest; -import io.vertx.core.Vertx; -import io.vertx.core.http.impl.HttpClientImpl; -import io.vertx.core.net.SocketAddress; -import org.jboss.shrinkwrap.api.ShrinkWrap; -import org.jboss.shrinkwrap.api.spec.JavaArchive; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.RegisterExtension; -import org.mockito.MockedStatic; -import org.mockito.Mockito; - -import static io.vertx.core.net.SocketAddress.inetSocketAddress; -import static org.apache.camel.quarkus.support.azure.core.http.vertx.VertxAsyncClientTestHelper.getVertxInternalProxyFilter; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.mockStatic; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - -/** - * Tests {@link VertxAsyncHttpClientProvider}. - */ -public class VertxAsyncHttpClientProviderTests { - - @RegisterExtension - static final QuarkusUnitTest CONFIG = new QuarkusUnitTest() - .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class) - .addAsServiceProvider(VertxProvider.class, QuarkusVertxProvider.class) - .addPackage(VertxAsyncHttpClient.class.getPackage())); - - @Test - public void nullOptionsReturnsBaseClient() { - VertxAsyncHttpClient httpClient = (VertxAsyncHttpClient) new VertxAsyncHttpClientProvider() - .createInstance(null); - - ProxyOptions environmentProxy = ProxyOptions.fromConfiguration(Configuration.getGlobalConfiguration()); - io.vertx.core.http.HttpClientOptions options = ((HttpClientImpl) httpClient.client).options(); - io.vertx.core.net.ProxyOptions proxyOptions = options.getProxyOptions(); - if (environmentProxy == null) { - assertNull(proxyOptions); - } else { - assertNotNull(proxyOptions); - assertEquals(environmentProxy.getAddress().getHostName(), proxyOptions.getHost()); - } - } - - @Test - public void defaultOptionsReturnsBaseClient() { - VertxAsyncHttpClient httpClient = (VertxAsyncHttpClient) new VertxAsyncHttpClientProvider() - .createInstance(new HttpClientOptions()); - - ProxyOptions environmentProxy = ProxyOptions.fromConfiguration(Configuration.getGlobalConfiguration()); - io.vertx.core.http.HttpClientOptions options = ((HttpClientImpl) httpClient.client).options(); - io.vertx.core.net.ProxyOptions proxyOptions = options.getProxyOptions(); - if (environmentProxy == null) { - assertNull(proxyOptions); - } else { - assertNotNull(proxyOptions); - assertEquals(environmentProxy.getAddress().getHostName(), proxyOptions.getHost()); - } - } - - @Test - public void optionsWithAProxy() { - ProxyOptions proxyOptions = new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("localhost", 8888)); - proxyOptions.setNonProxyHosts("foo.*|bar.*|cheese.com|wine.org"); - - HttpClientOptions clientOptions = new HttpClientOptions().setProxyOptions(proxyOptions); - - VertxAsyncHttpClient httpClient = (VertxAsyncHttpClient) new VertxAsyncHttpClientProvider() - .createInstance(clientOptions); - - io.vertx.core.http.HttpClientOptions options = ((HttpClientImpl) httpClient.client).options(); - - io.vertx.core.net.ProxyOptions vertxProxyOptions = options.getProxyOptions(); - assertNotNull(vertxProxyOptions); - assertEquals(proxyOptions.getAddress().getHostName(), vertxProxyOptions.getHost()); - assertEquals(proxyOptions.getAddress().getPort(), vertxProxyOptions.getPort()); - assertEquals(proxyOptions.getType().name(), vertxProxyOptions.getType().name()); - - Predicate<SocketAddress> proxyFilter = getVertxInternalProxyFilter((HttpClientImpl) httpClient.client); - assertFalse(proxyFilter.test(inetSocketAddress(80, "foo.com"))); - assertFalse(proxyFilter.test(inetSocketAddress(80, "foo.bar.com"))); - assertFalse(proxyFilter.test(inetSocketAddress(80, "bar.com"))); - assertFalse(proxyFilter.test(inetSocketAddress(80, "cheese.com"))); - assertFalse(proxyFilter.test(inetSocketAddress(80, "wine.org"))); - assertTrue(proxyFilter.test(inetSocketAddress(80, "allowed.host.com"))); - } - - @Test - public void optionsWithTimeouts() { - Duration timeout = Duration.ofMillis(15000); - HttpClientOptions clientOptions = new HttpClientOptions() - .setConnectTimeout(timeout) - .setConnectionIdleTimeout(timeout) - .setReadTimeout(timeout) - .setWriteTimeout(timeout); - - HttpClient httpClient = new VertxAsyncHttpClientProvider().createInstance(clientOptions); - VertxAsyncHttpClient cast = VertxAsyncHttpClient.class.cast(httpClient); - - io.vertx.core.http.HttpClientOptions options = ((HttpClientImpl) cast.client).options(); - - assertEquals(timeout.toMillis(), options.getConnectTimeout()); - assertEquals(timeout.getSeconds(), options.getIdleTimeout()); - assertEquals(timeout.getSeconds(), options.getReadIdleTimeout()); - assertEquals(timeout.getSeconds(), options.getWriteIdleTimeout()); - } - - @SuppressWarnings("rawtypes") - @Test - public void vertxProvider() throws Exception { - Vertx vertx = Vertx.vertx(); - - ServiceLoader mockServiceLoader = mock(ServiceLoader.class); - VertxProvider mockVertxProvider = mock(VertxProvider.class); - - try (MockedStatic<ServiceLoader> serviceLoader = mockStatic(ServiceLoader.class)) { - Set<VertxProvider> providers = new HashSet<>(); - providers.add(mockVertxProvider); - - Class<?> providerClass = VertxProvider.class; - serviceLoader.when(() -> ServiceLoader.load(providerClass, providerClass.getClassLoader())) - .thenReturn(mockServiceLoader); - - Mockito.when(mockServiceLoader.iterator()).thenReturn(providers.iterator()); - Mockito.when(mockVertxProvider.createVertx()).thenReturn(vertx); - - HttpClient httpClient = new VertxAsyncHttpClientProvider().createInstance(); - assertNotNull(httpClient); - - verify(mockServiceLoader, times(1)).iterator(); - verify(mockVertxProvider, times(1)).createVertx(); - } finally { - CountDownLatch latch = new CountDownLatch(1); - vertx.close(event -> latch.countDown()); - latch.await(5, TimeUnit.SECONDS); - } - } - - @SuppressWarnings("rawtypes") - @Test - public void multipleVertxProviders() throws Exception { - Vertx vertx = Vertx.vertx(); - - ServiceLoader mockServiceLoader = mock(ServiceLoader.class); - VertxProvider mockVertxProviderA = mock(VertxProvider.class); - VertxProvider mockVertxProviderB = mock(VertxProvider.class); - - try (MockedStatic<ServiceLoader> serviceLoader = mockStatic(ServiceLoader.class)) { - Set<VertxProvider> providers = new LinkedHashSet<>(); - providers.add(mockVertxProviderA); - providers.add(mockVertxProviderB); - - Class<?> providerClass = VertxProvider.class; - serviceLoader.when(() -> ServiceLoader.load(providerClass, providerClass.getClassLoader())) - .thenReturn(mockServiceLoader); - - Mockito.when(mockServiceLoader.iterator()).thenReturn(providers.iterator()); - Mockito.when(mockVertxProviderA.createVertx()).thenReturn(vertx); - - HttpClient httpClient = new VertxAsyncHttpClientProvider().createInstance(); - assertNotNull(httpClient); - - verify(mockServiceLoader, times(1)).iterator(); - verify(mockVertxProviderA, times(1)).createVertx(); - - // Only the first provider should have been invoked - verify(mockVertxProviderB, never()).createVertx(); - } finally { - CountDownLatch latch = new CountDownLatch(1); - vertx.close(event -> latch.countDown()); - latch.await(5, TimeUnit.SECONDS); - } - } -} diff --git a/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClientResponseTransformer.java b/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClientResponseTransformer.java deleted file mode 100644 index 8ea2fa589e..0000000000 --- a/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClientResponseTransformer.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.quarkus.support.azure.core.http.vertx; - -import com.github.tomakehurst.wiremock.common.FileSource; -import com.github.tomakehurst.wiremock.extension.Parameters; -import com.github.tomakehurst.wiremock.extension.ResponseTransformer; -import com.github.tomakehurst.wiremock.http.Request; -import com.github.tomakehurst.wiremock.http.Response; - -import static org.apache.camel.quarkus.support.azure.core.http.vertx.VertxAsyncHttpClientTests.RETURN_HEADERS_AS_IS_PATH; - -/** - * Mock response transformer used to test {@link VertxAsyncHttpClient}. - */ -public class VertxAsyncHttpClientResponseTransformer extends ResponseTransformer { - public static final String NAME = "vertx-http-client-response-transformer"; - - @Override - public Response transform(Request request, Response response, FileSource fileSource, Parameters parameters) { - String url = request.getUrl(); - - if (RETURN_HEADERS_AS_IS_PATH.equalsIgnoreCase(url)) { - return Response.response() - .status(200) - .headers(request.getHeaders()) - .build(); - } - - return response; - } - - @Override - public String getName() { - return NAME; - } - - @Override - public boolean applyGlobally() { - return false; - } -} diff --git a/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClientRestProxyTests.java b/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClientRestProxyTests.java deleted file mode 100644 index bf11603981..0000000000 --- a/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClientRestProxyTests.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.quarkus.support.azure.core.http.vertx; - -import java.io.IOException; - -import com.azure.core.http.HttpClient; -import com.azure.core.test.RestProxyTestsWireMockServer; -import com.azure.core.test.implementation.RestProxyTests; -import com.azure.core.util.Context; -import com.github.tomakehurst.wiremock.WireMockServer; -import io.quarkus.test.QuarkusUnitTest; -import org.jboss.shrinkwrap.api.ShrinkWrap; -import org.jboss.shrinkwrap.api.spec.JavaArchive; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Named; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.RegisterExtension; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; - -public class VertxAsyncHttpClientRestProxyTests extends RestProxyTests { - private static WireMockServer server; - - @RegisterExtension - static final QuarkusUnitTest CONFIG = new QuarkusUnitTest() - .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class) - .addAsResource("upload.txt", "upload.txt")); - - @BeforeAll - public static void beforeAll() { - server = RestProxyTestsWireMockServer.getRestProxyTestsServer(); - server.start(); - } - - @AfterAll - public static void afterAll() throws Exception { - if (server != null) { - server.shutdown(); - } - } - - @Override - protected int getWireMockPort() { - return server.port(); - } - - @Override - protected HttpClient createHttpClient() { - return new VertxAsyncHttpClientBuilder().build(); - } - - /* - * The following methods are overridden and reimplemented to work around issues with - * parameterized tests not working properly with QuarkusUnitTest. - */ - - @Override - @ParameterizedTest - @MethodSource("downloadTestArgumentProvider") - @Disabled - public void simpleDownloadTest(Context context) { - } - - @SuppressWarnings("unchecked") - @Test - public void simpleDownloadTest() { - downloadTestArgumentProvider().forEach(arguments -> { - Named<Context> named = (Named<Context>) arguments.get()[0]; - super.simpleDownloadTest(named.getPayload()); - }); - } - - @Override - @ParameterizedTest - @MethodSource("downloadTestArgumentProvider") - @Disabled - public void simpleDownloadTestAsync(Context context) { - } - - @SuppressWarnings("unchecked") - @Test - public void simpleDownloadTestAsync() { - downloadTestArgumentProvider().forEach(arguments -> { - Named<Context> named = (Named<Context>) arguments.get()[0]; - super.simpleDownloadTestAsync(named.getPayload()); - }); - } - - @Override - @ParameterizedTest - @MethodSource("downloadTestArgumentProvider") - @Disabled - public void streamResponseCanTransferBody(Context context) throws IOException { - } - - @SuppressWarnings("unchecked") - @Test - public void streamResponseCanTransferBody() { - downloadTestArgumentProvider().forEach(arguments -> { - Named<Context> named = (Named<Context>) arguments.get()[0]; - try { - super.streamResponseCanTransferBody(named.getPayload()); - } catch (IOException e) { - throw new RuntimeException(e); - } - }); - } - - @Override - @ParameterizedTest - @MethodSource("downloadTestArgumentProvider") - @Disabled - public void streamResponseCanTransferBodyAsync(Context context) throws IOException { - } - - @SuppressWarnings("unchecked") - @Test - public void streamResponseCanTransferBodyAsync() { - downloadTestArgumentProvider().forEach(arguments -> { - Named<Context> named = (Named<Context>) arguments.get()[0]; - try { - super.streamResponseCanTransferBodyAsync(named.getPayload()); - } catch (IOException e) { - throw new RuntimeException(e); - } - }); - } -} diff --git a/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClientRestProxyWithAsyncHttpProxyTests.java b/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClientRestProxyWithAsyncHttpProxyTests.java deleted file mode 100644 index 2c35e71c34..0000000000 --- a/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClientRestProxyWithAsyncHttpProxyTests.java +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.quarkus.support.azure.core.http.vertx; - -import java.io.IOException; -import java.net.InetSocketAddress; - -import com.azure.core.http.HttpClient; -import com.azure.core.http.ProxyOptions; -import com.azure.core.test.RestProxyTestsWireMockServer; -import com.azure.core.test.implementation.RestProxyTests; -import com.azure.core.util.Context; -import com.github.tomakehurst.wiremock.WireMockServer; -import io.quarkus.test.QuarkusUnitTest; -import io.quarkus.test.common.QuarkusTestResource; -import org.eclipse.microprofile.config.Config; -import org.eclipse.microprofile.config.ConfigProvider; -import org.jboss.shrinkwrap.api.ShrinkWrap; -import org.jboss.shrinkwrap.api.spec.JavaArchive; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Named; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.RegisterExtension; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; - -import static org.apache.camel.quarkus.support.azure.core.http.vertx.VertxHttpClientTestResource.PROXY_PASSWORD; -import static org.apache.camel.quarkus.support.azure.core.http.vertx.VertxHttpClientTestResource.PROXY_USER; - -@QuarkusTestResource(VertxHttpClientTestResource.class) -public class VertxAsyncHttpClientRestProxyWithAsyncHttpProxyTests extends RestProxyTests { - private static WireMockServer server; - - @RegisterExtension - static final QuarkusUnitTest CONFIG = new QuarkusUnitTest() - .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class) - .addAsResource("upload.txt", "upload.txt")); - - @BeforeAll - public static void beforeAll() { - server = RestProxyTestsWireMockServer.getRestProxyTestsServer(); - server.start(); - } - - @AfterAll - public static void afterAll() throws Exception { - if (server != null) { - server.shutdown(); - } - } - - @Override - protected int getWireMockPort() { - return server.port(); - } - - @Override - protected HttpClient createHttpClient() { - Config config = ConfigProvider.getConfig(); - String proxyHost = config.getValue("tiny.proxy.host", String.class); - int proxyPort = config.getValue("tiny.proxy.port", int.class); - - InetSocketAddress address = new InetSocketAddress(proxyHost, proxyPort); - ProxyOptions proxyOptions = new ProxyOptions(ProxyOptions.Type.HTTP, address); - proxyOptions.setCredentials(PROXY_USER, PROXY_PASSWORD); - - return new VertxAsyncHttpClientBuilder() - .proxy(proxyOptions) - .build(); - } - - /* - * The following methods are overridden and reimplemented to work around issues with - * parameterized tests not working properly with QuarkusUnitTest. - */ - - @Override - @ParameterizedTest - @MethodSource("downloadTestArgumentProvider") - @Disabled - public void simpleDownloadTest(Context context) { - } - - @SuppressWarnings("unchecked") - @Test - public void simpleDownloadTest() { - downloadTestArgumentProvider().forEach(arguments -> { - Named<Context> named = (Named<Context>) arguments.get()[0]; - super.simpleDownloadTest(named.getPayload()); - }); - } - - @Override - @ParameterizedTest - @MethodSource("downloadTestArgumentProvider") - @Disabled - public void simpleDownloadTestAsync(Context context) { - } - - @SuppressWarnings("unchecked") - @Test - public void simpleDownloadTestAsync() { - downloadTestArgumentProvider().forEach(arguments -> { - Named<Context> named = (Named<Context>) arguments.get()[0]; - super.simpleDownloadTestAsync(named.getPayload()); - }); - } - - @Override - @ParameterizedTest - @MethodSource("downloadTestArgumentProvider") - @Disabled - public void streamResponseCanTransferBody(Context context) throws IOException { - } - - @SuppressWarnings("unchecked") - @Test - public void streamResponseCanTransferBody() { - downloadTestArgumentProvider().forEach(arguments -> { - Named<Context> named = (Named<Context>) arguments.get()[0]; - try { - super.streamResponseCanTransferBody(named.getPayload()); - } catch (IOException e) { - throw new RuntimeException(e); - } - }); - } - - @Override - @ParameterizedTest - @MethodSource("downloadTestArgumentProvider") - @Disabled - public void streamResponseCanTransferBodyAsync(Context context) throws IOException { - } - - @SuppressWarnings("unchecked") - @Test - public void streamResponseCanTransferBodyAsync() { - downloadTestArgumentProvider().forEach(arguments -> { - Named<Context> named = (Named<Context>) arguments.get()[0]; - try { - super.streamResponseCanTransferBodyAsync(named.getPayload()); - } catch (IOException e) { - throw new RuntimeException(e); - } - }); - } - - @Override - @Test - @Disabled - public void service19PutWithBodyParamApplicationOctetStreamContentTypeAndStringBodyWithEmptyBody() { - super.service19PutWithBodyParamApplicationOctetStreamContentTypeAndStringBodyWithEmptyBody(); - } - - @Override - @Test - @Disabled - public void service19PutWithHeaderApplicationJsonContentTypeAndCharsetAndStringBodyWithEmptyBody() { - super.service19PutWithHeaderApplicationJsonContentTypeAndCharsetAndStringBodyWithEmptyBody(); - } - - @Override - @Test - @Disabled - public void service19PutWithHeaderApplicationOctetStreamContentTypeAndStringBodyWithEmptyBody() { - super.service19PutWithHeaderApplicationOctetStreamContentTypeAndStringBodyWithEmptyBody(); - } - - @Override - @Test - @Disabled - public void service19PutWithNoContentTypeAndStringBodyWithEmptyBody() { - super.service19PutWithNoContentTypeAndStringBodyWithEmptyBody(); - } -} diff --git a/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClientSingletonTests.java b/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClientSingletonTests.java deleted file mode 100644 index acb5cca6b9..0000000000 --- a/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClientSingletonTests.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.quarkus.support.azure.core.http.vertx; - -import com.azure.core.http.HttpClient; -import com.azure.core.test.utils.TestConfigurationSource; -import com.azure.core.util.Configuration; -import com.azure.core.util.ConfigurationBuilder; -import com.azure.core.util.ConfigurationSource; -import com.azure.core.util.HttpClientOptions; -import io.quarkus.test.QuarkusUnitTest; -import org.jboss.shrinkwrap.api.ShrinkWrap; -import org.jboss.shrinkwrap.api.spec.JavaArchive; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.RegisterExtension; -import org.junit.jupiter.api.parallel.Execution; -import org.junit.jupiter.api.parallel.ExecutionMode; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotEquals; - -@Execution(ExecutionMode.SAME_THREAD) -public class VertxAsyncHttpClientSingletonTests { - private static final ConfigurationSource EMPTY_SOURCE = new TestConfigurationSource(); - - @RegisterExtension - static final QuarkusUnitTest CONFIG = new QuarkusUnitTest() - .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class) - .addClasses(VertxAsyncHttpClientProvider.class)); - - @Test - public void testSingletonClientInstanceCreation() { - Configuration configuration = getConfiguration(true); - HttpClient client1 = new VertxAsyncHttpClientProvider(configuration).createInstance(); - HttpClient client2 = new VertxAsyncHttpClientProvider(configuration).createInstance(); - assertEquals(client1, client2); - } - - @Test - public void testNonDefaultClientInstanceCreation() { - Configuration configuration = getConfiguration(false); - HttpClient client1 = new VertxAsyncHttpClientProvider(configuration).createInstance(); - HttpClient client2 = new VertxAsyncHttpClientProvider(configuration).createInstance(); - assertNotEquals(client1, client2); - } - - @Test - public void testCustomizedClientInstanceCreationNotShared() { - Configuration configuration = getConfiguration(false); - HttpClientOptions clientOptions = new HttpClientOptions().setMaximumConnectionPoolSize(500); - HttpClient client1 = new VertxAsyncHttpClientProvider(configuration).createInstance(clientOptions); - HttpClient client2 = new VertxAsyncHttpClientProvider(configuration).createInstance(clientOptions); - assertNotEquals(client1, client2); - } - - @Test - public void testNullHttpClientOptionsInstanceCreation() { - Configuration configuration = getConfiguration(true); - HttpClient client1 = new VertxAsyncHttpClientProvider(configuration).createInstance(null); - HttpClient client2 = new VertxAsyncHttpClientProvider(configuration).createInstance(null); - assertEquals(client1, client2); - } - - private static Configuration getConfiguration(boolean enableSharing) { - return new ConfigurationBuilder(EMPTY_SOURCE, EMPTY_SOURCE, new TestConfigurationSource() - .put("AZURE_ENABLE_HTTP_CLIENT_SHARING", Boolean.toString(enableSharing))) - .build(); - } -} diff --git a/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClientTests.java b/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClientTests.java deleted file mode 100644 index dd06d9b864..0000000000 --- a/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClientTests.java +++ /dev/null @@ -1,371 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.quarkus.support.azure.core.http.vertx; - -import java.io.OutputStream; -import java.net.MalformedURLException; -import java.net.ServerSocket; -import java.net.Socket; -import java.net.URL; -import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.time.Duration; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.CountDownLatch; - -import com.azure.core.http.HttpClient; -import com.azure.core.http.HttpHeader; -import com.azure.core.http.HttpHeaders; -import com.azure.core.http.HttpMethod; -import com.azure.core.http.HttpRequest; -import com.azure.core.http.HttpResponse; -import com.azure.core.util.Context; -import com.azure.core.util.FluxUtil; -import com.github.tomakehurst.wiremock.WireMockServer; -import com.github.tomakehurst.wiremock.core.WireMockConfiguration; -import io.quarkus.test.QuarkusUnitTest; -import io.vertx.core.http.HttpClosedException; -import org.jboss.shrinkwrap.api.ShrinkWrap; -import org.jboss.shrinkwrap.api.spec.JavaArchive; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.RegisterExtension; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; -import reactor.core.scheduler.Schedulers; -import reactor.test.StepVerifier; -import reactor.test.StepVerifierOptions; - -import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; -import static com.github.tomakehurst.wiremock.client.WireMock.get; -import static com.github.tomakehurst.wiremock.client.WireMock.post; -import static org.junit.jupiter.api.Assertions.assertArrayEquals; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertLinesMatch; - -public class VertxAsyncHttpClientTests { - static final String RETURN_HEADERS_AS_IS_PATH = "/returnHeadersAsIs"; - private static final String SHORT_BODY = "hi there"; - private static final String LONG_BODY = createLongBody(); - private static WireMockServer server; - - @RegisterExtension - static final QuarkusUnitTest CONFIG = new QuarkusUnitTest() - .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class) - .addClasses(VertxAsyncHttpClientResponseTransformer.class)); - - @BeforeAll - public static void beforeAll() { - server = new WireMockServer(WireMockConfiguration.options() - .extensions(new VertxAsyncHttpClientResponseTransformer()) - .dynamicPort() - .disableRequestJournal() - .gzipDisabled(true)); - - server.stubFor(get("/short").willReturn(aResponse().withBody(SHORT_BODY))); - server.stubFor(get("/long").willReturn(aResponse().withBody(LONG_BODY))); - server.stubFor(get("/error").willReturn(aResponse().withBody("error").withStatus(500))); - server.stubFor(post("/shortPost").willReturn(aResponse().withBody(SHORT_BODY))); - server.stubFor(get(RETURN_HEADERS_AS_IS_PATH).willReturn(aResponse() - .withTransformers(VertxAsyncHttpClientResponseTransformer.NAME))); - server.stubFor(get("/empty").willReturn(aResponse().withBody(new byte[0]))); - server.start(); - } - - @AfterAll - public static void afterAll() throws Exception { - if (server != null) { - server.shutdown(); - } - } - - @Test - public void testFlowableResponseShortBodyAsByteArrayAsync() { - checkBodyReceived(SHORT_BODY, "/short"); - } - - @Test - public void testFlowableResponseLongBodyAsByteArrayAsync() { - checkBodyReceived(LONG_BODY, "/long"); - } - - @Test - public void responseBodyAsStringAsyncWithCharset() { - HttpClient client = new VertxAsyncHttpClientBuilder().build(); - StepVerifier.create(doRequest(client, "/short").getBodyAsString(StandardCharsets.UTF_8)) - .assertNext(result -> assertEquals(SHORT_BODY, result)) - .verifyComplete(); - } - - @Test - public void testFlowableWhenServerReturnsBodyAndNoErrorsWhenHttp500Returned() { - HttpResponse response = getResponse("/error"); - assertEquals(500, response.getStatusCode()); - StepVerifier.create(response.getBodyAsString()) - .expectNext("error") - .expectComplete() - .verify(Duration.ofSeconds(20)); - } - - @Test - public void testFlowableBackpressure() { - HttpResponse response = getResponse("/long"); - - StepVerifierOptions stepVerifierOptions = StepVerifierOptions.create(); - stepVerifierOptions.initialRequest(0); - - StepVerifier.create(response.getBody(), stepVerifierOptions) - .expectNextCount(0) - .thenRequest(1) - .expectNextCount(1) - .thenRequest(3) - .expectNextCount(3) - .thenRequest(Long.MAX_VALUE) - .thenConsumeWhile(ByteBuffer::hasRemaining) - .verifyComplete(); - } - - @Test - public void testRequestBodyIsErrorShouldPropagateToResponse() { - HttpClient client = new VertxAsyncHttpClientProvider().createInstance(); - HttpRequest request = new HttpRequest(HttpMethod.POST, url(server, "/shortPost")) - .setHeader("Content-Length", "123") - .setBody(Flux.error(new RuntimeException("boo"))); - - StepVerifier.create(client.send(request)) - .expectErrorMessage("boo") - .verify(); - } - - @Test - public void testRequestBodyEndsInErrorShouldPropagateToResponse() { - HttpClient client = new VertxAsyncHttpClientProvider().createInstance(); - String contentChunk = "abcdefgh"; - int repetitions = 1000; - HttpRequest request = new HttpRequest(HttpMethod.POST, url(server, "/shortPost")) - .setHeader("Content-Length", String.valueOf(contentChunk.length() * (repetitions + 1))) - .setBody(Flux.just(contentChunk) - .repeat(repetitions) - .map(s -> ByteBuffer.wrap(s.getBytes(StandardCharsets.UTF_8))) - .concatWith(Flux.error(new RuntimeException("boo")))); - - try { - StepVerifier.create(client.send(request)) - .expectErrorMessage("boo") - .verify(Duration.ofSeconds(10)); - } catch (Exception ex) { - assertEquals("boo", ex.getMessage()); - } - } - - @Test - public void testServerShutsDownSocketShouldPushErrorToContentFlowable() { - Assertions.assertTimeout(Duration.ofMillis(5000), () -> { - CountDownLatch latch = new CountDownLatch(1); - try (ServerSocket ss = new ServerSocket(0)) { - Mono.fromCallable(() -> { - latch.countDown(); - Socket socket = ss.accept(); - // give the client time to get request across - Thread.sleep(500); - // respond but don't send the complete response - byte[] bytes = new byte[1024]; - int n = socket.getInputStream().read(bytes); - String response = "HTTP/1.1 200 OK\r\n" - + "Content-Type: text/plain\r\n" - + "Content-Length: 10\r\n" - + "\r\n" // - + "zi"; - OutputStream out = socket.getOutputStream(); - out.write(response.getBytes()); - out.flush(); - // kill the socket with HTTP response body incomplete - socket.close(); - return 1; - }).subscribeOn(Schedulers.boundedElastic()).subscribe(); - // - latch.await(); - HttpClient client = new VertxAsyncHttpClientBuilder().build(); - HttpRequest request = new HttpRequest(HttpMethod.GET, - new URL("http://localhost:" + ss.getLocalPort() + "/ioException")); - - StepVerifier.create(client.send(request) - .flatMap(response -> FluxUtil.collectBytesInByteBufferStream(response.getBody()) - .zipWith(Mono.just(response.getStatusCode())))) - .expectError(HttpClosedException.class) - .verify(Duration.ofSeconds(5)); - } - }); - } - - @Test - public void testConcurrentRequests() throws NoSuchAlgorithmException { - int numRequests = 100; // 100 = 1GB of data read - HttpClient client = new VertxAsyncHttpClientProvider().createInstance(); - byte[] expectedDigest = digest(LONG_BODY); - long expectedByteCount = (long) numRequests * LONG_BODY.getBytes(StandardCharsets.UTF_8).length; - - Mono<Long> numBytesMono = Flux.range(1, numRequests) - .parallel(10) - .runOn(Schedulers.boundedElastic()) - .flatMap(n -> Mono.fromCallable(() -> getResponse(client, "/long", Context.NONE)).flatMapMany(response -> { - MessageDigest md = md5Digest(); - return response.getBody() - .doOnNext(buffer -> md.update(buffer.duplicate())) - .doOnComplete(() -> assertArrayEquals(expectedDigest, md.digest(), "wrong digest!")); - })) - .sequential() - .map(buffer -> (long) buffer.remaining()) - .reduce(Long::sum); - - StepVerifier.create(numBytesMono) - .expectNext(expectedByteCount) - .expectComplete() - .verify(Duration.ofSeconds(60)); - } - - @Test - public void validateHeadersReturnAsIs() { - HttpClient client = new VertxAsyncHttpClientProvider().createInstance(); - - final String singleValueHeaderName = "singleValue"; - final String singleValueHeaderValue = "value"; - - final String multiValueHeaderName = "Multi-value"; - final List<String> multiValueHeaderValue = Arrays.asList("value1", "value2"); - - HttpHeaders headers = new HttpHeaders() - .set(singleValueHeaderName, singleValueHeaderValue) - .set(multiValueHeaderName, multiValueHeaderValue); - - StepVerifier.create(client.send(new HttpRequest(HttpMethod.GET, url(server, RETURN_HEADERS_AS_IS_PATH), - headers, Flux.empty()))) - .assertNext(response -> { - assertEquals(200, response.getStatusCode()); - - HttpHeaders responseHeaders = response.getHeaders(); - HttpHeader singleValueHeader = responseHeaders.get(singleValueHeaderName); - assertEquals(singleValueHeaderName, singleValueHeader.getName()); - assertEquals(singleValueHeaderValue, singleValueHeader.getValue()); - - HttpHeader multiValueHeader = responseHeaders.get("Multi-value"); - assertEquals(multiValueHeaderName, multiValueHeader.getName()); - assertLinesMatch(multiValueHeaderValue, multiValueHeader.getValuesList()); - }) - .expectComplete() - .verify(Duration.ofSeconds(10)); - } - - @Test - public void testBufferedResponse() { - Context context = new Context("azure-eagerly-read-response", true); - HttpClient client = new VertxAsyncHttpClientBuilder().build(); - HttpResponse response = getResponse(client, "/short", context); - - StepVerifier.create(response.getBody()) - .assertNext(buffer -> { - assertEquals(SHORT_BODY, new String(buffer.array())); - }) - .verifyComplete(); - } - - @Test - public void testEmptyBufferResponse() { - HttpResponse response = getResponse("/empty"); - - StepVerifierOptions stepVerifierOptions = StepVerifierOptions.create(); - stepVerifierOptions.initialRequest(0); - - StepVerifier.create(response.getBody(), stepVerifierOptions) - .expectNextCount(0) - .thenRequest(1) - .verifyComplete(); - } - - @Test - public void testEmptyBufferedResponse() { - Context context = new Context("azure-eagerly-read-response", true); - HttpClient client = new VertxAsyncHttpClientBuilder().build(); - HttpResponse response = getResponse(client, "/empty", context); - - StepVerifierOptions stepVerifierOptions = StepVerifierOptions.create(); - stepVerifierOptions.initialRequest(0); - - StepVerifier.create(response.getBody(), stepVerifierOptions) - .expectNextCount(0) - .thenRequest(1) - .verifyComplete(); - } - - private static MessageDigest md5Digest() { - try { - return MessageDigest.getInstance("MD5"); - } catch (NoSuchAlgorithmException e) { - throw new RuntimeException(e); - } - } - - private static byte[] digest(String s) throws NoSuchAlgorithmException { - MessageDigest md = MessageDigest.getInstance("MD5"); - md.update(s.getBytes(StandardCharsets.UTF_8)); - return md.digest(); - } - - private static HttpResponse getResponse(String path) { - HttpClient client = new VertxAsyncHttpClientBuilder().build(); - return getResponse(client, path, Context.NONE); - } - - private static HttpResponse getResponse(HttpClient client, String path, Context context) { - HttpRequest request = new HttpRequest(HttpMethod.GET, url(server, path)); - return client.send(request, context).block(); - } - - static URL url(WireMockServer server, String path) { - try { - return new URL("http://localhost:" + server.port() + path); - } catch (MalformedURLException e) { - throw new RuntimeException(e); - } - } - - private static String createLongBody() { - StringBuilder builder = new StringBuilder("abcdefghijk".length() * 1000000); - for (int i = 0; i < 1000000; i++) { - builder.append("abcdefghijk"); - } - - return builder.toString(); - } - - private void checkBodyReceived(String expectedBody, String path) { - HttpClient client = new VertxAsyncHttpClientBuilder().build(); - StepVerifier.create(doRequest(client, path).getBodyAsByteArray()) - .assertNext(bytes -> assertEquals(expectedBody, new String(bytes, StandardCharsets.UTF_8))) - .verifyComplete(); - } - - private HttpResponse doRequest(HttpClient client, String path) { - HttpRequest request = new HttpRequest(HttpMethod.GET, url(server, path)); - return client.send(request).block(); - } -} diff --git a/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxHttpClientTestResource.java b/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxHttpClientTestResource.java deleted file mode 100644 index 2a54ab7783..0000000000 --- a/extensions-support/azure-core-http-client-vertx/deployment/src/test/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxHttpClientTestResource.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.quarkus.support.azure.core.http.vertx; - -import java.util.HashMap; -import java.util.Map; - -import io.quarkus.test.common.QuarkusTestResourceLifecycleManager; -import org.apache.commons.lang3.SystemUtils; -import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.Wait; -import org.testcontainers.utility.DockerImageName; - -public class VertxHttpClientTestResource implements QuarkusTestResourceLifecycleManager { - - public static final String PROXY_USER = "admin"; - public static final String PROXY_PASSWORD = "p4ssw0rd"; - - private static final DockerImageName TINY_PROXY_IMAGE_NAME = DockerImageName.parse("monokal/tinyproxy"); - private static final Integer TINY_PROXY_PORT = 8888; - private GenericContainer container; - - @Override - public Map<String, String> start() { - String host; - int port; - - container = new GenericContainer(TINY_PROXY_IMAGE_NAME) - .withEnv("BASIC_AUTH_USER", PROXY_USER) - .withEnv("BASIC_AUTH_PASSWORD", PROXY_PASSWORD) - .withCommand("ANY") - .waitingFor(Wait.forListeningPort()); - - if (SystemUtils.IS_OS_LINUX) { - container.withNetworkMode("host"); - port = TINY_PROXY_PORT; - host = "localhost"; - } else { - container.withNetworkMode("bridge") - .withExposedPorts(TINY_PROXY_PORT); - port = container.getMappedPort(TINY_PROXY_PORT); - host = "host.docker.internal"; - } - - container.start(); - - Map<String, String> options = new HashMap<>(); - options.put("tiny.proxy.host", host); - options.put("tiny.proxy.port", String.valueOf(port)); - return options; - } - - @Override - public void stop() { - if (container != null) { - container.stop(); - } - } -} diff --git a/extensions-support/azure-core-http-client-vertx/deployment/src/test/resources/upload.txt b/extensions-support/azure-core-http-client-vertx/deployment/src/test/resources/upload.txt deleted file mode 100644 index ff3bb63948..0000000000 --- a/extensions-support/azure-core-http-client-vertx/deployment/src/test/resources/upload.txt +++ /dev/null @@ -1 +0,0 @@ -The quick brown fox jumps over the lazy dog \ No newline at end of file diff --git a/extensions-support/azure-core-http-client-vertx/runtime/pom.xml b/extensions-support/azure-core-http-client-vertx/runtime/pom.xml index 4f3ca842db..1feb279e48 100644 --- a/extensions-support/azure-core-http-client-vertx/runtime/pom.xml +++ b/extensions-support/azure-core-http-client-vertx/runtime/pom.xml @@ -47,6 +47,10 @@ <groupId>com.azure</groupId> <artifactId>azure-core</artifactId> </dependency> + <dependency> + <groupId>com.azure</groupId> + <artifactId>azure-core-http-vertx</artifactId> + </dependency> <dependency> <groupId>org.apache.camel.quarkus</groupId> <artifactId>camel-quarkus-support-azure-core</artifactId> diff --git a/extensions-support/azure-core-http-client-vertx/runtime/src/main/java/org/apache/camel/quarkus/support/azure/core/http/vertx/QuarkusVertxProvider.java b/extensions-support/azure-core-http-client-vertx/runtime/src/main/java/org/apache/camel/quarkus/support/azure/core/http/vertx/QuarkusVertxProvider.java index e02df4957c..a1225dfa3a 100644 --- a/extensions-support/azure-core-http-client-vertx/runtime/src/main/java/org/apache/camel/quarkus/support/azure/core/http/vertx/QuarkusVertxProvider.java +++ b/extensions-support/azure-core-http-client-vertx/runtime/src/main/java/org/apache/camel/quarkus/support/azure/core/http/vertx/QuarkusVertxProvider.java @@ -22,6 +22,7 @@ import javax.enterprise.inject.spi.Bean; import javax.enterprise.inject.spi.BeanManager; import javax.enterprise.inject.spi.CDI; +import com.azure.core.http.vertx.VertxProvider; import io.vertx.core.Vertx; public class QuarkusVertxProvider implements VertxProvider { diff --git a/extensions-support/azure-core-http-client-vertx/runtime/src/main/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClient.java b/extensions-support/azure-core-http-client-vertx/runtime/src/main/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClient.java deleted file mode 100644 index 82e8737aa6..0000000000 --- a/extensions-support/azure-core-http-client-vertx/runtime/src/main/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClient.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.quarkus.support.azure.core.http.vertx; - -import java.nio.ByteBuffer; -import java.util.Objects; - -import com.azure.core.http.HttpClient; -import com.azure.core.http.HttpHeaders; -import com.azure.core.http.HttpMethod; -import com.azure.core.http.HttpRequest; -import com.azure.core.http.HttpResponse; -import com.azure.core.util.Context; -import com.azure.core.util.Contexts; -import com.azure.core.util.ProgressReporter; -import io.netty.buffer.Unpooled; -import io.vertx.core.Vertx; -import io.vertx.core.buffer.Buffer; -import io.vertx.core.http.HttpClientRequest; -import io.vertx.core.http.HttpClientResponse; -import io.vertx.core.http.RequestOptions; -import org.apache.camel.quarkus.support.azure.core.http.vertx.implementation.BufferedVertxHttpResponse; -import org.apache.camel.quarkus.support.azure.core.http.vertx.implementation.VertxHttpAsyncResponse; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; -import reactor.core.scheduler.Scheduler; -import reactor.core.scheduler.Schedulers; - -/** - * {@link HttpClient} implementation for the Vert.x {@link io.vertx.core.http.HttpClient}. - */ -class VertxAsyncHttpClient implements HttpClient { - private final Scheduler scheduler; - final io.vertx.core.http.HttpClient client; - - /** - * Constructs a {@link VertxAsyncHttpClient}. - * - * @param client The Vert.x {@link io.vertx.core.http.HttpClient} - */ - VertxAsyncHttpClient(io.vertx.core.http.HttpClient client, Vertx vertx) { - Objects.requireNonNull(client, "client cannot be null"); - Objects.requireNonNull(vertx, "vertx cannot be null"); - this.client = client; - this.scheduler = Schedulers.fromExecutor(vertx.nettyEventLoopGroup()); - } - - @Override - public Mono<HttpResponse> send(HttpRequest request) { - return send(request, Context.NONE); - } - - @Override - public Mono<HttpResponse> send(HttpRequest request, Context context) { - boolean eagerlyReadResponse = (boolean) context.getData("azure-eagerly-read-response").orElse(false); - ProgressReporter progressReporter = Contexts.with(context).getHttpRequestProgressReporter(); - return Mono.create(sink -> toVertxHttpRequest(request).subscribe(vertxHttpRequest -> { - vertxHttpRequest.exceptionHandler(sink::error); - - HttpHeaders requestHeaders = request.getHeaders(); - if (requestHeaders != null) { - requestHeaders.stream().forEach(header -> vertxHttpRequest.putHeader(header.getName(), header.getValuesList())); - if (request.getHeaders().get("Content-Length") == null) { - vertxHttpRequest.setChunked(true); - } - } else { - vertxHttpRequest.setChunked(true); - } - - vertxHttpRequest.response(event -> { - if (event.succeeded()) { - HttpClientResponse vertxHttpResponse = event.result(); - vertxHttpResponse.exceptionHandler(sink::error); - - if (eagerlyReadResponse) { - vertxHttpResponse.body(bodyEvent -> { - if (bodyEvent.succeeded()) { - sink.success(new BufferedVertxHttpResponse(request, vertxHttpResponse, - bodyEvent.result())); - } else { - sink.error(bodyEvent.cause()); - } - }); - } else { - sink.success(new VertxHttpAsyncResponse(request, vertxHttpResponse)); - } - } else { - sink.error(event.cause()); - } - }); - - getRequestBody(request, progressReporter) - .subscribeOn(scheduler) - .map(Unpooled::wrappedBuffer) - .map(Buffer::buffer) - .subscribe(vertxHttpRequest::write, sink::error, vertxHttpRequest::end); - }, sink::error)); - } - - private Mono<HttpClientRequest> toVertxHttpRequest(HttpRequest request) { - HttpMethod httpMethod = request.getHttpMethod(); - io.vertx.core.http.HttpMethod requestMethod = io.vertx.core.http.HttpMethod.valueOf(httpMethod.name()); - - RequestOptions options = new RequestOptions(); - options.setMethod(requestMethod); - options.setAbsoluteURI(request.getUrl()); - return Mono.fromCompletionStage(client.request(options).toCompletionStage()); - } - - private Flux<ByteBuffer> getRequestBody(HttpRequest request, ProgressReporter progressReporter) { - Flux<ByteBuffer> body = request.getBody(); - if (body == null) { - return Flux.empty(); - } - - if (progressReporter != null) { - body = body.map(buffer -> { - progressReporter.reportProgress(buffer.remaining()); - return buffer; - }); - } - - return body; - } -} diff --git a/extensions-support/azure-core-http-client-vertx/runtime/src/main/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClientBuilder.java b/extensions-support/azure-core-http-client-vertx/runtime/src/main/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClientBuilder.java deleted file mode 100644 index 3ec5a59642..0000000000 --- a/extensions-support/azure-core-http-client-vertx/runtime/src/main/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClientBuilder.java +++ /dev/null @@ -1,288 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.quarkus.support.azure.core.http.vertx; - -import java.net.InetSocketAddress; -import java.time.Duration; -import java.util.Iterator; -import java.util.ServiceLoader; -import java.util.regex.Pattern; - -import com.azure.core.http.HttpClient; -import com.azure.core.http.ProxyOptions; -import com.azure.core.util.Configuration; -import com.azure.core.util.CoreUtils; -import com.azure.core.util.logging.ClientLogger; -import io.vertx.core.Vertx; -import io.vertx.core.http.HttpClientOptions; -import io.vertx.core.net.ProxyType; - -import static com.azure.core.util.Configuration.PROPERTY_AZURE_REQUEST_CONNECT_TIMEOUT; -import static com.azure.core.util.Configuration.PROPERTY_AZURE_REQUEST_READ_TIMEOUT; -import static com.azure.core.util.Configuration.PROPERTY_AZURE_REQUEST_WRITE_TIMEOUT; -import static com.azure.core.util.CoreUtils.getDefaultTimeoutFromEnvironment; - -/** - * Builds a {@link VertxAsyncHttpClient}. - */ -public class VertxAsyncHttpClientBuilder { - private static final ClientLogger LOGGER = new ClientLogger(VertxAsyncHttpClientBuilder.class); - private static final Pattern NON_PROXY_HOSTS_SPLIT = Pattern.compile("(?<!\\\\)\\|"); - private static final Pattern NON_PROXY_HOST_DESANITIZE = Pattern.compile("(\\?|\\\\|\\(|\\)|\\\\E|\\\\Q|\\.\\.)"); - private static final Pattern NON_PROXY_HOST_DOT_STAR = Pattern.compile("(\\.\\*)"); - private static final long DEFAULT_CONNECT_TIMEOUT; - private static final long DEFAULT_WRITE_TIMEOUT; - private static final long DEFAULT_READ_TIMEOUT; - - static { - Configuration configuration = Configuration.getGlobalConfiguration(); - DEFAULT_CONNECT_TIMEOUT = getDefaultTimeoutFromEnvironment(configuration, - PROPERTY_AZURE_REQUEST_CONNECT_TIMEOUT, Duration.ofSeconds(10), LOGGER).toMillis(); - DEFAULT_WRITE_TIMEOUT = getDefaultTimeoutFromEnvironment(configuration, PROPERTY_AZURE_REQUEST_WRITE_TIMEOUT, - Duration.ofSeconds(60), LOGGER).getSeconds(); - DEFAULT_READ_TIMEOUT = getDefaultTimeoutFromEnvironment(configuration, PROPERTY_AZURE_REQUEST_READ_TIMEOUT, - Duration.ofSeconds(60), LOGGER).getSeconds(); - } - - private Duration readIdleTimeout; - private Duration writeIdleTimeout; - private Duration connectTimeout; - private Duration idleTimeout = Duration.ofSeconds(60); - private ProxyOptions proxyOptions; - private Configuration configuration; - private HttpClientOptions httpClientOptions; - private Vertx vertx; - - /** - * Sets the read idle timeout. - * - * The default read idle timeout is 60 seconds. - * - * @param readIdleTimeout the read idle timeout - * @return the updated VertxAsyncHttpClientBuilder object - */ - public VertxAsyncHttpClientBuilder readIdleTimeout(Duration readIdleTimeout) { - this.readIdleTimeout = readIdleTimeout; - return this; - } - - /** - * Sets the write idle timeout. - * - * The default read idle timeout is 60 seconds. - * - * @param writeIdleTimeout the write idle timeout - * @return the updated VertxAsyncHttpClientBuilder object - */ - public VertxAsyncHttpClientBuilder writeIdleTimeout(Duration writeIdleTimeout) { - this.writeIdleTimeout = writeIdleTimeout; - return this; - } - - /** - * Sets the connect timeout. - * - * The default connect timeout is 10 seconds. - * - * @param connectTimeout the connection timeout - * @return the updated VertxAsyncHttpClientBuilder object - */ - public VertxAsyncHttpClientBuilder connectTimeout(Duration connectTimeout) { - this.connectTimeout = connectTimeout; - return this; - } - - /** - * Sets the connection idle timeout. - * - * The default connect timeout is 60 seconds. - * - * @param idleTimeout the connection idle timeout - * @return the updated VertxAsyncHttpClientBuilder object - */ - public VertxAsyncHttpClientBuilder idleTimeout(Duration idleTimeout) { - this.idleTimeout = idleTimeout; - return this; - } - - /** - * Sets proxy configuration. - * - * @param proxyOptions The proxy configuration to use. - * @return The updated VertxAsyncHttpClientBuilder object. - */ - public VertxAsyncHttpClientBuilder proxy(ProxyOptions proxyOptions) { - this.proxyOptions = proxyOptions; - return this; - } - - /** - * Sets the configuration store that is used during construction of the HTTP client. - * <p> - * The default configuration store is a clone of the - * {@link Configuration#getGlobalConfiguration() global configuration store}, use {@link Configuration#NONE} to - * bypass using configuration settings during construction. - * - * @param configuration The configuration store. - * @return The updated VertxAsyncHttpClientBuilder object. - */ - public VertxAsyncHttpClientBuilder configuration(Configuration configuration) { - this.configuration = configuration; - return this; - } - - /** - * Sets custom {@link HttpClientOptions} for the constructed {@link io.vertx.core.http.HttpClient}. - * - * @param httpClientOptions The options of the web client. - * @return The updated VertxAsyncHttpClientBuilder object - */ - public VertxAsyncHttpClientBuilder httpClientOptions(HttpClientOptions httpClientOptions) { - this.httpClientOptions = httpClientOptions; - return this; - } - - /** - * Sets a custom {@link Vertx} instance that the constructed {@link io.vertx.core.http.HttpClient} will be created - * with. - * - * @param vertx The vertx instance. - * @return The updated VertxAsyncHttpClientBuilder object - */ - public VertxAsyncHttpClientBuilder vertx(Vertx vertx) { - this.vertx = vertx; - return this; - } - - /** - * Creates a new Vert.x {@link HttpClient} instance on every call, using the configuration set in the builder at the - * time of the build method call. - * - * @return A new Vert.x backed {@link HttpClient} instance. - */ - public HttpClient build() { - Vertx configuredVertx = this.vertx; - if (configuredVertx == null) { - ServiceLoader<VertxProvider> vertxProviders = ServiceLoader.load(VertxProvider.class, - VertxProvider.class.getClassLoader()); - Iterator<VertxProvider> iterator = vertxProviders.iterator(); - if (iterator.hasNext()) { - VertxProvider provider = iterator.next(); - configuredVertx = provider.createVertx(); - LOGGER.verbose("Using {} as the VertxProvider.", provider.getClass().getName()); - - while (iterator.hasNext()) { - VertxProvider ignoredProvider = iterator.next(); - LOGGER.warning("Multiple VertxProviders were found on the classpath, ignoring {}.", - ignoredProvider.getClass().getName()); - } - } else { - throw new RuntimeException("Unable to find usable Vertx instance"); - } - } - - if (this.httpClientOptions == null) { - this.httpClientOptions = new HttpClientOptions(); - - if (this.connectTimeout != null) { - this.httpClientOptions.setConnectTimeout((int) this.connectTimeout.toMillis()); - } else { - this.httpClientOptions.setConnectTimeout((int) DEFAULT_CONNECT_TIMEOUT); - } - - if (this.readIdleTimeout != null) { - this.httpClientOptions.setReadIdleTimeout((int) this.readIdleTimeout.getSeconds()); - } else { - this.httpClientOptions.setReadIdleTimeout((int) DEFAULT_READ_TIMEOUT); - } - - if (this.writeIdleTimeout != null) { - this.httpClientOptions.setWriteIdleTimeout((int) this.writeIdleTimeout.getSeconds()); - } else { - this.httpClientOptions.setWriteIdleTimeout((int) DEFAULT_WRITE_TIMEOUT); - } - - this.httpClientOptions.setIdleTimeout((int) this.idleTimeout.getSeconds()); - - Configuration buildConfiguration = (this.configuration == null) - ? Configuration.getGlobalConfiguration() - : configuration; - - ProxyOptions buildProxyOptions = (this.proxyOptions == null) - ? ProxyOptions.fromConfiguration(buildConfiguration, true) - : this.proxyOptions; - - if (buildProxyOptions != null) { - io.vertx.core.net.ProxyOptions vertxProxyOptions = new io.vertx.core.net.ProxyOptions(); - InetSocketAddress proxyAddress = buildProxyOptions.getAddress(); - - if (proxyAddress != null) { - vertxProxyOptions.setHost(proxyAddress.getHostName()); - vertxProxyOptions.setPort(proxyAddress.getPort()); - } - - String proxyUsername = buildProxyOptions.getUsername(); - String proxyPassword = buildProxyOptions.getPassword(); - if (!CoreUtils.isNullOrEmpty(proxyUsername) && !CoreUtils.isNullOrEmpty(proxyPassword)) { - vertxProxyOptions.setUsername(proxyUsername); - vertxProxyOptions.setPassword(proxyPassword); - } - - ProxyOptions.Type type = buildProxyOptions.getType(); - if (type != null) { - try { - ProxyType proxyType = ProxyType.valueOf(type.name()); - vertxProxyOptions.setType(proxyType); - } catch (IllegalArgumentException e) { - throw LOGGER.logExceptionAsError( - new IllegalArgumentException("Unknown Vert.x proxy type: " + type.name(), e)); - } - } - - String nonProxyHosts = buildProxyOptions.getNonProxyHosts(); - if (!CoreUtils.isNullOrEmpty(nonProxyHosts)) { - for (String nonProxyHost : desanitizedNonProxyHosts(nonProxyHosts)) { - this.httpClientOptions.addNonProxyHost(nonProxyHost); - } - } - - this.httpClientOptions.setProxyOptions(vertxProxyOptions); - } - } - - io.vertx.core.http.HttpClient client = configuredVertx.createHttpClient(this.httpClientOptions); - return new VertxAsyncHttpClient(client, configuredVertx); - } - - /** - * Reverses non proxy host string sanitization applied by {@link ProxyOptions}. - * - * This is necessary as Vert.x will apply its own sanitization logic. - * - * @param nonProxyHosts The list of non proxy hosts - * @return String array of desanitized proxy host strings - */ - private String[] desanitizedNonProxyHosts(String nonProxyHosts) { - String desanitzedNonProxyHosts = NON_PROXY_HOST_DESANITIZE.matcher(nonProxyHosts) - .replaceAll(""); - - desanitzedNonProxyHosts = NON_PROXY_HOST_DOT_STAR.matcher(desanitzedNonProxyHosts) - .replaceAll("*"); - - return NON_PROXY_HOSTS_SPLIT.split(desanitzedNonProxyHosts); - } -} diff --git a/extensions-support/azure-core-http-client-vertx/runtime/src/main/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClientProvider.java b/extensions-support/azure-core-http-client-vertx/runtime/src/main/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClientProvider.java deleted file mode 100644 index 83a3fd5d79..0000000000 --- a/extensions-support/azure-core-http-client-vertx/runtime/src/main/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxAsyncHttpClientProvider.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.quarkus.support.azure.core.http.vertx; - -import com.azure.core.http.HttpClient; -import com.azure.core.http.HttpClientProvider; -import com.azure.core.util.Configuration; -import com.azure.core.util.HttpClientOptions; - -/** - * {@link HttpClientProvider} backed by the Vert.x {@link io.vertx.core.http.HttpClient} - */ -public class VertxAsyncHttpClientProvider implements HttpClientProvider { - private static final boolean AZURE_ENABLE_HTTP_CLIENT_SHARING = Configuration.getGlobalConfiguration() - .get("AZURE_ENABLE_HTTP_CLIENT_SHARING", Boolean.FALSE); - private final boolean enableHttpClientSharing; - - // Enum Singleton Pattern - private enum GlobalVertxHttpClient { - HTTP_CLIENT(new VertxAsyncHttpClientBuilder().build()); - - private final HttpClient httpClient; - - GlobalVertxHttpClient(HttpClient httpClient) { - this.httpClient = httpClient; - } - - private HttpClient getHttpClient() { - return httpClient; - } - } - - /** - * For testing purpose only, assigning 'AZURE_ENABLE_HTTP_CLIENT_SHARING' to 'enableHttpClientSharing' for - * 'final' modifier. - */ - public VertxAsyncHttpClientProvider() { - enableHttpClientSharing = AZURE_ENABLE_HTTP_CLIENT_SHARING; - } - - VertxAsyncHttpClientProvider(Configuration configuration) { - enableHttpClientSharing = configuration.get("AZURE_ENABLE_HTTP_CLIENT_SHARING", Boolean.FALSE); - } - - @Override - public HttpClient createInstance() { - if (enableHttpClientSharing) { - return GlobalVertxHttpClient.HTTP_CLIENT.getHttpClient(); - } - return new VertxAsyncHttpClientBuilder().build(); - } - - @Override - public HttpClient createInstance(HttpClientOptions clientOptions) { - if (clientOptions == null) { - return createInstance(); - } - - return new VertxAsyncHttpClientBuilder() - .proxy(clientOptions.getProxyOptions()) - .configuration(clientOptions.getConfiguration()) - .connectTimeout(clientOptions.getConnectTimeout()) - .idleTimeout(clientOptions.getConnectionIdleTimeout()) - .writeIdleTimeout(clientOptions.getWriteTimeout()) - .readIdleTimeout(clientOptions.getReadTimeout()) - .build(); - } -} diff --git a/extensions-support/azure-core-http-client-vertx/runtime/src/main/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxProvider.java b/extensions-support/azure-core-http-client-vertx/runtime/src/main/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxProvider.java deleted file mode 100644 index f7f881e832..0000000000 --- a/extensions-support/azure-core-http-client-vertx/runtime/src/main/java/org/apache/camel/quarkus/support/azure/core/http/vertx/VertxProvider.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.quarkus.support.azure.core.http.vertx; - -import io.vertx.core.Vertx; - -/** - * Service provider interface providing platforms and applications the means to have their own managed - * {@link Vertx} be resolved by the {@link VertxAsyncHttpClientBuilder}. - */ -public interface VertxProvider { - - /** - * Creates a {@link Vertx}. Could either be the result of returning {@code Vertx.vertx()}, - * or returning a {@link Vertx} that was resolved from a dependency injection framework like Spring or CDI. - * - * @return The created {@link Vertx}. - */ - Vertx createVertx(); -} diff --git a/extensions-support/azure-core-http-client-vertx/runtime/src/main/java/org/apache/camel/quarkus/support/azure/core/http/vertx/implementation/BufferedVertxHttpResponse.java b/extensions-support/azure-core-http-client-vertx/runtime/src/main/java/org/apache/camel/quarkus/support/azure/core/http/vertx/implementation/BufferedVertxHttpResponse.java deleted file mode 100644 index bb26009d6e..0000000000 --- a/extensions-support/azure-core-http-client-vertx/runtime/src/main/java/org/apache/camel/quarkus/support/azure/core/http/vertx/implementation/BufferedVertxHttpResponse.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.quarkus.support.azure.core.http.vertx.implementation; - -import java.nio.ByteBuffer; - -import com.azure.core.http.HttpRequest; -import com.azure.core.http.HttpResponse; -import com.azure.core.util.BinaryData; -import io.vertx.core.buffer.Buffer; -import io.vertx.core.http.HttpClientResponse; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - -public final class BufferedVertxHttpResponse extends VertxHttpAsyncResponse { - private final Buffer body; - - public BufferedVertxHttpResponse(HttpRequest azureHttpRequest, HttpClientResponse vertxHttpResponse, Buffer body) { - super(azureHttpRequest, vertxHttpResponse); - this.body = body; - } - - @Override - public BinaryData getBodyAsBinaryData() { - return BinaryData.fromBytes(body.getBytes()); - } - - @Override - public Flux<ByteBuffer> getBody() { - return Flux.defer(() -> { - if (this.body.length() == 0) { - return Flux.empty(); - } - return Flux.just(ByteBuffer.wrap(this.body.getBytes())); - }); - } - - @Override - public Mono<byte[]> getBodyAsByteArray() { - return Mono.defer(() -> { - if (this.body.length() == 0) { - return Mono.empty(); - } - return Mono.just(this.body.getBytes()); - }); - } - - @Override - public HttpResponse buffer() { - return this; - } -} diff --git a/extensions-support/azure-core-http-client-vertx/runtime/src/main/java/org/apache/camel/quarkus/support/azure/core/http/vertx/implementation/VertxHttpAsyncResponse.java b/extensions-support/azure-core-http-client-vertx/runtime/src/main/java/org/apache/camel/quarkus/support/azure/core/http/vertx/implementation/VertxHttpAsyncResponse.java deleted file mode 100644 index e872b0826f..0000000000 --- a/extensions-support/azure-core-http-client-vertx/runtime/src/main/java/org/apache/camel/quarkus/support/azure/core/http/vertx/implementation/VertxHttpAsyncResponse.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.quarkus.support.azure.core.http.vertx.implementation; - -import java.nio.ByteBuffer; - -import com.azure.core.http.HttpRequest; -import com.azure.core.util.FluxUtil; -import io.vertx.core.http.HttpClientResponse; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - -/** - * Default HTTP response for Vert.x. - */ -public class VertxHttpAsyncResponse extends VertxHttpResponseBase { - public VertxHttpAsyncResponse(HttpRequest azureHttpRequest, HttpClientResponse vertxHttpResponse) { - super(azureHttpRequest, vertxHttpResponse); - vertxHttpResponse.pause(); - } - - @Override - public Flux<ByteBuffer> getBody() { - return streamResponseBody(); - } - - @Override - public Mono<byte[]> getBodyAsByteArray() { - return FluxUtil.collectBytesFromNetworkResponse(streamResponseBody(), getHeaders()) - .flatMap(bytes -> (bytes == null || bytes.length == 0) - ? Mono.empty() - : Mono.just(bytes)); - } - - private Flux<ByteBuffer> streamResponseBody() { - HttpClientResponse vertxHttpResponse = getVertxHttpResponse(); - return Flux.create(sink -> { - vertxHttpResponse.handler(buffer -> { - sink.next(buffer.getByteBuf().nioBuffer()); - }).endHandler(event -> { - sink.complete(); - }).exceptionHandler(sink::error); - - vertxHttpResponse.resume(); - }); - } -} diff --git a/extensions-support/azure-core-http-client-vertx/runtime/src/main/java/org/apache/camel/quarkus/support/azure/core/http/vertx/implementation/VertxHttpResponseBase.java b/extensions-support/azure-core-http-client-vertx/runtime/src/main/java/org/apache/camel/quarkus/support/azure/core/http/vertx/implementation/VertxHttpResponseBase.java deleted file mode 100644 index a6b5938156..0000000000 --- a/extensions-support/azure-core-http-client-vertx/runtime/src/main/java/org/apache/camel/quarkus/support/azure/core/http/vertx/implementation/VertxHttpResponseBase.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.quarkus.support.azure.core.http.vertx.implementation; - -import java.nio.charset.Charset; - -import com.azure.core.http.HttpHeaders; -import com.azure.core.http.HttpRequest; -import com.azure.core.http.HttpResponse; -import com.azure.core.util.CoreUtils; -import io.vertx.core.MultiMap; -import io.vertx.core.http.HttpClientResponse; -import reactor.core.publisher.Mono; - -abstract class VertxHttpResponseBase extends HttpResponse { - - private final HttpClientResponse vertxHttpResponse; - private final HttpHeaders headers; - - VertxHttpResponseBase(HttpRequest azureHttpRequest, HttpClientResponse vertxHttpResponse) { - super(azureHttpRequest); - this.vertxHttpResponse = vertxHttpResponse; - this.headers = fromVertxHttpHeaders(vertxHttpResponse.headers()); - } - - private HttpHeaders fromVertxHttpHeaders(MultiMap headers) { - HttpHeaders azureHeaders = new HttpHeaders(); - headers.names().forEach(name -> azureHeaders.set(name, headers.getAll(name))); - return azureHeaders; - } - - protected HttpClientResponse getVertxHttpResponse() { - return this.vertxHttpResponse; - } - - @Override - public int getStatusCode() { - return this.vertxHttpResponse.statusCode(); - } - - @Override - public String getHeaderValue(String name) { - return this.headers.getValue(name); - } - - @Override - public HttpHeaders getHeaders() { - return this.headers; - } - - @Override - public final Mono<String> getBodyAsString() { - return getBodyAsByteArray().map(bytes -> CoreUtils.bomAwareToString(bytes, getHeaderValue("Content-Type"))); - } - - @Override - public final Mono<String> getBodyAsString(Charset charset) { - return getBodyAsByteArray().map(bytes -> CoreUtils.bomAwareToString(bytes, charset.toString())); - } -} diff --git a/extensions-support/azure-core-http-client-vertx/runtime/src/main/resources/META-INF/services/com.azure.core.http.HttpClientProvider b/extensions-support/azure-core-http-client-vertx/runtime/src/main/resources/META-INF/services/com.azure.core.http.HttpClientProvider deleted file mode 100644 index 98565fba0c..0000000000 --- a/extensions-support/azure-core-http-client-vertx/runtime/src/main/resources/META-INF/services/com.azure.core.http.HttpClientProvider +++ /dev/null @@ -1 +0,0 @@ -org.apache.camel.quarkus.support.azure.core.http.vertx.VertxAsyncHttpClientProvider \ No newline at end of file diff --git a/extensions-support/azure-core-http-client-vertx/runtime/src/main/resources/META-INF/services/org.apache.camel.quarkus.support.azure.core.http.vertx.VertxProvider b/extensions-support/azure-core-http-client-vertx/runtime/src/main/resources/META-INF/services/com.azure.core.http.vertx.VertxProvider similarity index 100% rename from extensions-support/azure-core-http-client-vertx/runtime/src/main/resources/META-INF/services/org.apache.camel.quarkus.support.azure.core.http.vertx.VertxProvider rename to extensions-support/azure-core-http-client-vertx/runtime/src/main/resources/META-INF/services/com.azure.core.http.vertx.VertxProvider diff --git a/integration-test-groups/azure/azure-storage-blob/src/main/resources/application.properties b/integration-test-groups/azure/azure-storage-blob/src/main/resources/application.properties index 23c1c40c23..128423dca1 100644 --- a/integration-test-groups/azure/azure-storage-blob/src/main/resources/application.properties +++ b/integration-test-groups/azure/azure-storage-blob/src/main/resources/application.properties @@ -22,4 +22,4 @@ azurite.storage.account.name = devstoreaccount1 azurite.storage.account.key = Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw== azure.storage.account-name = ${AZURE_STORAGE_ACCOUNT_NAME:${azurite.storage.account.name}} -azure.storage.account-key = ${AZURE_STORAGE_ACCOUNT_KEY:${azurite.storage.account.key}} +azure.storage.account-key = ${AZURE_STORAGE_ACCOUNT_KEY:${azurite.storage.account.key}} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 1de47d046d..a4bb58fe54 100644 --- a/pom.xml +++ b/pom.xml @@ -75,6 +75,7 @@ <azure-core.version>1.32.0</azure-core.version><!-- @sync com.azure:azure-sdk-bom:${azure-sdk-bom.version} dep:com.azure:azure-core --> <azure-core-test.version>1.11.0</azure-core-test.version> <azure-identity.version>1.6.0</azure-identity.version><!-- @sync com.azure:azure-sdk-bom:${azure-sdk-bom.version} dep:com.azure:azure-identity --> + <azure-core-http-vertx.version>1.0.0-beta.1</azure-core-http-vertx.version> <!-- TODO: https://github.com/apache/camel-quarkus/issues/4181 --> <cassandra-driver-test.version>3.7.1</cassandra-driver-test.version><!-- Keep in sync with testcontainers instead of Debezium bom --> <bouncycastle.version>1.70</bouncycastle.version><!-- @sync io.quarkus:quarkus-bom:${quarkus.version} dep:org.bouncycastle:bcprov-jdk15on --> <caffeine.version>2.9.3</caffeine.version><!-- @sync io.quarkus:quarkus-bom:${quarkus.version} dep:com.github.ben-manes.caffeine:caffeine --> diff --git a/poms/bom/pom.xml b/poms/bom/pom.xml index 11b70d43c7..92324f0cd0 100644 --- a/poms/bom/pom.xml +++ b/poms/bom/pom.xml @@ -9858,6 +9858,12 @@ </exclusion> </exclusions> </dependency> + <!-- TODO: Remove this when azure-core-http-vertx is part of azure-sdk-bom https://github.com/apache/camel-quarkus/issues/4181 --> + <dependency> + <groupId>com.azure</groupId> + <artifactId>azure-core-http-vertx</artifactId> + <version>${azure-core-http-vertx.version}</version> + </dependency> <dependency> <groupId>com.esotericsoftware.kryo</groupId> <artifactId>kryo</artifactId> diff --git a/poms/bom/src/main/generated/flattened-full-pom.xml b/poms/bom/src/main/generated/flattened-full-pom.xml index 352dbb2966..e9f57f63cd 100644 --- a/poms/bom/src/main/generated/flattened-full-pom.xml +++ b/poms/bom/src/main/generated/flattened-full-pom.xml @@ -9793,6 +9793,11 @@ </exclusion> </exclusions> </dependency> + <dependency> + <groupId>com.azure</groupId><!-- org.apache.camel.quarkus:camel-quarkus-bom:${project.version} --> + <artifactId>azure-core-http-vertx</artifactId><!-- org.apache.camel.quarkus:camel-quarkus-bom:${project.version} --> + <version>1.0.0-beta.1</version><!-- org.apache.camel.quarkus:camel-quarkus-bom:${project.version} --> + </dependency> <dependency> <groupId>com.esotericsoftware.kryo</groupId><!-- org.apache.camel.quarkus:camel-quarkus-bom:${project.version} --> <artifactId>kryo</artifactId><!-- org.apache.camel.quarkus:camel-quarkus-bom:${project.version} --> diff --git a/poms/bom/src/main/generated/flattened-reduced-pom.xml b/poms/bom/src/main/generated/flattened-reduced-pom.xml index ee72a49e7e..be094bd327 100644 --- a/poms/bom/src/main/generated/flattened-reduced-pom.xml +++ b/poms/bom/src/main/generated/flattened-reduced-pom.xml @@ -9793,6 +9793,11 @@ </exclusion> </exclusions> </dependency> + <dependency> + <groupId>com.azure</groupId> + <artifactId>azure-core-http-vertx</artifactId> + <version>1.0.0-beta.1</version> + </dependency> <dependency> <groupId>com.esotericsoftware.kryo</groupId> <artifactId>kryo</artifactId> diff --git a/poms/bom/src/main/generated/flattened-reduced-verbose-pom.xml b/poms/bom/src/main/generated/flattened-reduced-verbose-pom.xml index 80a54b1afb..f21313e1a9 100644 --- a/poms/bom/src/main/generated/flattened-reduced-verbose-pom.xml +++ b/poms/bom/src/main/generated/flattened-reduced-verbose-pom.xml @@ -9793,6 +9793,11 @@ </exclusion> </exclusions> </dependency> + <dependency> + <groupId>com.azure</groupId><!-- org.apache.camel.quarkus:camel-quarkus-bom:${project.version} --> + <artifactId>azure-core-http-vertx</artifactId><!-- org.apache.camel.quarkus:camel-quarkus-bom:${project.version} --> + <version>1.0.0-beta.1</version><!-- org.apache.camel.quarkus:camel-quarkus-bom:${project.version} --> + </dependency> <dependency> <groupId>com.esotericsoftware.kryo</groupId><!-- org.apache.camel.quarkus:camel-quarkus-bom:${project.version} --> <artifactId>kryo</artifactId><!-- org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->