Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ensure HttpClientConfig#connectionProvider returns the original provider used to create HttpClient #2483

Merged
merged 1 commit into from Sep 15, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -60,7 +60,7 @@ public int channelHash() {
*
* @return the {@link ConnectionProvider}
*/
public final ConnectionProvider connectionProvider() {
public ConnectionProvider connectionProvider() {
return connectionProvider;
}

Expand Down
Expand Up @@ -115,6 +115,11 @@ public ChannelOperations.OnSetup channelOperationsProvider() {
return (ch, c, msg) -> new HttpClientOperations(ch, c, cookieEncoder, cookieDecoder);
}

@Override
public ConnectionProvider connectionProvider() {
return httpConnectionProvider().http1ConnectionProvider();
violetagg marked this conversation as resolved.
Show resolved Hide resolved
}

/**
* Return the configured {@link ClientCookieDecoder} or the default {@link ClientCookieDecoder#STRICT}.
*
Expand Down Expand Up @@ -321,7 +326,7 @@ public WebsocketClientSpec websocketClientSpec() {
Function<String, String> uriTagValue;
WebsocketClientSpec websocketClientSpec;

HttpClientConfig(ConnectionProvider connectionProvider, Map<ChannelOption<?>, ?> options,
HttpClientConfig(HttpConnectionProvider connectionProvider, Map<ChannelOption<?>, ?> options,
violetagg marked this conversation as resolved.
Show resolved Hide resolved
Supplier<? extends SocketAddress> remoteAddress) {
super(connectionProvider, options, remoteAddress);
this.acceptGzip = false;
Expand Down Expand Up @@ -444,6 +449,10 @@ void deferredConf(Function<HttpClientConfig, Mono<HttpClientConfig>> deferrer) {
}
}

HttpConnectionProvider httpConnectionProvider() {
return (HttpConnectionProvider) super.connectionProvider();
}

void protocols(HttpProtocol... protocols) {
this.protocols = protocols;
int _protocols = 0;
Expand Down
Expand Up @@ -57,7 +57,6 @@
import reactor.netty.channel.AbortedException;
import reactor.netty.http.HttpOperations;
import reactor.netty.http.HttpProtocol;
import reactor.netty.resources.ConnectionProvider;
import reactor.netty.tcp.TcpClientConfig;
import reactor.netty.transport.AddressUtils;
import reactor.netty.transport.ProxyProvider;
Expand All @@ -81,7 +80,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),
Expand Down Expand Up @@ -265,7 +264,7 @@ public void subscribe(CoreSubscriber<? super Connection> actual) {

AddressResolverGroup<?> resolver = _config.resolverInternal();

_config.connectionProvider()
_config.httpConnectionProvider()
violetagg marked this conversation as resolved.
Show resolved Hide resolved
.acquire(_config, observer, handler, resolver)
.subscribe(new ClientTransportSubscriber(sink));

Expand Down
Expand Up @@ -3165,7 +3165,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 {
Expand All @@ -3182,7 +3182,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);
Expand Down
Expand Up @@ -18,6 +18,7 @@
import org.junit.jupiter.api.Test;
import reactor.netty.http.HttpResources;
import reactor.netty.resources.ConnectionProvider;
import reactor.util.annotation.Nullable;

import java.time.Duration;

Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -83,13 +81,51 @@ 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
assertThat(configuredConnectionProvider.maxConnectionsPerHost())
.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));
}
}
}
}