io.netty.handler.codec.http2.Http2FrameCodecBuilder Maven / Gradle / Ivy
/*
* Copyright 2017 The Netty Project
*
* The Netty Project licenses this file to you under the Apache License,
* version 2.0 (the "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at:
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
package io.netty.handler.codec.http2;
import static io.netty.util.internal.ObjectUtil.checkNotNull;
/**
* Builder for the {@link Http2FrameCodec}.
*/
public class Http2FrameCodecBuilder extends
AbstractHttp2ConnectionHandlerBuilder {
private Http2FrameWriter frameWriter;
/**
* Allows overriding behavior of existing builder.
*
* Users of this constructor are responsible for invoking {@link #server(boolean)} method or overriding
* {@link #isServer()} method to give the builder information if the {@link Http2Connection}(s) it creates are in
* server or client mode.
*
* @see AbstractHttp2ConnectionHandlerBuilder
*/
protected Http2FrameCodecBuilder() {
}
Http2FrameCodecBuilder(boolean server) {
server(server);
// For backwards compatibility we should disable to timeout by default at this layer.
gracefulShutdownTimeoutMillis(0);
}
/**
* Creates a builder for an HTTP/2 client.
*/
public static Http2FrameCodecBuilder forClient() {
return new Http2FrameCodecBuilder(false);
}
/**
* Creates a builder for an HTTP/2 server.
*/
public static Http2FrameCodecBuilder forServer() {
return new Http2FrameCodecBuilder(true);
}
// For testing only.
Http2FrameCodecBuilder frameWriter(Http2FrameWriter frameWriter) {
this.frameWriter = checkNotNull(frameWriter, "frameWriter");
return this;
}
@Override
public Http2Settings initialSettings() {
return super.initialSettings();
}
@Override
public Http2FrameCodecBuilder initialSettings(Http2Settings settings) {
return super.initialSettings(settings);
}
@Override
public long gracefulShutdownTimeoutMillis() {
return super.gracefulShutdownTimeoutMillis();
}
@Override
public Http2FrameCodecBuilder gracefulShutdownTimeoutMillis(long gracefulShutdownTimeoutMillis) {
return super.gracefulShutdownTimeoutMillis(gracefulShutdownTimeoutMillis);
}
@Override
public boolean isServer() {
return super.isServer();
}
@Override
public int maxReservedStreams() {
return super.maxReservedStreams();
}
@Override
public Http2FrameCodecBuilder maxReservedStreams(int maxReservedStreams) {
return super.maxReservedStreams(maxReservedStreams);
}
@Override
public boolean isValidateHeaders() {
return super.isValidateHeaders();
}
@Override
public Http2FrameCodecBuilder validateHeaders(boolean validateHeaders) {
return super.validateHeaders(validateHeaders);
}
@Override
public Http2FrameLogger frameLogger() {
return super.frameLogger();
}
@Override
public Http2FrameCodecBuilder frameLogger(Http2FrameLogger frameLogger) {
return super.frameLogger(frameLogger);
}
@Override
public boolean encoderEnforceMaxConcurrentStreams() {
return super.encoderEnforceMaxConcurrentStreams();
}
@Override
public Http2FrameCodecBuilder encoderEnforceMaxConcurrentStreams(boolean encoderEnforceMaxConcurrentStreams) {
return super.encoderEnforceMaxConcurrentStreams(encoderEnforceMaxConcurrentStreams);
}
@Override
public int encoderEnforceMaxQueuedControlFrames() {
return super.encoderEnforceMaxQueuedControlFrames();
}
@Override
public Http2FrameCodecBuilder encoderEnforceMaxQueuedControlFrames(int maxQueuedControlFrames) {
return super.encoderEnforceMaxQueuedControlFrames(maxQueuedControlFrames);
}
@Override
public Http2HeadersEncoder.SensitivityDetector headerSensitivityDetector() {
return super.headerSensitivityDetector();
}
@Override
public Http2FrameCodecBuilder headerSensitivityDetector(
Http2HeadersEncoder.SensitivityDetector headerSensitivityDetector) {
return super.headerSensitivityDetector(headerSensitivityDetector);
}
@Override
public Http2FrameCodecBuilder encoderIgnoreMaxHeaderListSize(boolean ignoreMaxHeaderListSize) {
return super.encoderIgnoreMaxHeaderListSize(ignoreMaxHeaderListSize);
}
@Override
@Deprecated
public Http2FrameCodecBuilder initialHuffmanDecodeCapacity(int initialHuffmanDecodeCapacity) {
return super.initialHuffmanDecodeCapacity(initialHuffmanDecodeCapacity);
}
@Override
public Http2FrameCodecBuilder autoAckSettingsFrame(boolean autoAckSettings) {
return super.autoAckSettingsFrame(autoAckSettings);
}
@Override
public Http2FrameCodecBuilder autoAckPingFrame(boolean autoAckPingFrame) {
return super.autoAckPingFrame(autoAckPingFrame);
}
@Override
public Http2FrameCodecBuilder decoupleCloseAndGoAway(boolean decoupleCloseAndGoAway) {
return super.decoupleCloseAndGoAway(decoupleCloseAndGoAway);
}
@Override
public Http2FrameCodecBuilder flushPreface(boolean flushPreface) {
return super.flushPreface(flushPreface);
}
@Override
public int decoderEnforceMaxConsecutiveEmptyDataFrames() {
return super.decoderEnforceMaxConsecutiveEmptyDataFrames();
}
@Override
public Http2FrameCodecBuilder decoderEnforceMaxConsecutiveEmptyDataFrames(int maxConsecutiveEmptyFrames) {
return super.decoderEnforceMaxConsecutiveEmptyDataFrames(maxConsecutiveEmptyFrames);
}
@Override
public Http2FrameCodecBuilder decoderEnforceMaxRstFramesPerWindow(
int maxRstFramesPerWindow, int secondsPerWindow) {
return super.decoderEnforceMaxRstFramesPerWindow(maxRstFramesPerWindow, secondsPerWindow);
}
/**
* Build a {@link Http2FrameCodec} object.
*/
@Override
public Http2FrameCodec build() {
Http2FrameWriter frameWriter = this.frameWriter;
if (frameWriter != null) {
// This is to support our tests and will never be executed by the user as frameWriter(...)
// is package-private.
DefaultHttp2Connection connection = new DefaultHttp2Connection(isServer(), maxReservedStreams());
Long maxHeaderListSize = initialSettings().maxHeaderListSize();
Http2FrameReader frameReader = new DefaultHttp2FrameReader(maxHeaderListSize == null ?
new DefaultHttp2HeadersDecoder(isValidateHeaders()) :
new DefaultHttp2HeadersDecoder(isValidateHeaders(), maxHeaderListSize));
if (frameLogger() != null) {
frameWriter = new Http2OutboundFrameLogger(frameWriter, frameLogger());
frameReader = new Http2InboundFrameLogger(frameReader, frameLogger());
}
Http2ConnectionEncoder encoder = new DefaultHttp2ConnectionEncoder(connection, frameWriter);
if (encoderEnforceMaxConcurrentStreams()) {
encoder = new StreamBufferingEncoder(encoder);
}
Http2ConnectionDecoder decoder = new DefaultHttp2ConnectionDecoder(connection, encoder, frameReader,
promisedRequestVerifier(), isAutoAckSettingsFrame(), isAutoAckPingFrame(), isValidateHeaders());
int maxConsecutiveEmptyDataFrames = decoderEnforceMaxConsecutiveEmptyDataFrames();
if (maxConsecutiveEmptyDataFrames > 0) {
decoder = new Http2EmptyDataFrameConnectionDecoder(decoder, maxConsecutiveEmptyDataFrames);
}
return build(decoder, encoder, initialSettings());
}
return super.build();
}
@Override
protected Http2FrameCodec build(
Http2ConnectionDecoder decoder, Http2ConnectionEncoder encoder, Http2Settings initialSettings) {
Http2FrameCodec codec = new Http2FrameCodec(encoder, decoder, initialSettings,
decoupleCloseAndGoAway(), flushPreface());
codec.gracefulShutdownTimeoutMillis(gracefulShutdownTimeoutMillis());
return codec;
}
}