Class HttpClientTransportDynamic
- All Implemented Interfaces:
HttpClientTransport
,ClientConnectionFactory
,Container
,Destroyable
,Dumpable
,Dumpable.DumpableContainer
,LifeCycle
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
AbstractLifeCycle.AbstractLifeCycleListener, AbstractLifeCycle.StopException
Nested classes/interfaces inherited from interface org.eclipse.jetty.io.ClientConnectionFactory
ClientConnectionFactory.Decorator, ClientConnectionFactory.Info
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 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.client.HttpClientTransport
HTTP_CONNECTION_PROMISE_CONTEXT_KEY, HTTP_DESTINATION_CONTEXT_KEY
-
Constructor Summary
ConstructorDescriptionCreates a transport that speaks only HTTP/1.1.HttpClientTransportDynamic
(ClientConnectionFactory.Info... factoryInfos) HttpClientTransportDynamic
(ClientConnector connector, ClientConnectionFactory.Info... factoryInfos) Creates a transport with the givenClientConnector
and the given application protocols. -
Method Summary
Modifier and TypeMethodDescriptionnewConnection
(EndPoint endPoint, Map<String, Object> context) newHttpDestination
(Origin origin) Creates a new, transport-specific,HttpDestination
object.protected Connection
newNegotiatedConnection
(EndPoint endPoint, Map<String, Object> context) newOrigin
(HttpRequest request) Creates a new Origin with the given request.void
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
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.DumpableContainer
isDumpable
-
Constructor Details
-
HttpClientTransportDynamic
public HttpClientTransportDynamic()Creates a transport that speaks only HTTP/1.1. -
HttpClientTransportDynamic
-
HttpClientTransportDynamic
public HttpClientTransportDynamic(ClientConnector connector, ClientConnectionFactory.Info... factoryInfos) Creates a transport with the givenClientConnector
and the given application protocols.- Parameters:
connector
- the ClientConnector used by this transportfactoryInfos
- the application protocols that this transport can speak
-
-
Method Details
-
newOrigin
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
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
- Parameters:
endPoint
- theEndPoint
to link the newly created connection tocontext
- the context data to create the connection- Returns:
- a new
Connection
- Throws:
IOException
- if the connection cannot be created
-
upgrade
-
newNegotiatedConnection
protected Connection newNegotiatedConnection(EndPoint endPoint, Map<String, Object> context) throws IOException- Throws:
IOException
-