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:
Container
,Destroyable
,Dumpable
,Dumpable.DumpableContainer
,LifeCycle
public class HTTP3Client extends ContainerLifeCycle
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 newDatagramChannelEndPoint
with the correspondentClientQuicConnection
.Each
ClientQuicConnection
manages oneClientQuicSession
with the correspondingClientHTTP3Session
.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
Fields Modifier and Type Field Description static java.lang.String
CLIENT_CONTEXT_KEY
static java.lang.String
SESSION_LISTENER_CONTEXT_KEY
static java.lang.String
SESSION_PROMISE_CONTEXT_KEY
-
Constructor Summary
Constructors Constructor Description HTTP3Client()
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description java.util.concurrent.CompletableFuture<Session.Client>
connect(java.net.SocketAddress address, Session.Client.Listener listener)
java.util.concurrent.CompletableFuture<Session.Client>
connect(java.net.SocketAddress address, Session.Client.Listener listener, java.util.Map<java.lang.String,java.lang.Object> context)
protected void
doStart()
Starts the managed lifecycle beans in the order they were added.ClientConnector
getClientConnector()
HTTP3Configuration
getHTTP3Configuration()
QuicConfiguration
getQuicConfiguration()
java.util.concurrent.CompletableFuture<java.lang.Void>
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, 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
-
-
-
-
Method Detail
-
getClientConnector
public ClientConnector getClientConnector()
-
getQuicConfiguration
public QuicConfiguration getQuicConfiguration()
-
getHTTP3Configuration
public HTTP3Configuration getHTTP3Configuration()
-
doStart
protected void doStart() throws java.lang.Exception
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.java.lang.Exception
- If there was a problem starting. Will cause a transition to FAILED state
-
connect
public java.util.concurrent.CompletableFuture<Session.Client> connect(java.net.SocketAddress address, Session.Client.Listener listener)
-
connect
public java.util.concurrent.CompletableFuture<Session.Client> connect(java.net.SocketAddress address, Session.Client.Listener listener, java.util.Map<java.lang.String,java.lang.Object> context)
-
shutdown
public java.util.concurrent.CompletableFuture<java.lang.Void> shutdown()
-
-