diff --git a/eng/code-quality-reports/src/main/resources/spotbugs/spotbugs-exclude.xml b/eng/code-quality-reports/src/main/resources/spotbugs/spotbugs-exclude.xml index 963bbd257ed1..7c4b7f83b48e 100755 --- a/eng/code-quality-reports/src/main/resources/spotbugs/spotbugs-exclude.xml +++ b/eng/code-quality-reports/src/main/resources/spotbugs/spotbugs-exclude.xml @@ -1836,7 +1836,7 @@ - diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/GatewayConnectionConfig.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/GatewayConnectionConfig.java index 5dcfc2d1be6d..7be90be45a44 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/GatewayConnectionConfig.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/GatewayConnectionConfig.java @@ -3,7 +3,8 @@ package com.azure.cosmos; -import java.net.InetSocketAddress; +import com.azure.core.http.ProxyOptions; + import java.time.Duration; /** @@ -18,7 +19,7 @@ public final class GatewayConnectionConfig { private Duration requestTimeout; private int maxConnectionPoolSize; private Duration idleConnectionTimeout; - private InetSocketAddress inetSocketProxyAddress; + private ProxyOptions proxy; /** * Constructor. @@ -103,12 +104,12 @@ public GatewayConnectionConfig setIdleConnectionTimeout(Duration idleConnectionT } /** - * Gets the InetSocketAddress of proxy server. + * Gets the proxy options which contain the InetSocketAddress of proxy server. * - * @return the value of proxyHost. + * @return the proxy options. */ - public InetSocketAddress getProxy() { - return this.inetSocketProxyAddress; + public ProxyOptions getProxy() { + return this.proxy; } /** @@ -119,18 +120,26 @@ public InetSocketAddress getProxy() { * @return the {@link GatewayConnectionConfig}. */ - public GatewayConnectionConfig setProxy(InetSocketAddress proxy) { - this.inetSocketProxyAddress = proxy; + public GatewayConnectionConfig setProxy(ProxyOptions proxy) { + if (proxy.getType() != ProxyOptions.Type.HTTP) { + throw new IllegalArgumentException("Only http proxy type is supported."); + } + + this.proxy = proxy; return this; } @Override public String toString() { + String proxyType = proxy != null ? proxy.getType().toString() : null; + String proxyAddress = proxy != null ? proxy.getAddress().toString() : null; + return "GatewayConnectionConfig{" + "requestTimeout=" + requestTimeout + ", maxConnectionPoolSize=" + maxConnectionPoolSize + ", idleConnectionTimeout=" + idleConnectionTimeout + - ", inetSocketProxyAddress=" + inetSocketProxyAddress + + ", proxyType=" + proxyType + + ", inetSocketProxyAddress=" + proxyAddress + '}'; } } diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/ConnectionPolicy.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/ConnectionPolicy.java index d4154305eb64..097943296d7b 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/ConnectionPolicy.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/ConnectionPolicy.java @@ -3,12 +3,12 @@ package com.azure.cosmos.implementation; +import com.azure.core.http.ProxyOptions; import com.azure.cosmos.ConnectionMode; import com.azure.cosmos.DirectConnectionConfig; import com.azure.cosmos.GatewayConnectionConfig; import com.azure.cosmos.ThrottlingRetryOptions; -import java.net.InetSocketAddress; import java.time.Duration; import java.util.Collections; import java.util.List; @@ -37,7 +37,7 @@ public final class ConnectionPolicy { private int maxConnectionPoolSize = DEFAULT_MAX_POOL_SIZE; private Duration requestTimeout = DEFAULT_REQUEST_TIMEOUT; private Duration idleConnectionTimeout = DEFAULT_IDLE_CONNECTION_TIMEOUT; - private InetSocketAddress inetSocketProxyAddress; + private ProxyOptions proxy; // Direct connection config properties private Duration connectionTimeout; @@ -54,7 +54,7 @@ public ConnectionPolicy(GatewayConnectionConfig gatewayConnectionConfig) { this.idleConnectionTimeout = gatewayConnectionConfig.getIdleConnectionTimeout(); this.maxConnectionPoolSize = gatewayConnectionConfig.getMaxConnectionPoolSize(); this.requestTimeout = gatewayConnectionConfig.getRequestTimeout(); - this.inetSocketProxyAddress = gatewayConnectionConfig.getProxy(); + this.proxy = gatewayConnectionConfig.getProxy(); } public ConnectionPolicy(DirectConnectionConfig directConnectionConfig) { @@ -350,12 +350,12 @@ public ConnectionPolicy setPreferredRegions(List preferredRegions) { } /** - * Gets the InetSocketAddress of proxy server. + * Gets the proxy options which contain the InetSocketAddress of proxy server. * - * @return the value of proxyHost. + * @return the proxy options. */ - public InetSocketAddress getProxy() { - return this.inetSocketProxyAddress; + public ProxyOptions getProxy() { + return this.proxy; } /** @@ -366,8 +366,8 @@ public InetSocketAddress getProxy() { * @return the ConnectionPolicy. */ - public ConnectionPolicy setProxy(InetSocketAddress proxy) { - this.inetSocketProxyAddress = proxy; + public ConnectionPolicy setProxy(ProxyOptions proxy) { + this.proxy = proxy; return this; } @@ -473,7 +473,8 @@ public String toString() { ", endpointDiscoveryEnabled=" + endpointDiscoveryEnabled + ", preferredRegions=" + preferredRegions + ", multipleWriteRegionsEnabled=" + multipleWriteRegionsEnabled + - ", inetSocketProxyAddress=" + inetSocketProxyAddress + + ", proxyType=" + proxy.getType() + + ", inetSocketProxyAddress=" + proxy.getAddress() + ", readRequestsFallbackEnabled=" + readRequestsFallbackEnabled + ", connectionTimeout=" + connectionTimeout + ", idleChannelTimeout=" + idleChannelTimeout + diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/RxDocumentClientImpl.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/RxDocumentClientImpl.java index 0b6eb7cdfdf9..f92550947945 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/RxDocumentClientImpl.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/RxDocumentClientImpl.java @@ -359,7 +359,7 @@ private HttpClient httpClient() { HttpClientConfig httpClientConfig = new HttpClientConfig(this.configs) .withMaxIdleConnectionTimeout(this.connectionPolicy.getIdleConnectionTimeout()) .withPoolSize(this.connectionPolicy.getMaxConnectionPoolSize()) - .withHttpProxy(this.connectionPolicy.getProxy()) + .withProxy(this.connectionPolicy.getProxy()) .withRequestTimeout(this.connectionPolicy.getRequestTimeout()); if (connectionSharingAcrossClientsEnabled) { diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/http/HttpClientConfig.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/http/HttpClientConfig.java index f1c646485494..2eb3dd9537c6 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/http/HttpClientConfig.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/http/HttpClientConfig.java @@ -3,9 +3,9 @@ package com.azure.cosmos.implementation.http; +import com.azure.core.http.ProxyOptions; import com.azure.cosmos.implementation.Configs; -import java.net.InetSocketAddress; import java.time.Duration; /** @@ -18,7 +18,7 @@ public class HttpClientConfig { private Integer maxPoolSize; private Duration maxIdleConnectionTimeout; private Duration requestTimeout; - private InetSocketAddress proxy; + private ProxyOptions proxy; private boolean connectionKeepAlive = true; public HttpClientConfig(Configs configs) { @@ -30,7 +30,7 @@ public HttpClientConfig withPoolSize(int maxPoolSize) { return this; } - public HttpClientConfig withHttpProxy(InetSocketAddress proxy) { + public HttpClientConfig withProxy(ProxyOptions proxy) { this.proxy = proxy; return this; } @@ -66,7 +66,7 @@ public Duration getRequestTimeout() { return requestTimeout; } - public InetSocketAddress getProxy() { + public ProxyOptions getProxy() { return proxy; } diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/http/ReactorNettyClient.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/http/ReactorNettyClient.java index 4cbcb58fd28b..b63fff78dab8 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/http/ReactorNettyClient.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/http/ReactorNettyClient.java @@ -70,7 +70,7 @@ private void configureChannelPipelineHandlers() { if (this.httpClientConfig.getProxy() != null) { tcpClient = - tcpClient.proxy(typeSpec -> typeSpec.type(ProxyProvider.Proxy.HTTP).address(this.httpClientConfig.getProxy())); + tcpClient.proxy(typeSpec -> typeSpec.type(ProxyProvider.Proxy.HTTP).address(this.httpClientConfig.getProxy().getAddress())); } tcpClient = tcpClient.secure(sslContextSpec -> sslContextSpec.sslContext(configs.getSslContext())); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/models/CosmosPartitionKeyTests.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/models/CosmosPartitionKeyTests.java index d30a3e6c082a..eae00feb5ad9 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/models/CosmosPartitionKeyTests.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/models/CosmosPartitionKeyTests.java @@ -80,7 +80,7 @@ private void createContainerWithoutPk() throws URISyntaxException, IOException { HttpClientConfig httpClientConfig = new HttpClientConfig(new Configs()) .withMaxIdleConnectionTimeout(connectionPolicy.getIdleConnectionTimeout()) .withPoolSize(connectionPolicy.getMaxConnectionPoolSize()) - .withHttpProxy(connectionPolicy.getProxy()) + .withProxy(connectionPolicy.getProxy()) .withRequestTimeout(connectionPolicy.getRequestTimeout()); HttpClient httpClient = HttpClient.createFixed(httpClientConfig); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ProxyHostTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ProxyHostTest.java index 8330807a6fa2..24c27af61bd2 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ProxyHostTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/rx/ProxyHostTest.java @@ -2,16 +2,17 @@ // Licensed under the MIT License. package com.azure.cosmos.rx; -import com.azure.cosmos.GatewayConnectionConfig; +import com.azure.core.http.ProxyOptions; import com.azure.cosmos.ConsistencyLevel; import com.azure.cosmos.CosmosAsyncClient; import com.azure.cosmos.CosmosAsyncContainer; import com.azure.cosmos.CosmosAsyncDatabase; -import com.azure.cosmos.models.CosmosItemResponse; import com.azure.cosmos.CosmosClientBuilder; +import com.azure.cosmos.GatewayConnectionConfig; import com.azure.cosmos.implementation.CosmosItemProperties; -import com.azure.cosmos.models.CosmosItemRequestOptions; import com.azure.cosmos.implementation.TestConfigurations; +import com.azure.cosmos.models.CosmosItemRequestOptions; +import com.azure.cosmos.models.CosmosItemResponse; import com.azure.cosmos.rx.proxy.HttpProxyServer; import org.apache.logging.log4j.Level; import org.testng.annotations.AfterClass; @@ -70,7 +71,7 @@ public void createDocumentWithValidHttpProxy() throws Exception { CosmosAsyncClient clientWithRightProxy = null; try { GatewayConnectionConfig gatewayConnectionConfig = new GatewayConnectionConfig(); - gatewayConnectionConfig.setProxy(new InetSocketAddress(PROXY_HOST, PROXY_PORT)); + gatewayConnectionConfig.setProxy(new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress(PROXY_HOST, PROXY_PORT))); clientWithRightProxy = new CosmosClientBuilder().endpoint(TestConfigurations.HOST) .key(TestConfigurations.MASTER_KEY) .gatewayMode(gatewayConnectionConfig) @@ -106,7 +107,7 @@ public void createDocumentWithValidHttpProxyWithNettyWireLogging() throws Except "ProxyStringAppender", consoleWriter); GatewayConnectionConfig gatewayConnectionConfig = new GatewayConnectionConfig(); - gatewayConnectionConfig.setProxy(new InetSocketAddress(PROXY_HOST, PROXY_PORT)); + gatewayConnectionConfig.setProxy(new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress(PROXY_HOST, PROXY_PORT))); clientWithRightProxy = new CosmosClientBuilder().endpoint(TestConfigurations.HOST) .key(TestConfigurations.MASTER_KEY) .gatewayMode(gatewayConnectionConfig) @@ -155,4 +156,16 @@ private CosmosItemProperties getDocumentDefinition() { , uuid, uuid)); return doc; } + + /** + * This test will try to create gateway connection policy via non http proxy. + * + */ + @Test(groups = { "simple" }, timeOut = TIMEOUT, + expectedExceptions = IllegalArgumentException.class, + expectedExceptionsMessageRegExp = "Only http proxy type is supported.") + public void createWithNonHttpProxy() { + GatewayConnectionConfig gatewayConnectionConfig = new GatewayConnectionConfig(); + gatewayConnectionConfig.setProxy(new ProxyOptions(ProxyOptions.Type.SOCKS4, new InetSocketAddress(PROXY_HOST, PROXY_PORT))); + } }