1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package io.netty.handler.codec.http2;
17
18 import io.netty.channel.ChannelHandler;
19 import io.netty.channel.ChannelHandlerAdapter;
20 import io.netty.util.internal.UnstableApi;
21
22 import static io.netty.util.internal.ObjectUtil.checkNotNull;
23
24
25
26
27
28
29 @Deprecated
30 @UnstableApi
31 public class Http2MultiplexCodecBuilder
32 extends AbstractHttp2ConnectionHandlerBuilder<Http2MultiplexCodec, Http2MultiplexCodecBuilder> {
33 private Http2FrameWriter frameWriter;
34
35 final ChannelHandler childHandler;
36 private ChannelHandler upgradeStreamHandler;
37
38 Http2MultiplexCodecBuilder(boolean server, ChannelHandler childHandler) {
39 server(server);
40 this.childHandler = checkSharable(checkNotNull(childHandler, "childHandler"));
41
42 gracefulShutdownTimeoutMillis(0);
43 }
44
45 private static ChannelHandler checkSharable(ChannelHandler handler) {
46 if (handler instanceof ChannelHandlerAdapter && !((ChannelHandlerAdapter) handler).isSharable() &&
47 !handler.getClass().isAnnotationPresent(ChannelHandler.Sharable.class)) {
48 throw new IllegalArgumentException("The handler must be Sharable");
49 }
50 return handler;
51 }
52
53
54 Http2MultiplexCodecBuilder frameWriter(Http2FrameWriter frameWriter) {
55 this.frameWriter = checkNotNull(frameWriter, "frameWriter");
56 return this;
57 }
58
59
60
61
62
63
64
65 public static Http2MultiplexCodecBuilder forClient(ChannelHandler childHandler) {
66 return new Http2MultiplexCodecBuilder(false, childHandler);
67 }
68
69
70
71
72
73
74
75 public static Http2MultiplexCodecBuilder forServer(ChannelHandler childHandler) {
76 return new Http2MultiplexCodecBuilder(true, childHandler);
77 }
78
79 public Http2MultiplexCodecBuilder withUpgradeStreamHandler(ChannelHandler upgradeStreamHandler) {
80 if (isServer()) {
81 throw new IllegalArgumentException("Server codecs don't use an extra handler for the upgrade stream");
82 }
83 this.upgradeStreamHandler = upgradeStreamHandler;
84 return this;
85 }
86
87 @Override
88 public Http2Settings initialSettings() {
89 return super.initialSettings();
90 }
91
92 @Override
93 public Http2MultiplexCodecBuilder initialSettings(Http2Settings settings) {
94 return super.initialSettings(settings);
95 }
96
97 @Override
98 public long gracefulShutdownTimeoutMillis() {
99 return super.gracefulShutdownTimeoutMillis();
100 }
101
102 @Override
103 public Http2MultiplexCodecBuilder gracefulShutdownTimeoutMillis(long gracefulShutdownTimeoutMillis) {
104 return super.gracefulShutdownTimeoutMillis(gracefulShutdownTimeoutMillis);
105 }
106
107 @Override
108 public boolean isServer() {
109 return super.isServer();
110 }
111
112 @Override
113 public int maxReservedStreams() {
114 return super.maxReservedStreams();
115 }
116
117 @Override
118 public Http2MultiplexCodecBuilder maxReservedStreams(int maxReservedStreams) {
119 return super.maxReservedStreams(maxReservedStreams);
120 }
121
122 @Override
123 public boolean isValidateHeaders() {
124 return super.isValidateHeaders();
125 }
126
127 @Override
128 public Http2MultiplexCodecBuilder validateHeaders(boolean validateHeaders) {
129 return super.validateHeaders(validateHeaders);
130 }
131
132 @Override
133 public Http2FrameLogger frameLogger() {
134 return super.frameLogger();
135 }
136
137 @Override
138 public Http2MultiplexCodecBuilder frameLogger(Http2FrameLogger frameLogger) {
139 return super.frameLogger(frameLogger);
140 }
141
142 @Override
143 public boolean encoderEnforceMaxConcurrentStreams() {
144 return super.encoderEnforceMaxConcurrentStreams();
145 }
146
147 @Override
148 public Http2MultiplexCodecBuilder encoderEnforceMaxConcurrentStreams(boolean encoderEnforceMaxConcurrentStreams) {
149 return super.encoderEnforceMaxConcurrentStreams(encoderEnforceMaxConcurrentStreams);
150 }
151
152 @Override
153 public int encoderEnforceMaxQueuedControlFrames() {
154 return super.encoderEnforceMaxQueuedControlFrames();
155 }
156
157 @Override
158 public Http2MultiplexCodecBuilder encoderEnforceMaxQueuedControlFrames(int maxQueuedControlFrames) {
159 return super.encoderEnforceMaxQueuedControlFrames(maxQueuedControlFrames);
160 }
161
162 @Override
163 public Http2HeadersEncoder.SensitivityDetector headerSensitivityDetector() {
164 return super.headerSensitivityDetector();
165 }
166
167 @Override
168 public Http2MultiplexCodecBuilder headerSensitivityDetector(
169 Http2HeadersEncoder.SensitivityDetector headerSensitivityDetector) {
170 return super.headerSensitivityDetector(headerSensitivityDetector);
171 }
172
173 @Override
174 public Http2MultiplexCodecBuilder encoderIgnoreMaxHeaderListSize(boolean ignoreMaxHeaderListSize) {
175 return super.encoderIgnoreMaxHeaderListSize(ignoreMaxHeaderListSize);
176 }
177
178 @Override
179 @Deprecated
180 public Http2MultiplexCodecBuilder initialHuffmanDecodeCapacity(int initialHuffmanDecodeCapacity) {
181 return super.initialHuffmanDecodeCapacity(initialHuffmanDecodeCapacity);
182 }
183
184 @Override
185 public Http2MultiplexCodecBuilder autoAckSettingsFrame(boolean autoAckSettings) {
186 return super.autoAckSettingsFrame(autoAckSettings);
187 }
188
189 @Override
190 public Http2MultiplexCodecBuilder autoAckPingFrame(boolean autoAckPingFrame) {
191 return super.autoAckPingFrame(autoAckPingFrame);
192 }
193
194 @Override
195 public Http2MultiplexCodecBuilder decoupleCloseAndGoAway(boolean decoupleCloseAndGoAway) {
196 return super.decoupleCloseAndGoAway(decoupleCloseAndGoAway);
197 }
198
199 @Override
200 public Http2MultiplexCodecBuilder flushPreface(boolean flushPreface) {
201 return super.flushPreface(flushPreface);
202 }
203
204 @Override
205 public int decoderEnforceMaxConsecutiveEmptyDataFrames() {
206 return super.decoderEnforceMaxConsecutiveEmptyDataFrames();
207 }
208
209 @Override
210 public Http2MultiplexCodecBuilder decoderEnforceMaxConsecutiveEmptyDataFrames(int maxConsecutiveEmptyFrames) {
211 return super.decoderEnforceMaxConsecutiveEmptyDataFrames(maxConsecutiveEmptyFrames);
212 }
213
214 @Override
215 public Http2MultiplexCodecBuilder decoderEnforceMaxRstFramesPerWindow(
216 int maxRstFramesPerWindow, int secondsPerWindow) {
217 return super.decoderEnforceMaxRstFramesPerWindow(maxRstFramesPerWindow, secondsPerWindow);
218 }
219
220 @Override
221 public Http2MultiplexCodec build() {
222 Http2FrameWriter frameWriter = this.frameWriter;
223 if (frameWriter != null) {
224
225
226 DefaultHttp2Connection connection = new DefaultHttp2Connection(isServer(), maxReservedStreams());
227 Long maxHeaderListSize = initialSettings().maxHeaderListSize();
228 Http2FrameReader frameReader = new DefaultHttp2FrameReader(maxHeaderListSize == null ?
229 new DefaultHttp2HeadersDecoder(isValidateHeaders()) :
230 new DefaultHttp2HeadersDecoder(isValidateHeaders(), maxHeaderListSize));
231
232 if (frameLogger() != null) {
233 frameWriter = new Http2OutboundFrameLogger(frameWriter, frameLogger());
234 frameReader = new Http2InboundFrameLogger(frameReader, frameLogger());
235 }
236 Http2ConnectionEncoder encoder = new DefaultHttp2ConnectionEncoder(connection, frameWriter);
237 if (encoderEnforceMaxConcurrentStreams()) {
238 encoder = new StreamBufferingEncoder(encoder);
239 }
240 Http2ConnectionDecoder decoder = new DefaultHttp2ConnectionDecoder(connection, encoder, frameReader,
241 promisedRequestVerifier(), isAutoAckSettingsFrame(), isAutoAckPingFrame(), isValidateHeaders());
242 int maxConsecutiveEmptyDataFrames = decoderEnforceMaxConsecutiveEmptyDataFrames();
243 if (maxConsecutiveEmptyDataFrames > 0) {
244 decoder = new Http2EmptyDataFrameConnectionDecoder(decoder, maxConsecutiveEmptyDataFrames);
245 }
246
247 return build(decoder, encoder, initialSettings());
248 }
249 return super.build();
250 }
251
252 @Override
253 protected Http2MultiplexCodec build(
254 Http2ConnectionDecoder decoder, Http2ConnectionEncoder encoder, Http2Settings initialSettings) {
255 Http2MultiplexCodec codec = new Http2MultiplexCodec(encoder, decoder, initialSettings, childHandler,
256 upgradeStreamHandler, decoupleCloseAndGoAway(), flushPreface());
257 codec.gracefulShutdownTimeoutMillis(gracefulShutdownTimeoutMillis());
258 return codec;
259 }
260 }