HTTP3Client provides an asynchronous, non-blocking implementation to send
HTTP/3 frames to a server.
Typical usage:
// HTTP3Client setup.
HTTP3Client client = new HTTP3Client();
// To configure QUIC properties.
QuicConfiguration quicConfig = client.getQuicConfiguration();
// To configure HTTP/3 properties.
HTTP3Configuration h3Config = client.getHTTP3Configuration();
client.start();
// HTTP3Client request/response usage.
// Connect to host.
String host = "webtide.com";
int port = 443;
Session.Client session = client
.connect(new InetSocketAddress(host, port), new Session.Client.Listener() {})
.get(5, TimeUnit.SECONDS);
// Prepare the HTTP request headers.
HttpFields requestFields = new HttpFields();
requestFields.put("User-Agent", client.getClass().getName() + "/" + Jetty.VERSION);
// Prepare the HTTP request object.
MetaData.Request request = new MetaData.Request("PUT", HttpURI.from("https://" + host + ":" + port + "/"), HttpVersion.HTTP_3, requestFields);
// Create the HTTP/3 HEADERS frame representing the HTTP request.
HeadersFrame headersFrame = new HeadersFrame(request, false);
// Send the HEADERS frame to create a request stream.
Stream stream = session.newRequest(headersFrame, new Stream.Listener()
{
@Override
public void onResponse(Stream stream, HeadersFrame frame)
{
// Inspect the response status and headers.
MetaData.Response response = (MetaData.Response)frame.getMetaData();
// Demand for response content.
stream.demand();
}
@Override
public void onDataAvailable(Stream stream)
{
Stream.Data data = stream.readData();
if (data != null)
{
// Process the response content chunk.
}
// Demand for more response content.
stream.demand();
}
}).get(5, TimeUnit.SECONDS);
// Use the Stream object to send request content, if any, using a DATA frame.
ByteBuffer requestChunk1 = ...;
stream.data(new DataFrame(requestChunk1, false))
// Subsequent sends must wait for previous sends to complete.
.thenCompose(s ->
{
ByteBuffer requestChunk2 = ...;
s.data(new DataFrame(requestChunk2, true)));
}
Implementation Notes
Each call to connect(SocketAddress, Session.Client.Listener) creates a new
DatagramChannelEndPoint with the correspondent ClientQuicConnection.
Each ClientQuicConnection manages one ClientQuicSession with the
corresponding ClientHTTP3Session.
Each ClientHTTP3Session manages the mandatory encoder, decoder and control
streams, plus zero or more request/response streams.
GENERIC, TCP-LIKE, SETUP FOR HTTP/1.1 AND HTTP/2
HTTP3Client - dgramEP - ClientQuiConnection - ClientQuicSession - ClientProtocolSession - TCPLikeStream
SPECIFIC SETUP FOR HTTP/3
/- [Control|Decoder|Encoder]Stream
HTTP3Client - dgramEP - ClientQuiConnection - ClientQuicSession - ClientHTTP3Session -* HTTP3Streams
HTTP/3+QUIC support is experimental and not suited for production use.
APIs may change incompatibly between releases.