From 80ffcd7a85720aae633bc5b3cf16963112a96012 Mon Sep 17 00:00:00 2001 From: Sean Yang Date: Tue, 21 May 2024 18:56:20 +0800 Subject: [PATCH] fix(triple): Fix http GET failed cause by http1 upgrade cause (#14223) --- .../rpc/protocol/tri/TripleHttp2Protocol.java | 2 - .../h12/HttpServerAfterUpgradeHandler.java | 69 ------------------- 2 files changed, 71 deletions(-) delete mode 100644 dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/h12/HttpServerAfterUpgradeHandler.java diff --git a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TripleHttp2Protocol.java b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TripleHttp2Protocol.java index 4e91dabb35c..2a8b539527e 100644 --- a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TripleHttp2Protocol.java +++ b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TripleHttp2Protocol.java @@ -34,7 +34,6 @@ import org.apache.dubbo.rpc.model.ApplicationModel; import org.apache.dubbo.rpc.model.FrameworkModel; import org.apache.dubbo.rpc.model.ScopeModelAware; -import org.apache.dubbo.rpc.protocol.tri.h12.HttpServerAfterUpgradeHandler; import org.apache.dubbo.rpc.protocol.tri.h12.TripleProtocolDetector; import org.apache.dubbo.rpc.protocol.tri.h12.http1.DefaultHttp11ServerTransportListenerFactory; import org.apache.dubbo.rpc.protocol.tri.h12.http2.GenericHttp2ServerTransportListenerFactory; @@ -160,7 +159,6 @@ private void configurerHttp1Handlers(URL url, List handlers) { ConfigurationUtils.getGlobalConfiguration(url.getOrDefaultApplicationModel()); return new Http2ServerUpgradeCodec( buildHttp2FrameCodec(config, url.getOrDefaultApplicationModel()), - new HttpServerAfterUpgradeHandler(), new HttpWriteQueueHandler(), new FlushConsolidationHandler(64, true), new TripleServerConnectionHandler(), diff --git a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/h12/HttpServerAfterUpgradeHandler.java b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/h12/HttpServerAfterUpgradeHandler.java deleted file mode 100644 index 30c89087d50..00000000000 --- a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/h12/HttpServerAfterUpgradeHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF 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 org.apache.dubbo.rpc.protocol.tri.h12; - -import io.netty.channel.ChannelHandler.Sharable; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import io.netty.handler.codec.http.HttpServerUpgradeHandler; -import io.netty.handler.codec.http2.DefaultHttp2DataFrame; -import io.netty.handler.codec.http2.DefaultHttp2Headers; -import io.netty.handler.codec.http2.DefaultHttp2HeadersFrame; -import io.netty.handler.codec.http2.Http2CodecUtil; -import io.netty.handler.codec.http2.Http2FrameCodec; -import io.netty.handler.codec.http2.Http2FrameStream; -import io.netty.handler.codec.http2.Http2Headers; -import io.netty.handler.codec.http2.InboundHttpToHttp2Adapter; - -import static io.netty.handler.codec.http.HttpResponseStatus.OK; - -/** - * If an upgrade occurred, the program need send a simple response via HTTP/2 on stream 1 (the stream specifically reserved - * for cleartext HTTP upgrade). However, {@link Http2FrameCodec} send 'upgradeRequest' to upgraded channel handlers by - * {@link InboundHttpToHttp2Adapter} (As it noted that this may behave strangely). So we need to distinguish the 'upgradeRequest' - * and send the response.
- * - * @see HttpServerUpgradeHandler - * @see Http2FrameCodec - * @see InboundHttpToHttp2Adapter - * @since 3.3.0 - */ -@Sharable -public class HttpServerAfterUpgradeHandler extends ChannelInboundHandlerAdapter { - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - if (msg instanceof DefaultHttp2HeadersFrame) { - DefaultHttp2HeadersFrame headersFrame = (DefaultHttp2HeadersFrame) msg; - if (headersFrame.stream().id() == Http2CodecUtil.HTTP_UPGRADE_STREAM_ID && headersFrame.isEndStream()) { - // upgradeRequest - sendResponse(ctx, headersFrame.stream()); - return; - } - } - super.channelRead(ctx, msg); - } - - /** - * Send a frame for the response status - */ - private static void sendResponse(ChannelHandlerContext ctx, Http2FrameStream stream) { - Http2Headers headers = new DefaultHttp2Headers().status(OK.codeAsText()); - ctx.write(new DefaultHttp2HeadersFrame(headers).stream(stream)); - ctx.write(new DefaultHttp2DataFrame(true).stream(stream)); - } -}