Class HttpClientTransportDynamic
- java.lang.Object
-
- org.eclipse.jetty.util.component.AbstractLifeCycle
-
- org.eclipse.jetty.util.component.ContainerLifeCycle
-
- org.eclipse.jetty.client.AbstractHttpClientTransport
-
- org.eclipse.jetty.client.AbstractConnectorHttpClientTransport
-
- org.eclipse.jetty.client.dynamic.HttpClientTransportDynamic
-
- 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
HttpClientTransportthat 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.HTTP; HTTP2Client http2Client = new HTTP2Client(clientConnector); ClientConnectionFactory.Info h2 = new ClientConnectionFactoryOverHTTP2.H2(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
h2andh1, 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-texthttp/1.1andh2con the same port. Imagine a client sending ah2crequest to that port; this will create a destination and connections that speakh2c; it won't be possible to use the connections from that destination to sendhttp/1.1requests. Therefore a destination is identified by aOriginand 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 overridingHttpClientTransport.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
-
-
Field Summary
-
Fields inherited from class org.eclipse.jetty.util.component.AbstractLifeCycle
FAILED, STARTED, STARTING, STOPPED, STOPPING
-
Fields inherited from interface org.eclipse.jetty.client.HttpClientTransport
HTTP_CONNECTION_PROMISE_CONTEXT_KEY, HTTP_DESTINATION_CONTEXT_KEY
-
-
Constructor Summary
Constructors Constructor Description HttpClientTransportDynamic()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 givenClientConnectorand the given application protocols.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description org.eclipse.jetty.io.ConnectionnewConnection(org.eclipse.jetty.io.EndPoint endPoint, java.util.Map<java.lang.String,java.lang.Object> context)HttpDestinationnewHttpDestination(Origin origin)Creates a new, transport-specific,HttpDestinationobject.protected org.eclipse.jetty.io.ConnectionnewNegotiatedConnection(org.eclipse.jetty.io.EndPoint endPoint, java.util.Map<java.lang.String,java.lang.Object> context)OriginnewOrigin(HttpRequest request)Creates a new Origin with the given request.voidupgrade(org.eclipse.jetty.io.EndPoint endPoint, java.util.Map<java.lang.String,java.lang.Object> context)-
Methods inherited from class org.eclipse.jetty.client.AbstractConnectorHttpClientTransport
connect, connect, doStart, getClientConnector, getSelectors
-
Methods inherited from class org.eclipse.jetty.client.AbstractHttpClientTransport
connectFailed, getConnectionPoolFactory, getHttpClient, setConnectionPoolFactory, setHttpClient
-
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
-
-
-
-
Constructor Detail
-
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 givenClientConnectorand the given application protocols.- Parameters:
connector- the ClientConnector used by this transportfactoryInfos- the application protocols that this transport can speak
-
-
Method Detail
-
newOrigin
public Origin newOrigin(HttpRequest request)
Description copied from interface:HttpClientTransportCreates 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:HttpClientTransportCreates a new, transport-specific,HttpDestinationobject.HttpDestinationcontrols 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,
HttpDestinationobject
-
newConnection
public org.eclipse.jetty.io.Connection newConnection(org.eclipse.jetty.io.EndPoint endPoint, java.util.Map<java.lang.String,java.lang.Object> context) throws java.io.IOException- Throws:
java.io.IOException
-
upgrade
public void upgrade(org.eclipse.jetty.io.EndPoint endPoint, java.util.Map<java.lang.String,java.lang.Object> context)
-
newNegotiatedConnection
protected org.eclipse.jetty.io.Connection newNegotiatedConnection(org.eclipse.jetty.io.EndPoint endPoint, java.util.Map<java.lang.String,java.lang.Object> context) throws java.io.IOException- Throws:
java.io.IOException
-
-