1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 package org.apache.hc.core5.http2.impl.nio;
29
30 import org.apache.hc.core5.annotation.Contract;
31 import org.apache.hc.core5.annotation.Internal;
32 import org.apache.hc.core5.annotation.ThreadingBehavior;
33 import org.apache.hc.core5.http.HttpHost;
34 import org.apache.hc.core5.http.URIScheme;
35 import org.apache.hc.core5.http.impl.nio.ClientHttp1StreamDuplexerFactory;
36 import org.apache.hc.core5.http.nio.ssl.TlsStrategy;
37 import org.apache.hc.core5.http2.HttpVersionPolicy;
38 import org.apache.hc.core5.reactor.EndpointParameters;
39 import org.apache.hc.core5.reactor.IOEventHandlerFactory;
40 import org.apache.hc.core5.reactor.ProtocolIOSession;
41 import org.apache.hc.core5.util.Args;
42 import org.apache.hc.core5.util.Asserts;
43 import org.apache.hc.core5.util.Timeout;
44
45
46
47
48
49
50 @Contract(threading = ThreadingBehavior.IMMUTABLE_CONDITIONAL)
51 @Internal
52 public class ClientHttpProtocolNegotiatorFactory implements IOEventHandlerFactory {
53
54 private final ClientHttp1StreamDuplexerFactory http1StreamHandlerFactory;
55 private final ClientH2StreamMultiplexerFactory http2StreamHandlerFactory;
56 private final HttpVersionPolicy versionPolicy;
57 private final TlsStrategy tlsStrategy;
58 private final Timeout handshakeTimeout;
59
60 public ClientHttpProtocolNegotiatorFactory(
61 final ClientHttp1StreamDuplexerFactory http1StreamHandlerFactory,
62 final ClientH2StreamMultiplexerFactory http2StreamHandlerFactory,
63 final HttpVersionPolicy versionPolicy,
64 final TlsStrategy tlsStrategy,
65 final Timeout handshakeTimeout) {
66 this.http1StreamHandlerFactory = Args.notNull(http1StreamHandlerFactory, "HTTP/1.1 stream handler factory");
67 this.http2StreamHandlerFactory = Args.notNull(http2StreamHandlerFactory, "HTTP/2 stream handler factory");
68 this.versionPolicy = versionPolicy != null ? versionPolicy : HttpVersionPolicy.NEGOTIATE;
69 this.tlsStrategy = tlsStrategy;
70 this.handshakeTimeout = handshakeTimeout;
71 }
72
73 @Override
74 public ClientHttpProtocolNegotiator createHandler(final ProtocolIOSession ioSession, final Object attachment) {
75 HttpVersionPolicy endpointPolicy = versionPolicy;
76 if (attachment instanceof EndpointParameters) {
77 final EndpointParameters params = (EndpointParameters) attachment;
78 if (URIScheme.HTTPS.same(params.getScheme())) {
79 Asserts.notNull(tlsStrategy, "TLS strategy");
80 final HttpHost host = new HttpHost(params.getScheme(), params.getHostName(), params.getPort());
81 tlsStrategy.upgrade(
82 ioSession,
83 host,
84 ioSession.getLocalAddress(),
85 ioSession.getRemoteAddress(),
86 params.getAttachment(),
87 handshakeTimeout);
88 }
89 if (params.getAttachment() instanceof HttpVersionPolicy) {
90 endpointPolicy = (HttpVersionPolicy) params.getAttachment();
91 }
92 }
93 return new ClientHttpProtocolNegotiator(
94 ioSession,
95 http1StreamHandlerFactory,
96 http2StreamHandlerFactory,
97 endpointPolicy);
98 }
99
100 }