diff --git a/reactor-netty5-core/src/main/java/reactor/netty5/transport/ClientTransportConfig.java b/reactor-netty5-core/src/main/java/reactor/netty5/transport/ClientTransportConfig.java index 2ae75df593..3b52bb324b 100644 --- a/reactor-netty5-core/src/main/java/reactor/netty5/transport/ClientTransportConfig.java +++ b/reactor-netty5-core/src/main/java/reactor/netty5/transport/ClientTransportConfig.java @@ -62,7 +62,7 @@ public int channelHash() { * * @return the {@link ConnectionProvider} */ - public final ConnectionProvider connectionProvider() { + public ConnectionProvider connectionProvider() { return connectionProvider; } diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientConfig.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientConfig.java index 40a11f0fa2..4493fb9239 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientConfig.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientConfig.java @@ -114,6 +114,11 @@ public ChannelOperations.OnSetup channelOperationsProvider() { return (ch, c, msg) -> new HttpClientOperations(ch, c, cookieEncoder, cookieDecoder); } + @Override + public ConnectionProvider connectionProvider() { + return httpConnectionProvider().http1ConnectionProvider(); + } + /** * Return the configured {@link ClientCookieDecoder} or the default {@link ClientCookieDecoder#STRICT}. * @@ -320,7 +325,7 @@ public WebsocketClientSpec websocketClientSpec() { Function uriTagValue; WebsocketClientSpec websocketClientSpec; - HttpClientConfig(ConnectionProvider connectionProvider, Map, ?> options, + HttpClientConfig(HttpConnectionProvider connectionProvider, Map, ?> options, Supplier remoteAddress) { super(connectionProvider, options, remoteAddress); this.acceptGzip = false; @@ -443,6 +448,10 @@ void deferredConf(Function> deferrer) { } } + HttpConnectionProvider httpConnectionProvider() { + return (HttpConnectionProvider) super.connectionProvider(); + } + void protocols(HttpProtocol... protocols) { this.protocols = protocols; int _protocols = 0; diff --git a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientConnect.java b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientConnect.java index 098f445895..38caf34ab6 100644 --- a/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientConnect.java +++ b/reactor-netty5-http/src/main/java/reactor/netty5/http/client/HttpClientConnect.java @@ -55,7 +55,6 @@ import reactor.netty5.channel.AbortedException; import reactor.netty5.http.HttpOperations; import reactor.netty5.http.HttpProtocol; -import reactor.netty5.resources.ConnectionProvider; import reactor.netty5.transport.AddressUtils; import reactor.netty5.transport.ProxyProvider; import reactor.util.Logger; @@ -77,7 +76,7 @@ class HttpClientConnect extends HttpClient { final HttpClientConfig config; - HttpClientConnect(ConnectionProvider provider) { + HttpClientConnect(HttpConnectionProvider provider) { this.config = new HttpClientConfig( provider, Collections.singletonMap(ChannelOption.AUTO_READ, false), @@ -194,7 +193,7 @@ public void subscribe(CoreSubscriber actual) { AddressResolverGroup resolver = _config.resolverInternal(); - _config.connectionProvider() + _config.httpConnectionProvider() .acquire(_config, observer, handler, resolver) .subscribe(new ClientTransportSubscriber(sink)); diff --git a/reactor-netty5-http/src/test/java/reactor/netty5/http/client/HttpClientTest.java b/reactor-netty5-http/src/test/java/reactor/netty5/http/client/HttpClientTest.java index 1f63659f7c..ff5c095979 100644 --- a/reactor-netty5-http/src/test/java/reactor/netty5/http/client/HttpClientTest.java +++ b/reactor-netty5-http/src/test/java/reactor/netty5/http/client/HttpClientTest.java @@ -3057,7 +3057,7 @@ private void doTestIssue1943(HttpProtocol protocol) { HttpClientConfig config = client.configuration(); LoopResources loopResources1 = config.loopResources(); - ConnectionProvider provider1 = ((HttpConnectionProvider) config.connectionProvider()).http1ConnectionProvider(); + ConnectionProvider provider1 = config.connectionProvider(); AddressResolverGroup resolverGroup1 = config.defaultAddressResolverGroup(); try { @@ -3074,7 +3074,7 @@ private void doTestIssue1943(HttpProtocol protocol) { HttpResources.reset(); LoopResources loopResources2 = config.loopResources(); - ConnectionProvider provider2 = ((HttpConnectionProvider) config.connectionProvider()).http1ConnectionProvider(); + ConnectionProvider provider2 = config.connectionProvider(); AddressResolverGroup resolverGroup2 = config.defaultAddressResolverGroup(); assertThat(loopResources1).isNotSameAs(loopResources2); diff --git a/reactor-netty5-http/src/test/java/reactor/netty5/http/client/HttpConnectionProviderTest.java b/reactor-netty5-http/src/test/java/reactor/netty5/http/client/HttpConnectionProviderTest.java index 1f7800df6d..2e87fba4c0 100644 --- a/reactor-netty5-http/src/test/java/reactor/netty5/http/client/HttpConnectionProviderTest.java +++ b/reactor-netty5-http/src/test/java/reactor/netty5/http/client/HttpConnectionProviderTest.java @@ -18,6 +18,7 @@ import org.junit.jupiter.api.Test; import reactor.netty5.http.HttpResources; import reactor.netty5.resources.ConnectionProvider; +import reactor.util.annotation.Nullable; import java.time.Duration; @@ -34,8 +35,7 @@ void maxConnectionsCustomConnectionProvider() { ConnectionProvider provider = ConnectionProvider.create("maxConnectionsCustomConnectionProvider", 1); try { HttpClient client = HttpClient.create(provider); - HttpConnectionProvider configuredConnectionProvider = - (HttpConnectionProvider) client.configuration().connectionProvider(); + HttpConnectionProvider configuredConnectionProvider = client.configuration().httpConnectionProvider(); assertThat(configuredConnectionProvider.maxConnections()) .isEqualTo(provider.maxConnections()); // Http2ConnectionProvider inherits the configuration from the configured provider @@ -51,8 +51,7 @@ void maxConnectionsCustomConnectionProvider() { @Test void maxConnectionsDefaultConnectionProvider() { HttpClient client = HttpClient.create(); - HttpConnectionProvider configuredConnectionProvider = - (HttpConnectionProvider) client.configuration().connectionProvider(); + HttpConnectionProvider configuredConnectionProvider = client.configuration().httpConnectionProvider(); assertThat(configuredConnectionProvider.maxConnections()) .isEqualTo(((ConnectionProvider) HttpResources.get()).maxConnections()); // Http2ConnectionProvider inherits the configuration from HttpResources @@ -66,8 +65,7 @@ void maxConnectionsPerHostCustomConnectionProvider() { ConnectionProvider provider = ConnectionProvider.create("maxConnectionsPerHostCustomConnectionProvider", 1); try { HttpClient client = HttpClient.create(provider); - HttpConnectionProvider configuredConnectionProvider = - (HttpConnectionProvider) client.configuration().connectionProvider(); + HttpConnectionProvider configuredConnectionProvider = client.configuration().httpConnectionProvider(); assertThat(configuredConnectionProvider.maxConnectionsPerHost()) .isEqualTo(provider.maxConnectionsPerHost()); // Http2ConnectionProvider inherits the configuration from the configured provider @@ -83,8 +81,7 @@ void maxConnectionsPerHostCustomConnectionProvider() { @Test void maxConnectionsPerHostDefaultConnectionProvider() { HttpClient client = HttpClient.create(); - HttpConnectionProvider configuredConnectionProvider = - (HttpConnectionProvider) client.configuration().connectionProvider(); + HttpConnectionProvider configuredConnectionProvider = client.configuration().httpConnectionProvider(); assertThat(configuredConnectionProvider.maxConnectionsPerHost()) .isEqualTo(((ConnectionProvider) HttpResources.get()).maxConnectionsPerHost()); // Http2ConnectionProvider inherits the configuration from HttpResources @@ -92,4 +89,43 @@ void maxConnectionsPerHostDefaultConnectionProvider() { .isEqualTo(HttpResources.get().getOrCreateHttp2ConnectionProvider(HTTP2_CONNECTION_PROVIDER_FACTORY) .maxConnectionsPerHost()); } + + @Test + void returnOriginalConnectionProvider() { + testReturnOriginalConnectionProvider(HttpClient.create(), null); + } + + @Test + void returnOriginalConnectionProviderNewConnection() { + ConnectionProvider provider = ConnectionProvider.newConnection(); + testReturnOriginalConnectionProvider(HttpClient.create(provider), provider); + } + + @Test + void returnOriginalConnectionProviderUsingBuilder() { + ConnectionProvider provider = + ConnectionProvider.builder("provider") + .maxConnections(1) + .disposeTimeout(Duration.ofSeconds(1L)) + .pendingAcquireTimeout(Duration.ofSeconds(1L)) + .maxIdleTime(Duration.ofSeconds(1L)) + .maxLifeTime(Duration.ofSeconds(10L)) + .lifo() + .build(); + + testReturnOriginalConnectionProvider(HttpClient.create(provider), provider); + } + + private void testReturnOriginalConnectionProvider(HttpClient httpClient, @Nullable ConnectionProvider originalProvider) { + ConnectionProvider provider = httpClient.configuration().connectionProvider(); + try { + assertThat(provider).isSameAs(originalProvider != null ? originalProvider : HttpResources.get()); + } + finally { + if (originalProvider != null) { + provider.disposeLater() + .block(Duration.ofSeconds(5)); + } + } + } }