Class HttpClientTransportDynamic

java.lang.Object
org.eclipse.jetty.util.component.AbstractLifeCycle
org.eclipse.jetty.util.component.ContainerLifeCycle
All Implemented Interfaces:
HttpClientTransport, org.eclipse.jetty.io.ClientConnectionFactory, org.eclipse.jetty.util.component.Container, org.eclipse.jetty.util.component.Destroyable, org.eclipse.jetty.util.component.Dumpable, org.eclipse.jetty.util.component.Dumpable.DumpableContainer, org.eclipse.jetty.util.component.LifeCycle

public class HttpClientTransportDynamic extends AbstractConnectorHttpClientTransport

A HttpClientTransport that can dynamically switch among different application protocols.

Applications create HttpClientTransportDynamic instances specifying all the application protocols it supports, in order of preference. The typical case is when the server supports both HTTP/1.1 and HTTP/2, but the client does not know that. In this case, the application will create a HttpClientTransportDynamic in this way:

 ClientConnector clientConnector = new ClientConnector();
 // Configure the clientConnector.

 // Prepare the application protocols.
 ClientConnectionFactory.Info h1 = HttpClientConnectionFactory.HTTP11;
 HTTP2Client http2Client = new HTTP2Client(clientConnector);
 ClientConnectionFactory.Info h2 = new ClientConnectionFactoryOverHTTP2.HTTP2(http2Client);

 // Create the HttpClientTransportDynamic, preferring h2 over h1.
 HttpClientTransport transport = new HttpClientTransportDynamic(clientConnector, h2, h1);

 // Create the HttpClient.
 client = new HttpClient(transport);
 

Note how in the code above the HttpClientTransportDynamic has been created with the application protocols h2 and h1, without the need to specify TLS (which is implied by the request scheme) or ALPN (which is implied by HTTP/2 over TLS).

When a request is first sent, (scheme, host, port) are not enough to identify the destination because the same origin may speak different protocols. For example, the Jetty server supports speaking clear-text http/1.1 and h2c on the same port. Imagine a client sending a h2c request to that port; this will create a destination and connections that speak h2c; it won't be possible to use the connections from that destination to send http/1.1 requests. Therefore a destination is identified by a Origin and applications can customize the creation of the origin (for example depending on request protocol version, or request headers, or request attributes, or even request path) by overriding HttpClientTransport.newOrigin(HttpRequest).

  • Nested Class Summary

    Nested classes/interfaces inherited from class org.eclipse.jetty.util.component.AbstractLifeCycle

    org.eclipse.jetty.util.component.AbstractLifeCycle.AbstractLifeCycleListener, org.eclipse.jetty.util.component.AbstractLifeCycle.StopException

    Nested classes/interfaces inherited from interface org.eclipse.jetty.io.ClientConnectionFactory

    org.eclipse.jetty.io.ClientConnectionFactory.Decorator, org.eclipse.jetty.io.ClientConnectionFactory.Info

    Nested classes/interfaces inherited from interface org.eclipse.jetty.util.component.Container

    org.eclipse.jetty.util.component.Container.InheritedListener, org.eclipse.jetty.util.component.Container.Listener

    Nested classes/interfaces inherited from interface org.eclipse.jetty.util.component.Dumpable

    org.eclipse.jetty.util.component.Dumpable.DumpableContainer

    Nested classes/interfaces inherited from interface org.eclipse.jetty.util.component.LifeCycle

    org.eclipse.jetty.util.component.LifeCycle.Listener
  • Field Summary

    Fields inherited from class org.eclipse.jetty.util.component.AbstractLifeCycle

    FAILED, STARTED, STARTING, STOPPED, STOPPING

    Fields inherited from interface org.eclipse.jetty.io.ClientConnectionFactory

    CLIENT_CONTEXT_KEY

    Fields inherited from interface org.eclipse.jetty.util.component.Dumpable

    KEY

    Fields inherited from interface org.eclipse.jetty.client.HttpClientTransport

    HTTP_CONNECTION_PROMISE_CONTEXT_KEY, HTTP_DESTINATION_CONTEXT_KEY
  • Constructor Summary

    Constructors
    Constructor
    Description
    Creates a transport that speaks only HTTP/1.1.
    HttpClientTransportDynamic(org.eclipse.jetty.io.ClientConnectionFactory.Info... factoryInfos)
     
    HttpClientTransportDynamic(org.eclipse.jetty.io.ClientConnector connector, org.eclipse.jetty.io.ClientConnectionFactory.Info... factoryInfos)
    Creates a transport with the given ClientConnector and the given application protocols.
  • Method Summary

    Modifier and Type
    Method
    Description
    org.eclipse.jetty.io.Connection
    newConnection(org.eclipse.jetty.io.EndPoint endPoint, Map<String,Object> context)
     
    Creates a new, transport-specific, HttpDestination object.
    protected org.eclipse.jetty.io.Connection
    newNegotiatedConnection(org.eclipse.jetty.io.EndPoint endPoint, Map<String,Object> context)
     
    Creates a new Origin with the given request.
    void
    upgrade(org.eclipse.jetty.io.EndPoint endPoint, Map<String,Object> context)
     

    Methods inherited from class org.eclipse.jetty.client.AbstractConnectorHttpClientTransport

    connect, connect, doStart, getClientConnector, getSelectors

    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.io.ClientConnectionFactory

    customize

    Methods inherited from interface org.eclipse.jetty.util.component.Container

    getCachedBeans, getEventListeners

    Methods inherited from interface org.eclipse.jetty.util.component.Dumpable

    dumpSelf

    Methods inherited from interface org.eclipse.jetty.util.component.Dumpable.DumpableContainer

    isDumpable
  • Constructor Details

    • HttpClientTransportDynamic

      public HttpClientTransportDynamic()
      Creates a transport that speaks only HTTP/1.1.
    • HttpClientTransportDynamic

      public HttpClientTransportDynamic(org.eclipse.jetty.io.ClientConnectionFactory.Info... factoryInfos)
    • HttpClientTransportDynamic

      public HttpClientTransportDynamic(org.eclipse.jetty.io.ClientConnector connector, org.eclipse.jetty.io.ClientConnectionFactory.Info... factoryInfos)
      Creates a transport with the given ClientConnector and the given application protocols.
      Parameters:
      connector - the ClientConnector used by this transport
      factoryInfos - the application protocols that this transport can speak
  • Method Details

    • newOrigin

      public Origin newOrigin(HttpRequest request)
      Description copied from interface: HttpClientTransport
      Creates a new Origin with the given request.
      Parameters:
      request - the request that triggers the creation of the Origin
      Returns:
      an Origin that identifies a destination
    • newHttpDestination

      public HttpDestination newHttpDestination(Origin origin)
      Description copied from interface: HttpClientTransport
      Creates a new, transport-specific, HttpDestination object.

      HttpDestination controls the destination-connection cardinality: protocols like HTTP have 1-N cardinality, while multiplexed protocols like HTTP/2 have a 1-1 cardinality.

      Parameters:
      origin - the destination origin
      Returns:
      a new, transport-specific, HttpDestination object
    • newConnection

      public org.eclipse.jetty.io.Connection newConnection(org.eclipse.jetty.io.EndPoint endPoint, Map<String,Object> context) throws IOException
      Throws:
      IOException
    • upgrade

      public void upgrade(org.eclipse.jetty.io.EndPoint endPoint, Map<String,Object> context)
    • newNegotiatedConnection

      protected org.eclipse.jetty.io.Connection newNegotiatedConnection(org.eclipse.jetty.io.EndPoint endPoint, Map<String,Object> context) throws IOException
      Throws:
      IOException