diff --git a/src/main/java/reactor/netty/http/server/Http2StreamBridgeHandler.java b/src/main/java/reactor/netty/http/server/Http2StreamBridgeHandler.java index fcf247b80f..3d580eb0f6 100644 --- a/src/main/java/reactor/netty/http/server/Http2StreamBridgeHandler.java +++ b/src/main/java/reactor/netty/http/server/Http2StreamBridgeHandler.java @@ -29,6 +29,7 @@ import io.netty.handler.codec.http2.DefaultHttp2DataFrame; import io.netty.handler.codec.http2.DefaultHttp2HeadersFrame; import io.netty.handler.codec.http2.Http2DataFrame; +import io.netty.handler.codec.http2.Http2FrameStream; import io.netty.handler.codec.http2.Http2Headers; import io.netty.handler.codec.http2.Http2HeadersFrame; import io.netty.handler.codec.http2.Http2StreamChannel; @@ -77,23 +78,26 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception .orElse(((SocketChannel) ctx.channel().parent()).remoteAddress()); } if (msg instanceof Http2HeadersFrame) { - Http2HeadersFrame headersFrame = (Http2HeadersFrame)msg; + Http2HeadersFrame headersFrame = (Http2HeadersFrame) msg; + Http2FrameStream stream = headersFrame.stream(); + int id = stream == null ? 0 : stream.id(); + HttpRequest request; if (headersFrame.isEndStream()) { - request = HttpConversionUtil.toFullHttpRequest(-1, + request = HttpConversionUtil.toFullHttpRequest(id, headersFrame.headers(), ctx.channel().alloc(), false); } else { - request = HttpConversionUtil.toHttpRequest(-1, + request = HttpConversionUtil.toHttpRequest(id, headersFrame.headers(), false); } - HttpToH2Operations ops = new HttpToH2Operations(Connection.from(ctx.channel()), + HttpServerOperations ops = new HttpServerOperations(Connection.from(ctx.channel()), listener, + null, request, - headersFrame.headers(), ConnectionInfo.from(ctx.channel().parent(), readForwardHeaders, request, diff --git a/src/main/java/reactor/netty/http/server/HttpServerOperations.java b/src/main/java/reactor/netty/http/server/HttpServerOperations.java index 8e8c7036b5..0235ba8566 100644 --- a/src/main/java/reactor/netty/http/server/HttpServerOperations.java +++ b/src/main/java/reactor/netty/http/server/HttpServerOperations.java @@ -53,6 +53,7 @@ import io.netty.handler.codec.http.cookie.Cookie; import io.netty.handler.codec.http.cookie.ServerCookieDecoder; import io.netty.handler.codec.http.cookie.ServerCookieEncoder; +import io.netty.handler.codec.http2.HttpConversionUtil; import io.netty.util.AsciiString; import io.netty.util.ReferenceCountUtil; import org.reactivestreams.Publisher; @@ -236,6 +237,10 @@ public boolean isWebsocket() { return get(channel()) instanceof WebsocketServerOperations; } + boolean isHttp2() { + return requestHeaders().contains(HttpConversionUtil.ExtensionHeaderNames.SCHEME.text()); + } + @Override public HttpServerResponse keepAlive(boolean keepAlive) { HttpUtil.setKeepAlive(nettyResponse, keepAlive); @@ -449,6 +454,9 @@ protected void onInboundNext(ChannelHandlerContext ctx, Object msg) { } if (msg instanceof FullHttpRequest) { super.onInboundNext(ctx, msg); + if (isHttp2()) { + onInboundComplete(); + } } return; } diff --git a/src/main/java/reactor/netty/http/server/HttpToH2Operations.java b/src/main/java/reactor/netty/http/server/HttpToH2Operations.java deleted file mode 100644 index 369f08d671..0000000000 --- a/src/main/java/reactor/netty/http/server/HttpToH2Operations.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (c) 2011-2019 Pivotal Software Inc, 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 io.netty.channel.ChannelHandlerContext; -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.Http2DataFrame; -import io.netty.handler.codec.http2.Http2Frame; -import io.netty.handler.codec.http2.Http2Headers; -import io.netty.handler.codec.http2.Http2HeadersFrame; -import io.netty.util.ReferenceCountUtil; -import reactor.netty.Connection; -import reactor.netty.ConnectionObserver; - -import static reactor.netty.ReactorNetty.format; - -/** - * @author Stephane Maldini - */ -public class HttpToH2Operations extends HttpServerOperations { - - - final Http2Headers http2Headers; - - HttpToH2Operations(Connection c, - ConnectionObserver listener, - HttpRequest request, - Http2Headers headers, - ConnectionInfo connectionInfo, - ServerCookieEncoder encoder, - ServerCookieDecoder decoder) { - super(c, listener, null, request, connectionInfo, encoder, decoder); - - this.http2Headers = headers; - } - - @Override - protected void onInboundNext(ChannelHandlerContext ctx, Object msg) { - if (msg instanceof Http2Frame) { - if (msg instanceof Http2DataFrame) { - Http2DataFrame data = (Http2DataFrame) msg; - super.onInboundNext(ctx, data); - if (data.isEndStream()) { - onInboundComplete(); - } - return; - } - - if(msg instanceof Http2HeadersFrame) { - try { - listener().onStateChange(this, HttpServerState.REQUEST_RECEIVED); - } - catch (Exception e) { - onInboundError(e); - ReferenceCountUtil.release(msg); - return; - } - if (((Http2HeadersFrame) msg).isEndStream()) { - super.onInboundNext(ctx, msg); - } - return; - } - - if (log.isDebugEnabled()){ - log.debug(format(channel(), "Unused H2 frame " + msg.toString())); - } - return; - } - - super.onInboundNext(ctx, msg); - } -}