Top Description Fields Constructors Methods
org.eclipse.jetty.http3.client

public Class HTTP3Client

extends ContainerLifeCycle
Class Inheritance
Imports
java.net.SocketAddress, java.util.List, .Map, java.util.concurrent.CompletableFuture, .ConcurrentHashMap, org.eclipse.jetty.http3.HTTP3Configuration, org.eclipse.jetty.http3.api.Session, org.eclipse.jetty.io.ClientConnector, .Connection, .DatagramChannelEndPoint, org.eclipse.jetty.quic.client.ClientQuicConnection, .ClientQuicSession, .QuicClientConnectorConfigurator, org.eclipse.jetty.quic.common.QuicConfiguration, .QuicConnection, .QuicSessionContainer, org.eclipse.jetty.util.Promise, org.eclipse.jetty.util.component.ContainerLifeCycle, org.slf4j.Logger, .LoggerFactory

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.

Field Summary

Modifier and TypeField and Description
public static final String
private final ClientConnector
private final QuicSessionContainer
private final HTTP3Configuration
private static final Logger
private final QuicConfiguration
public static final String
public static final String

Constructor Summary

AccessConstructor and Description
public

Method Summary

Modifier and TypeMethod and Description
private Connection
public CompletableFuture<Session.Client>
public CompletableFuture<Session.Client>
connect(SocketAddress address, Session.Client.Listener listener, Map<String, Object> context)

protected void
doStart()

Overrides org.eclipse.jetty.util.component.ContainerLifeCycle.doStart.

Starts the managed lifecycle beans in the order they were added.

public ClientConnector
public HTTP3Configuration
public QuicConfiguration
public CompletableFuture<Void>
Inherited from org.eclipse.jetty.util.component.ContainerLifeCycle:
addBeanaddBeanaddEventListeneraddManagedcontainsdestroydoStopdumpdumpdumpdumpObjectsdumpStdErrgetBeangetBeansgetBeansgetContainedBeansgetContainedBeansisAutoisManagedisUnmanagedmanageremoveBeanremoveBeansremoveEventListenersetBeansstartstopunmanageupdateBeanupdateBeanupdateBeansupdateBeans

Field Detail

CLIENT_CONTEXT_KEYback to summary
public static final String CLIENT_CONTEXT_KEY
connectorback to summary
private final ClientConnector connector
containerback to summary
private final QuicSessionContainer container
http3Configurationback to summary
private final HTTP3Configuration http3Configuration
LOGback to summary
private static final Logger LOG

Hides org.eclipse.jetty.util.component.ContainerLifeCycle.LOG.

quicConfigurationback to summary
private final QuicConfiguration quicConfiguration
SESSION_LISTENER_CONTEXT_KEYback to summary
public static final String SESSION_LISTENER_CONTEXT_KEY
SESSION_PROMISE_CONTEXT_KEYback to summary
public static final String SESSION_PROMISE_CONTEXT_KEY

Constructor Detail

HTTP3Clientback to summary
public HTTP3Client()

Method Detail

configureConnectionback to summary
private Connection configureConnection(Connection connection)
connectback to summary
public CompletableFuture<Session.Client> connect(SocketAddress address, Session.Client.Listener listener)
connectback to summary
public CompletableFuture<Session.Client> connect(SocketAddress address, Session.Client.Listener listener, Map<String, Object> context)
doStartback to summary
protected void doStart() throws Exception

Overrides org.eclipse.jetty.util.component.ContainerLifeCycle.doStart.

Doc from org.eclipse.jetty.util.component.ContainerLifeCycle.doStart.

Starts the managed lifecycle beans in the order they were added.

Annotations
@Override
Exceptions
Exception:

Doc from org.eclipse.jetty.util.component.AbstractLifeCycle.doStart.

If there was a problem starting. Will cause a transition to FAILED state

getClientConnectorback to summary
public ClientConnector getClientConnector()
getHTTP3Configurationback to summary
public HTTP3Configuration getHTTP3Configuration()
getQuicConfigurationback to summary
public QuicConfiguration getQuicConfiguration()
shutdownback to summary
public CompletableFuture<Void> shutdown()