Package org.eclipse.jetty.http3.client
Class HTTP3Client
java.lang.Object
org.eclipse.jetty.util.component.AbstractLifeCycle
org.eclipse.jetty.util.component.ContainerLifeCycle
org.eclipse.jetty.http3.client.HTTP3Client
- All Implemented Interfaces:
AutoCloseable
,Container
,Destroyable
,Dumpable
,Dumpable.DumpableContainer
,LifeCycle
HTTP3Client provides an asynchronous, non-blocking implementation to send HTTP/3 frames to a server.
Typical usage:
// Client-side QUIC configuration to configure QUIC properties.
ClientQuicConfiguration quicConfig = new ClientQuicConfiguration(sslClient, null);
// Create the HTTP3Client instance.
HTTP3Client http3Client = new HTTP3Client(quicConfig);
// To configure HTTP/3 properties.
HTTP3Configuration h3Config = http3Client.getHTTP3Configuration();
http3Client.start();
// HTTP3Client request/response usage.
// Connect to host.
String host = "webtide.com";
int port = 443;
Session.Client session = http3Client
.connect(new InetSocketAddress(host, port), new Session.Client.Listener() {})
.get(5, TimeUnit.SECONDS);
// Prepare the HTTP request headers.
HttpFields.Mutable requestFields = HttpFields.build();
requestFields.put("User-Agent", http3Client.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 = UTF_8.encode("hello");
stream.data(new DataFrame(requestChunk1, false))
// Subsequent sends must wait for previous sends to complete.
.thenCompose(s ->
{
ByteBuffer requestChunk2 = UTF_8.encode("world");
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.
-
Nested Class Summary
Nested classes/interfaces inherited from class org.eclipse.jetty.util.component.AbstractLifeCycle
AbstractLifeCycle.AbstractLifeCycleListener, AbstractLifeCycle.StopException
Nested classes/interfaces inherited from interface org.eclipse.jetty.util.component.Container
Container.InheritedListener, Container.Listener
Nested classes/interfaces inherited from interface org.eclipse.jetty.util.component.Dumpable
Dumpable.DumpableContainer
Nested classes/interfaces inherited from interface org.eclipse.jetty.util.component.LifeCycle
LifeCycle.Listener
-
Field Summary
-
Constructor Summary
ConstructorDescriptionHTTP3Client
(ClientQuicConfiguration quicConfiguration) HTTP3Client
(ClientQuicConfiguration quicConfiguration, ClientConnector connector) -
Method Summary
Modifier and TypeMethodDescriptionvoid
close()
connect
(SocketAddress socketAddress, Session.Client.Listener listener) connect
(SocketAddress socketAddress, Session.Client.Listener listener, Map<String, Object> context) connect
(Transport transport, SocketAddress socketAddress, Session.Client.Listener listener, Map<String, Object> context) protected void
doStart()
Starts the managed lifecycle beans in the order they were added.shutdown()
Methods inherited from class org.eclipse.jetty.util.component.ContainerLifeCycle
addBean, addBean, addEventListener, addManaged, contains, destroy, doStop, dump, dump, dump, dumpObjects, dumpStdErr, getBean, getBeans, getBeans, getContainedBeans, getContainedBeans, installBean, installBean, isAuto, isManaged, isUnmanaged, manage, removeBean, removeBeans, removeEventListener, setBeans, start, stop, unmanage, updateBean, updateBean, updateBeans, updateBeans
Methods inherited from class org.eclipse.jetty.util.component.AbstractLifeCycle
getEventListeners, getState, getState, isFailed, isRunning, isStarted, isStarting, isStopped, isStopping, setEventListeners, start, stop, toString
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
Methods inherited from interface org.eclipse.jetty.util.component.Container
getCachedBeans, getEventListeners
Methods inherited from interface org.eclipse.jetty.util.component.Dumpable.DumpableContainer
isDumpable
-
Field Details
-
CLIENT_CONTEXT_KEY
-
SESSION_LISTENER_CONTEXT_KEY
-
SESSION_PROMISE_CONTEXT_KEY
-
-
Constructor Details
-
HTTP3Client
-
HTTP3Client
-
-
Method Details
-
getClientConnector
-
getQuicConfiguration
-
getHTTP3Configuration
-
doStart
Description copied from class:ContainerLifeCycle
Starts the managed lifecycle beans in the order they were added.- Overrides:
doStart
in classContainerLifeCycle
- Throws:
AbstractLifeCycle.StopException
- If thrown, the lifecycle will immediately be stopped.Exception
- If there was a problem starting. Will cause a transition to FAILED state
-
connect
public CompletableFuture<Session.Client> connect(SocketAddress socketAddress, Session.Client.Listener listener) -
connect
public CompletableFuture<Session.Client> connect(SocketAddress socketAddress, Session.Client.Listener listener, Map<String, Object> context) -
connect
public CompletableFuture<Session.Client> connect(Transport transport, SocketAddress socketAddress, Session.Client.Listener listener, Map<String, Object> context) -
shutdown
-
close
- Specified by:
close
in interfaceAutoCloseable
- Throws:
Exception
-