Skip to content
This repository was archived by the owner on Mar 5, 2025. It is now read-only.
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ Platform 3.28

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

HTTP/2 now works over TLS, negotiating with the server using ALPN.
HTTP/2 may be enabled using the "http-client.http2.enabled" configuration property.

* Maven plugin upgrades

- maven-deploy-plugin to 3.1.3 (was 2.8.2)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,17 @@
import org.eclipse.jetty.client.InputStreamResponseListener;
import org.eclipse.jetty.client.Response;
import org.eclipse.jetty.client.Socks4Proxy;
import org.eclipse.jetty.client.transport.HttpClientTransportOverHTTP;
import org.eclipse.jetty.client.transport.HttpClientConnectionFactory;
import org.eclipse.jetty.client.transport.HttpClientTransportDynamic;
import org.eclipse.jetty.client.transport.HttpDestination;
import org.eclipse.jetty.client.transport.HttpExchange;
import org.eclipse.jetty.client.transport.HttpRequest;
import org.eclipse.jetty.client.transport.internal.HttpConnectionOverHTTP;
import org.eclipse.jetty.http.HttpCookieStore;
import org.eclipse.jetty.http2.client.HTTP2Client;
import org.eclipse.jetty.http2.client.transport.HttpClientTransportOverHTTP2;
import org.eclipse.jetty.http2.client.transport.ClientConnectionFactoryOverHTTP2;
import org.eclipse.jetty.io.ArrayByteBufferPool;
import org.eclipse.jetty.io.ClientConnectionFactory;
import org.eclipse.jetty.io.ClientConnector;
import org.eclipse.jetty.util.component.LifeCycle;
import org.eclipse.jetty.util.ssl.SslContextFactory;
Expand Down Expand Up @@ -179,22 +181,27 @@ public JettyHttpClient(
sslContextFactory.setTrustAll(true);
}

HttpClientTransport transport;
ClientConnector clientConnector = new ClientConnector();
clientConnector.setSelectors(config.getSelectorCount());
clientConnector.setSslContextFactory(sslContextFactory);

ImmutableList.Builder<ClientConnectionFactory.Info> protocols = ImmutableList.builder();
if (config.isHttp2Enabled()) {
HTTP2Client client = new HTTP2Client();
HTTP2Client client = new HTTP2Client(clientConnector);
client.setInitialSessionRecvWindow(toIntExact(config.getHttp2InitialSessionReceiveWindowSize().toBytes()));
client.setInitialStreamRecvWindow(toIntExact(config.getHttp2InitialStreamReceiveWindowSize().toBytes()));
client.setInputBufferSize(toIntExact(config.getHttp2InputBufferSize().toBytes()));
client.setSelectors(config.getSelectorCount());
transport = new HttpClientTransportOverHTTP2(client);
}
else {
ClientConnector clientConnector = new ClientConnector();
clientConnector.setSelectors(config.getSelectorCount());
clientConnector.setSslContextFactory(sslContextFactory);
transport = new HttpClientTransportOverHTTP(clientConnector);
client.setStreamIdleTimeout(idleTimeoutMillis);
protocols.add(new ClientConnectionFactoryOverHTTP2.HTTP2(client));
}

protocols.add(HttpClientConnectionFactory.HTTP11);

// The order of the protocols indicates the client's preference.
// The first is the most preferred, the last is the least preferred, but
// the protocol version to use can be explicitly specified in the request.
HttpClientTransport transport = new HttpClientTransportDynamic(clientConnector, protocols.build().toArray(new ClientConnectionFactory.Info[0]));

httpClient = new AuthorizationPreservingHttpClient(transport);

// request and response buffer size
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
import com.proofpoint.tracetoken.TraceToken;
import com.proofpoint.units.Duration;
import org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory;
import org.eclipse.jetty.ee10.servlet.ServletContextHandler;
import org.eclipse.jetty.ee10.servlet.ServletHolder;
import org.eclipse.jetty.http2.server.HTTP2CServerConnectionFactory;
import org.eclipse.jetty.http2.server.HTTP2ServerConnectionFactory;
import org.eclipse.jetty.server.ConnectionFactory;
Expand All @@ -23,8 +25,6 @@
import org.eclipse.jetty.server.SslConnectionFactory;
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
import org.eclipse.jetty.server.handler.gzip.GzipHandler;
import org.eclipse.jetty.ee10.servlet.ServletContextHandler;
import org.eclipse.jetty.ee10.servlet.ServletHolder;
import org.eclipse.jetty.util.ssl.SslContextFactory;
import org.testng.Assert;
import org.testng.SkipException;
Expand Down Expand Up @@ -1292,7 +1292,15 @@ public void testConnectReadRequestWriteJunkHangup()
public void testDynamicBodySourceConnectWriteRequestClose()
throws Exception
{
try (FakeServer fakeServer = new FakeServer(scheme, host, 1024, null, true)) {
int bodySize;
if (createClientConfig().isHttp2Enabled()) {
// HTTP/2 over TLS has smaller buffers for this
bodySize = 256;
} else {
bodySize = 1024;
}

try (FakeServer fakeServer = new FakeServer(scheme, host, bodySize, null, true)) {
HttpClientConfig config = createClientConfig();
config.setConnectTimeout(new Duration(5, SECONDS));
config.setIdleTimeout(new Duration(5, SECONDS));
Expand All @@ -1308,7 +1316,7 @@ public void testDynamicBodySourceConnectWriteRequestClose()
.setUri(fakeServer.getUri())
.setBodySource((DynamicBodySource) out -> () -> {
if (invocation.getAndIncrement() < 100) {
out.write(new byte[1024]);
out.write(new byte[bodySize]);
}
else {
out.close();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,4 @@ protected HttpClientConfig createClientConfig()
return super.createClientConfig()
.setHttp2Enabled(true);
}

@BeforeMethod
public void checkValidConfiguration(){
throw new SkipException("Https is not supported for Http/2");
}
}