
reactor.netty.http.server.Http2StreamBridgeServerHandler Maven / Gradle / Ivy
/*
* Copyright (c) 2011-Present VMware, Inc. or its affiliates, All Rights Reserved.
*
* Licensed 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 reactor.netty.http.server;
import java.net.SocketAddress;
import java.util.Optional;
import java.util.function.BiFunction;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelDuplexHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPromise;
import io.netty.handler.codec.http.DefaultHttpContent;
import io.netty.handler.codec.http.HttpRequest;
import io.netty.handler.codec.http.cookie.ServerCookieDecoder;
import io.netty.handler.codec.http.cookie.ServerCookieEncoder;
import io.netty.handler.codec.http2.Http2StreamFrameToHttpObjectCodec;
import io.netty.handler.ssl.SslHandler;
import reactor.core.publisher.Mono;
import reactor.netty.Connection;
import reactor.netty.ConnectionObserver;
import reactor.util.annotation.Nullable;
import static reactor.netty.ReactorNetty.format;
/**
* This handler is intended to work together with {@link Http2StreamFrameToHttpObjectCodec}
* it converts the outgoing messages into objects expected by
* {@link Http2StreamFrameToHttpObjectCodec}.
*
* @author Violeta Georgieva
*/
final class Http2StreamBridgeServerHandler extends ChannelDuplexHandler {
final ServerCookieDecoder cookieDecoder;
final ServerCookieEncoder cookieEncoder;
final ConnectionObserver listener;
final BiFunction forwardedHeaderHandler;
final BiFunction super Mono, ? super Connection, ? extends Mono> mapHandle;
SocketAddress remoteAddress;
Boolean secured;
Http2StreamBridgeServerHandler(ConnectionObserver listener,
@Nullable BiFunction forwardedHeaderHandler,
ServerCookieEncoder encoder, ServerCookieDecoder decoder,
@Nullable BiFunction super Mono, ? super Connection, ? extends Mono> mapHandle) {
this.cookieDecoder = decoder;
this.cookieEncoder = encoder;
this.listener = listener;
this.forwardedHeaderHandler = forwardedHeaderHandler;
this.mapHandle = mapHandle;
}
@Override
public void handlerAdded(ChannelHandlerContext ctx) {
if (HttpServerOperations.log.isDebugEnabled()) {
HttpServerOperations.log.debug(format(ctx.channel(), "New HTTP/2 stream"));
}
ctx.read();
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
if (secured == null) {
secured = ctx.channel().parent().pipeline().get(SslHandler.class) != null;
}
if (remoteAddress == null) {
remoteAddress =
Optional.ofNullable(HAProxyMessageReader.resolveRemoteAddressFromProxyProtocol(ctx.channel().parent()))
.orElse(ctx.channel().parent().remoteAddress());
}
if (msg instanceof HttpRequest) {
HttpRequest request = (HttpRequest) msg;
HttpServerOperations ops;
try {
ops = new HttpServerOperations(Connection.from(ctx.channel()),
listener,
null,
request,
ConnectionInfo.from(ctx.channel().parent(),
request,
secured,
remoteAddress,
forwardedHeaderHandler),
cookieEncoder,
cookieDecoder,
mapHandle);
}
catch (RuntimeException e) {
HttpServerOperations.sendDecodingFailures(ctx, listener, e, msg);
return;
}
ops.bind();
listener.onStateChange(ops, ConnectionObserver.State.CONFIGURED);
}
ctx.fireChannelRead(msg);
}
@Override
@SuppressWarnings("FutureReturnValueIgnored")
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) {
if (msg instanceof ByteBuf) {
//"FutureReturnValueIgnored" this is deliberate
ctx.write(new DefaultHttpContent((ByteBuf) msg), promise);
}
else {
//"FutureReturnValueIgnored" this is deliberate
ctx.write(msg, promise);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy