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