Class 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 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 Detail

      • CLIENT_CONTEXT_KEY

        public static final java.lang.String CLIENT_CONTEXT_KEY
      • SESSION_LISTENER_CONTEXT_KEY

        public static final java.lang.String SESSION_LISTENER_CONTEXT_KEY
      • SESSION_PROMISE_CONTEXT_KEY

        public static final java.lang.String SESSION_PROMISE_CONTEXT_KEY
    • Constructor Detail

      • HTTP3Client

        public HTTP3Client()
    • Method Detail

      • 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 class ContainerLifeCycle
        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,
                                                                              java.util.Map<java.lang.String,​java.lang.Object> context)
      • shutdown

        public java.util.concurrent.CompletableFuture<java.lang.Void> shutdown()