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.URIScheme;
34 import org.apache.hc.core5.http.impl.nio.HttpConnectionEventHandler;
35 import org.apache.hc.core5.http.impl.nio.ServerHttp1IOEventHandler;
36 import org.apache.hc.core5.http.impl.nio.ServerHttp1StreamDuplexerFactory;
37 import org.apache.hc.core5.http.nio.ssl.TlsStrategy;
38 import org.apache.hc.core5.http2.HttpVersionPolicy;
39 import org.apache.hc.core5.reactor.EndpointParameters;
40 import org.apache.hc.core5.reactor.IOEventHandlerFactory;
41 import org.apache.hc.core5.reactor.ProtocolIOSession;
42 import org.apache.hc.core5.util.Args;
43 import org.apache.hc.core5.util.Asserts;
44 import org.apache.hc.core5.util.Timeout;
45
46
47
48
49
50
51
52
53 @Contract(threading = ThreadingBehavior.IMMUTABLE_CONDITIONAL)
54 @Internal
55 public class ServerHttpProtocolNegotiationStarter implements IOEventHandlerFactory {
56
57 private final ServerHttp1StreamDuplexerFactory http1StreamHandlerFactory;
58 private final ServerH2StreamMultiplexerFactory http2StreamHandlerFactory;
59 private final HttpVersionPolicy versionPolicy;
60 private final TlsStrategy tlsStrategy;
61 private final Timeout handshakeTimeout;
62
63 public ServerHttpProtocolNegotiationStarter(
64 final ServerHttp1StreamDuplexerFactory http1StreamHandlerFactory,
65 final ServerH2StreamMultiplexerFactory http2StreamHandlerFactory,
66 final HttpVersionPolicy versionPolicy,
67 final TlsStrategy tlsStrategy,
68 final Timeout handshakeTimeout) {
69 this.http1StreamHandlerFactory = Args.notNull(http1StreamHandlerFactory, "HTTP/1.1 stream handler factory");
70 this.http2StreamHandlerFactory = Args.notNull(http2StreamHandlerFactory, "HTTP/2 stream handler factory");
71 this.versionPolicy = versionPolicy != null ? versionPolicy : HttpVersionPolicy.NEGOTIATE;
72 this.tlsStrategy = tlsStrategy;
73 this.handshakeTimeout = handshakeTimeout;
74 }
75
76 @Override
77 public HttpConnectionEventHandler createHandler(final ProtocolIOSession ioSession, final Object attachment) {
78 HttpVersionPolicy endpointPolicy = versionPolicy;
79 URIScheme uriScheme = URIScheme.HTTP;
80 if (attachment instanceof EndpointParameters) {
81 final EndpointParameters params = (EndpointParameters) attachment;
82 if (URIScheme.HTTPS.same(params.getScheme())) {
83 Asserts.notNull(tlsStrategy, "TLS strategy");
84 uriScheme = URIScheme.HTTPS;
85 tlsStrategy.upgrade(
86 ioSession,
87 null,
88 ioSession.getLocalAddress(),
89 ioSession.getRemoteAddress(),
90 params.getAttachment(),
91 handshakeTimeout);
92 }
93 if (params.getAttachment() instanceof HttpVersionPolicy) {
94 endpointPolicy = (HttpVersionPolicy) params.getAttachment();
95 }
96 }
97 switch (endpointPolicy) {
98 case FORCE_HTTP_2:
99 return new H2OnlyServerHttpProtocolNegotiator(ioSession, http2StreamHandlerFactory);
100 case FORCE_HTTP_1:
101 return new ServerHttp1IOEventHandler(http1StreamHandlerFactory.create(uriScheme.id, ioSession));
102 default:
103 return new ServerHttpProtocolNegotiator(ioSession, http1StreamHandlerFactory, http2StreamHandlerFactory, HttpVersionPolicy.NEGOTIATE);
104 }
105 }
106
107 }