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