/*
* 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:
*
* http://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 io.netty.channel.ChannelHandler;
import io.netty.handler.codec.http2.Http2HeadersEncoder.SensitivityDetector;
import io.netty.util.internal.UnstableApi;
import static io.netty.handler.logging.LogLevel.INFO;
import static io.netty.util.internal.ObjectUtil.checkNotNull;
/**
* A builder for {@link Http2Codec}.
*/
@UnstableApi
public final class Http2CodecBuilder {
private static final Http2FrameLogger HTTP2_FRAME_LOGGER = new Http2FrameLogger(INFO, Http2Codec.class);
private final Http2StreamChannelBootstrap bootstrap;
private final boolean server;
private Http2Settings initialSettings;
private Http2FrameLogger frameLogger;
private SensitivityDetector headersSensitivityDetector;
/**
* Creates a new {@link Http2Codec} builder.
*
* @param server {@code true} this is a server
* @param streamHandler the handler added to channels for remotely-created streams. It must be
* {@link ChannelHandler.Sharable}. {@code null} if the event loop from the parent channel should be used.
*/
public Http2CodecBuilder(boolean server, ChannelHandler streamHandler) {
this(server, new Http2StreamChannelBootstrap().handler(streamHandler));
}
/**
* Creates a new {@link Http2Codec} builder.
*
* @param server {@code true} this is a server
* @param bootstrap bootstrap used to instantiate child channels for remotely-created streams.
*/
public Http2CodecBuilder(boolean server, Http2StreamChannelBootstrap bootstrap) {
this.bootstrap = checkNotNull(bootstrap, "bootstrap");
this.server = server;
this.initialSettings = Http2Settings.defaultSettings();
this.frameLogger = HTTP2_FRAME_LOGGER;
this.headersSensitivityDetector = null;
}
/**
* Specifies the initial settings to send to peer.
*
* @param initialSettings non default initial settings to send to peer
* @return {@link Http2CodecBuilder} the builder for the {@link Http2Codec}
*/
public Http2CodecBuilder initialSettings(Http2Settings initialSettings) {
this.initialSettings = initialSettings;
return this;
}
/**
* Returns the initial settings to send to peer.
*/
public Http2Settings initialSettings() {
return initialSettings;
}
/**
* Specifies the frame logger to log messages with.
*
* @param frameLogger handler used to log all frames
* @return {@link Http2CodecBuilder} the builder for the {@link Http2Codec}
*/
public Http2CodecBuilder frameLogger(Http2FrameLogger frameLogger) {
this.frameLogger = frameLogger;
return this;
}
/**
* Returns the frame logger to log messages with.
*/
public Http2FrameLogger frameLogger() {
return frameLogger;
}
/**
* Specifies the headers sensitivity detector.
*
* @param headersSensitivityDetector decides whether headers should be considered sensitive or not
* @return {@link Http2CodecBuilder} the builder for the {@link Http2Codec}
*/
public Http2CodecBuilder headersSensitivityDetector(SensitivityDetector headersSensitivityDetector) {
this.headersSensitivityDetector = headersSensitivityDetector;
return this;
}
/**
* Returns the headers sensitivity detector.
*/
public SensitivityDetector headersSensitivityDetector() {
return headersSensitivityDetector;
}
private Http2FrameWriter frameWriter() {
return headersSensitivityDetector() == null ?
new DefaultHttp2FrameWriter() :
new DefaultHttp2FrameWriter(headersSensitivityDetector());
}
/**
* Builds/creates a new {@link Http2Codec} instance using this builder's current settings.
*/
public Http2Codec build() {
return new Http2Codec(server, bootstrap,
frameWriter(), frameLogger(), initialSettings());
}
}