Skip to content
This repository was archived by the owner on Mar 5, 2025. It is now read-only.

Commit e3eb3c2

Browse files
committed
Enable HTTP/2 over TLS in http-client
1 parent 4485325 commit e3eb3c2

File tree

4 files changed

+34
-21
lines changed

4 files changed

+34
-21
lines changed

CHANGES

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ Platform 3.28
1919

2020
We now handle the Retry-After: header of 429 HTTP status codes.
2121

22+
HTTP/2 now works over TLS, negotiating with the server using ALPN.
23+
HTTP/2 may be enabled using the "http-client.http2.enabled" configuration property.
24+
2225
* Maven plugin upgrades
2326

2427
- maven-deploy-plugin to 3.1.3 (was 2.8.2)

http-client/src/main/java/com/proofpoint/http/client/jetty/JettyHttpClient.java

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,17 @@
2424
import org.eclipse.jetty.client.InputStreamResponseListener;
2525
import org.eclipse.jetty.client.Response;
2626
import org.eclipse.jetty.client.Socks4Proxy;
27-
import org.eclipse.jetty.client.transport.HttpClientTransportOverHTTP;
27+
import org.eclipse.jetty.client.transport.HttpClientConnectionFactory;
28+
import org.eclipse.jetty.client.transport.HttpClientTransportDynamic;
2829
import org.eclipse.jetty.client.transport.HttpDestination;
2930
import org.eclipse.jetty.client.transport.HttpExchange;
3031
import org.eclipse.jetty.client.transport.HttpRequest;
3132
import org.eclipse.jetty.client.transport.internal.HttpConnectionOverHTTP;
3233
import org.eclipse.jetty.http.HttpCookieStore;
3334
import org.eclipse.jetty.http2.client.HTTP2Client;
34-
import org.eclipse.jetty.http2.client.transport.HttpClientTransportOverHTTP2;
35+
import org.eclipse.jetty.http2.client.transport.ClientConnectionFactoryOverHTTP2;
3536
import org.eclipse.jetty.io.ArrayByteBufferPool;
37+
import org.eclipse.jetty.io.ClientConnectionFactory;
3638
import org.eclipse.jetty.io.ClientConnector;
3739
import org.eclipse.jetty.util.component.LifeCycle;
3840
import org.eclipse.jetty.util.ssl.SslContextFactory;
@@ -179,22 +181,27 @@ public JettyHttpClient(
179181
sslContextFactory.setTrustAll(true);
180182
}
181183

182-
HttpClientTransport transport;
184+
ClientConnector clientConnector = new ClientConnector();
185+
clientConnector.setSelectors(config.getSelectorCount());
186+
clientConnector.setSslContextFactory(sslContextFactory);
187+
188+
ImmutableList.Builder<ClientConnectionFactory.Info> protocols = ImmutableList.builder();
183189
if (config.isHttp2Enabled()) {
184-
HTTP2Client client = new HTTP2Client();
190+
HTTP2Client client = new HTTP2Client(clientConnector);
185191
client.setInitialSessionRecvWindow(toIntExact(config.getHttp2InitialSessionReceiveWindowSize().toBytes()));
186192
client.setInitialStreamRecvWindow(toIntExact(config.getHttp2InitialStreamReceiveWindowSize().toBytes()));
187193
client.setInputBufferSize(toIntExact(config.getHttp2InputBufferSize().toBytes()));
188-
client.setSelectors(config.getSelectorCount());
189-
transport = new HttpClientTransportOverHTTP2(client);
190-
}
191-
else {
192-
ClientConnector clientConnector = new ClientConnector();
193-
clientConnector.setSelectors(config.getSelectorCount());
194-
clientConnector.setSslContextFactory(sslContextFactory);
195-
transport = new HttpClientTransportOverHTTP(clientConnector);
194+
client.setStreamIdleTimeout(idleTimeoutMillis);
195+
protocols.add(new ClientConnectionFactoryOverHTTP2.HTTP2(client));
196196
}
197197

198+
protocols.add(HttpClientConnectionFactory.HTTP11);
199+
200+
// The order of the protocols indicates the client's preference.
201+
// The first is the most preferred, the last is the least preferred, but
202+
// the protocol version to use can be explicitly specified in the request.
203+
HttpClientTransport transport = new HttpClientTransportDynamic(clientConnector, protocols.build().toArray(new ClientConnectionFactory.Info[0]));
204+
198205
httpClient = new AuthorizationPreservingHttpClient(transport);
199206

200207
// request and response buffer size

http-client/src/test/java/com/proofpoint/http/client/AbstractHttpClientTest.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import com.proofpoint.tracetoken.TraceToken;
1313
import com.proofpoint.units.Duration;
1414
import org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory;
15+
import org.eclipse.jetty.ee10.servlet.ServletContextHandler;
16+
import org.eclipse.jetty.ee10.servlet.ServletHolder;
1517
import org.eclipse.jetty.http2.server.HTTP2CServerConnectionFactory;
1618
import org.eclipse.jetty.http2.server.HTTP2ServerConnectionFactory;
1719
import org.eclipse.jetty.server.ConnectionFactory;
@@ -23,8 +25,6 @@
2325
import org.eclipse.jetty.server.SslConnectionFactory;
2426
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
2527
import org.eclipse.jetty.server.handler.gzip.GzipHandler;
26-
import org.eclipse.jetty.ee10.servlet.ServletContextHandler;
27-
import org.eclipse.jetty.ee10.servlet.ServletHolder;
2828
import org.eclipse.jetty.util.ssl.SslContextFactory;
2929
import org.testng.Assert;
3030
import org.testng.SkipException;
@@ -1292,7 +1292,15 @@ public void testConnectReadRequestWriteJunkHangup()
12921292
public void testDynamicBodySourceConnectWriteRequestClose()
12931293
throws Exception
12941294
{
1295-
try (FakeServer fakeServer = new FakeServer(scheme, host, 1024, null, true)) {
1295+
int bodySize;
1296+
if (createClientConfig().isHttp2Enabled()) {
1297+
// HTTP/2 over TLS has smaller buffers for this
1298+
bodySize = 256;
1299+
} else {
1300+
bodySize = 1024;
1301+
}
1302+
1303+
try (FakeServer fakeServer = new FakeServer(scheme, host, bodySize, null, true)) {
12961304
HttpClientConfig config = createClientConfig();
12971305
config.setConnectTimeout(new Duration(5, SECONDS));
12981306
config.setIdleTimeout(new Duration(5, SECONDS));
@@ -1308,7 +1316,7 @@ public void testDynamicBodySourceConnectWriteRequestClose()
13081316
.setUri(fakeServer.getUri())
13091317
.setBodySource((DynamicBodySource) out -> () -> {
13101318
if (invocation.getAndIncrement() < 100) {
1311-
out.write(new byte[1024]);
1319+
out.write(new byte[bodySize]);
13121320
}
13131321
else {
13141322
out.close();

http-client/src/test/java/com/proofpoint/http/client/jetty/TestJettyHttpsClientHttp2.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,4 @@ protected HttpClientConfig createClientConfig()
1313
return super.createClientConfig()
1414
.setHttp2Enabled(true);
1515
}
16-
17-
@BeforeMethod
18-
public void checkValidConfiguration(){
19-
throw new SkipException("Https is not supported for Http/2");
20-
}
2116
}

0 commit comments

Comments
 (0)