Skip to content

Commit ed6446e

Browse files
authored
HTTP client transport simplification
Motivation: The Transport inner class of HttpClient implementation grouping per protocol objects is not longer necessary since those objects are identical regardless of the protocol.
1 parent dc62fc6 commit ed6446e

12 files changed

Lines changed: 161 additions & 170 deletions

vertx-core/src/main/java/io/vertx/core/http/impl/CleanableHttpClient.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
import io.vertx.core.http.*;
1616
import io.vertx.core.http.HttpClientConnection;
1717
import io.vertx.core.internal.VertxInternal;
18-
import io.vertx.core.internal.http.HttpChannelConnector;
18+
import io.vertx.core.internal.http.HttpClientTransport;
1919
import io.vertx.core.internal.http.HttpClientInternal;
2020
import io.vertx.core.internal.net.endpoint.EndpointResolverInternal;
2121
import io.vertx.core.net.ClientSSLOptions;
@@ -103,7 +103,7 @@ public Function<HttpClientResponse, Future<RequestOptions>> redirectHandler() {
103103
}
104104

105105
@Override
106-
public HttpChannelConnector channelConnector() {
106+
public HttpClientTransport channelConnector() {
107107
return delegate.channelConnector();
108108
}
109109

vertx-core/src/main/java/io/vertx/core/http/impl/Http1xOrH2ChannelConnector.java renamed to vertx-core/src/main/java/io/vertx/core/http/impl/Http1xOrH2ClientTransport.java

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
import io.vertx.core.http.impl.http2.multiplex.Http2MultiplexClientChannelInitializer;
3535
import io.vertx.core.internal.ContextInternal;
3636
import io.vertx.core.internal.PromiseInternal;
37-
import io.vertx.core.internal.http.HttpChannelConnector;
37+
import io.vertx.core.internal.http.HttpClientTransport;
3838
import io.vertx.core.internal.http.HttpHeadersInternal;
3939
import io.vertx.core.internal.net.NetClientInternal;
4040
import io.vertx.core.net.*;
@@ -57,12 +57,12 @@
5757
*
5858
* @author <a href="mailto:julien@julienviet.com">Julien Viet</a>
5959
*/
60-
public class Http1xOrH2ChannelConnector implements HttpChannelConnector {
60+
public class Http1xOrH2ClientTransport implements HttpClientTransport {
6161

62-
public static Http1xOrH2ChannelConnector create(NetClientInternal netClient,
63-
HttpClientConfig config,
64-
HttpClientMetrics clientMetrics) {
65-
return new Http1xOrH2ChannelConnector(netClient,
62+
public static Http1xOrH2ClientTransport create(NetClientInternal netClient,
63+
HttpClientConfig config,
64+
HttpClientMetrics clientMetrics) {
65+
return new Http1xOrH2ClientTransport(netClient,
6666
config.getTracingPolicy(),
6767
config.isDecompressionSupported(),
6868
config.getLogActivity(),
@@ -89,18 +89,18 @@ public static Http1xOrH2ChannelConnector create(NetClientInternal netClient,
8989
private final HttpClientMetrics clientMetrics;
9090
private final NetClientInternal netClient;
9191

92-
public Http1xOrH2ChannelConnector(NetClientInternal netClient,
93-
TracingPolicy tracingPolicy,
94-
boolean useDecompression,
95-
boolean logActivity,
96-
ByteBufFormat logFormat,
97-
boolean forceSni,
98-
Http1ClientConfig http1Config,
99-
Http2ClientConfig http2Config,
100-
Duration idleTimeout,
101-
Duration readIdleTimeout,
102-
Duration writeIdleTimeout,
103-
HttpClientMetrics clientMetrics) {
92+
public Http1xOrH2ClientTransport(NetClientInternal netClient,
93+
TracingPolicy tracingPolicy,
94+
boolean useDecompression,
95+
boolean logActivity,
96+
ByteBufFormat logFormat,
97+
boolean forceSni,
98+
Http1ClientConfig http1Config,
99+
Http2ClientConfig http2Config,
100+
Duration idleTimeout,
101+
Duration readIdleTimeout,
102+
Duration writeIdleTimeout,
103+
HttpClientMetrics clientMetrics) {
104104

105105
if (!http1Config.isKeepAlive() && http1Config.isPipelining()) {
106106
throw new IllegalStateException("Cannot have pipelining with no keep alive");
@@ -221,7 +221,7 @@ public Future<HttpClientConnection> wrap(ContextInternal context, HttpConnectPar
221221
return promise.future();
222222
}
223223

224-
public Future<HttpClientConnection> httpConnect(ContextInternal context, SocketAddress server, HostAndPort authority, HttpConnectParams params, ClientMetrics<?, ?, ?> metrics) {
224+
public Future<HttpClientConnection> connect(ContextInternal context, SocketAddress server, HostAndPort authority, HttpConnectParams params, ClientMetrics<?, ?, ?> metrics) {
225225

226226
if (params.sslOptions != null && !params.sslOptions.isUseAlpn() && params.ssl && params.protocol == HttpVersion.HTTP_2) {
227227
return context.failedFuture("Must enable ALPN when using H2");

vertx-core/src/main/java/io/vertx/core/http/impl/Http3ChannelConnector.java renamed to vertx-core/src/main/java/io/vertx/core/http/impl/Http3ClientTransport.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,18 @@
1313
import io.netty.handler.codec.http3.Http3;
1414
import io.vertx.core.Future;
1515
import io.vertx.core.Promise;
16-
import io.vertx.core.http.Http3ClientOptions;
1716
import io.vertx.core.http.Http3Settings;
1817
import io.vertx.core.http.impl.config.HttpClientConfig;
1918
import io.vertx.core.http.impl.http3.Http3ClientConnection;
2019
import io.vertx.core.internal.ContextInternal;
2120
import io.vertx.core.internal.VertxInternal;
22-
import io.vertx.core.internal.http.HttpChannelConnector;
21+
import io.vertx.core.internal.http.HttpClientTransport;
2322
import io.vertx.core.internal.quic.QuicConnectionInternal;
2423
import io.vertx.core.net.*;
2524
import io.vertx.core.net.impl.quic.QuicClientImpl;
2625
import io.vertx.core.spi.metrics.ClientMetrics;
2726
import io.vertx.core.spi.metrics.HttpClientMetrics;
2827
import io.vertx.core.spi.metrics.TransportMetrics;
29-
import io.vertx.core.spi.metrics.VertxMetrics;
3028
import io.vertx.core.spi.observability.HttpRequest;
3129
import io.vertx.core.spi.observability.HttpResponse;
3230

@@ -36,7 +34,7 @@
3634
import java.util.concurrent.locks.ReentrantLock;
3735
import java.util.function.BiFunction;
3836

39-
public class Http3ChannelConnector implements HttpChannelConnector {
37+
public class Http3ClientTransport implements HttpClientTransport {
4038

4139
private final VertxInternal vertx;
4240
private final HttpClientMetrics<?, ?, ?> clientMetrics;
@@ -46,7 +44,7 @@ public class Http3ChannelConnector implements HttpChannelConnector {
4644
private final long keepAliveTimeoutMillis;
4745
private final Http3Settings localSettings;
4846

49-
public Http3ChannelConnector(VertxInternal vertxInternal, HttpClientMetrics<?, ?, ?> clientMetrics, HttpClientConfig options) {
47+
public Http3ClientTransport(VertxInternal vertxInternal, HttpClientMetrics<?, ?, ?> clientMetrics, HttpClientConfig options) {
5048

5149
ClientSSLOptions sslOptions = options.getSslOptions()
5250
.copy()
@@ -83,7 +81,7 @@ public Http3ChannelConnector(VertxInternal vertxInternal, HttpClientMetrics<?, ?
8381
}
8482

8583
@Override
86-
public Future<HttpClientConnection> httpConnect(ContextInternal context, SocketAddress server, HostAndPort authority, HttpConnectParams params, ClientMetrics<?, ?, ?> metrics) {
84+
public Future<HttpClientConnection> connect(ContextInternal context, SocketAddress server, HostAndPort authority, HttpConnectParams params, ClientMetrics<?, ?, ?> metrics) {
8785

8886
lock.lock();
8987
Future<QuicClient> fut = clientFuture;

vertx-core/src/main/java/io/vertx/core/http/impl/HttpClientBuilderInternal.java

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import io.vertx.core.internal.CloseFuture;
1010
import io.vertx.core.internal.ContextInternal;
1111
import io.vertx.core.internal.VertxInternal;
12+
import io.vertx.core.internal.http.HttpClientTransport;
1213
import io.vertx.core.internal.http.HttpClientInternal;
1314
import io.vertx.core.internal.net.NetClientInternal;
1415
import io.vertx.core.net.ProxyOptions;
@@ -116,11 +117,12 @@ private EndpointResolver endpointResolver(HttpClientConfig co) {
116117
return null;
117118
}
118119

119-
private HttpClientImpl createHttpClientImpl(HttpClientMetrics<?, ?, ?> metrics,
120+
private HttpClientImpl createHttpClientImpl(HttpClientConfig clientConfig,
121+
HttpClientMetrics<?, ?, ?> metrics,
120122
EndpointResolver resolver,
121123
Function<HttpClientResponse, Future<RequestOptions>> redirectHandler,
122-
HttpClientImpl.Transport config,
123-
HttpClientImpl.Transport quicTransport) {
124+
HttpClientTransport tcpTransport,
125+
HttpClientTransport quicTransport) {
124126
boolean followAlternativeServices;
125127
ProxyOptions proxyOptions;
126128
List<String> nonProxyHosts;
@@ -136,8 +138,28 @@ private HttpClientImpl createHttpClientImpl(HttpClientMetrics<?, ?, ?> metrics,
136138
PoolOptions po;
137139
po = poolOptions != null ? poolOptions : new PoolOptions();
138140
HttpClientOptions options = HttpClientBuilderInternal.this.clientOptions;
139-
return new HttpClientImpl(vertx, resolver, redirectHandler, metrics, po,
140-
proxyOptions, nonProxyHosts, loadBalancer, followAlternativeServices, resolverKeepAlive, config, quicTransport) {
141+
Handler<HttpConnection> connectHandler = connectionHandler(clientConfig);
142+
return new HttpClientImpl(
143+
vertx,
144+
resolver,
145+
redirectHandler,
146+
metrics,
147+
po,
148+
proxyOptions,
149+
nonProxyHosts,
150+
loadBalancer,
151+
followAlternativeServices,
152+
resolverKeepAlive,
153+
clientConfig.isVerifyHost(),
154+
clientConfig.isSsl(),
155+
clientConfig.getDefaultHost(),
156+
clientConfig.getDefaultPort(),
157+
clientConfig.getMaxRedirects(),
158+
clientConfig.getDefaultProtocolVersion(),
159+
clientConfig.getSslOptions(),
160+
connectHandler,
161+
tcpTransport,
162+
quicTransport) {
141163
@Override
142164
public HttpClientOptions options() {
143165
return options == null ? new HttpClientOptions() : new HttpClientOptions(options);
@@ -175,7 +197,9 @@ private Handler<HttpConnection> connectionHandler(HttpClientConfig options) {
175197
Handler<HttpConnection> handler = connectHandler;
176198
if (windowSize > 0) {
177199
return connection -> {
178-
connection.setWindowSize(windowSize);
200+
if (connection.protocolVersion() == HttpVersion.HTTP_2) {
201+
connection.setWindowSize(windowSize);
202+
}
179203
if (handler != null) {
180204
handler.handle(connection);
181205
}
@@ -193,31 +217,17 @@ public HttpClientAgent build() {
193217
co = new HttpClientConfig(new HttpClientOptions());
194218
}
195219

196-
// Copy options here ????
197-
HttpClientImpl.Transport quicTransport;
220+
HttpClientTransport quicTransport;
198221
HttpClientMetrics<?, ?, ?> metrics;
199222
if (co.getHttp3Config() != null) {
200223
metrics = vertx.metrics() != null ? vertx.metrics().createHttpClientMetrics(new HttpClientOptions()) : null;
201-
quicTransport = new HttpClientImpl.Transport(
202-
connectHandler,
203-
new Http3ChannelConnector(vertx, metrics, co),
204-
co.isVerifyHost(),
205-
true,
206-
co.getDefaultHost(),
207-
co.getDefaultPort(),
208-
co.getMaxRedirects(),
209-
HttpVersion.HTTP_3,
210-
co.getSslOptions()
211-
);
224+
quicTransport = new Http3ClientTransport(vertx, metrics, co);
212225
} else {
213226
quicTransport = null;
214227
metrics = null;
215-
if (co == null) {
216-
co = new HttpClientConfig();
217-
}
218228
}
219229

220-
HttpClientImpl.Transport transport;
230+
HttpClientTransport transport;
221231
String shared;
222232
EndpointResolver resolver;
223233
if (co.getHttp1Config() != null && co.getHttp2Config() != null) {
@@ -229,40 +239,30 @@ public HttpClientAgent build() {
229239
}
230240
NetClientConfig netClientConfig = netClientConfig(co);
231241
NetClientInternal tcpClient = new NetClientBuilder(vertx, netClientConfig.setProxyOptions(null)).metrics(metrics).build();
232-
Handler<HttpConnection> connectHandler = connectionHandler(co);
233-
transport = new HttpClientImpl.Transport(
234-
connectHandler,
235-
Http1xOrH2ChannelConnector.create(tcpClient, co, metrics),
236-
co.isVerifyHost(),
237-
co.isSsl(),
238-
co.getDefaultHost(),
239-
co.getDefaultPort(),
240-
co.getMaxRedirects(),
241-
co.getDefaultProtocolVersion(),
242-
co.getSslOptions()
243-
);
242+
transport = Http1xOrH2ClientTransport.create(tcpClient, co, metrics);
244243
} else {
245244
resolver = null;
246245
transport = null;
247246
shared = null;
248247
}
249248

250249

250+
HttpClientConfig co2 = co;
251251
CloseFuture cf = resolveCloseFuture();
252252
HttpClientAgent client;
253253
Closeable closeable;
254254
if (shared != null) {
255255
CloseFuture closeFuture = new CloseFuture();
256256
HttpClientMetrics<?, ?, ?> m = metrics;
257257
client = vertx.createSharedResource("__vertx.shared.httpClients", co.getName(), closeFuture, cf_ -> {
258-
HttpClientImpl impl = createHttpClientImpl(m, resolver, redirectHandler, transport, quicTransport);
258+
HttpClientImpl impl = createHttpClientImpl(co2, m, resolver, redirectHandler, transport, quicTransport);
259259
cf_.add(completion -> impl.close().onComplete(completion));
260260
return impl;
261261
});
262262
client = new CleanableHttpClient((HttpClientInternal) client, vertx.cleaner(), (timeout, timeunit) -> closeFuture.close());
263263
closeable = closeFuture;
264264
} else {
265-
HttpClientImpl impl = createHttpClientImpl(metrics, resolver, redirectHandler, transport, quicTransport);
265+
HttpClientImpl impl = createHttpClientImpl(co2, metrics, resolver, redirectHandler, transport, quicTransport);
266266
closeable = impl;
267267
client = new CleanableHttpClient(impl, vertx.cleaner(), impl::shutdown);
268268
}

0 commit comments

Comments
 (0)