fix(triple): Fix http GET failed cause by http1 upgrade cause (#14223)

This commit is contained in:
Sean Yang 2024-05-21 18:56:20 +08:00 committed by GitHub
parent b95695bf4f
commit 80ffcd7a85
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 0 additions and 71 deletions

View File

@ -34,7 +34,6 @@ import org.apache.dubbo.remoting.utils.UrlUtils;
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 @@ public class TripleHttp2Protocol extends AbstractWireProtocol implements ScopeMo
ConfigurationUtils.getGlobalConfiguration(url.getOrDefaultApplicationModel());
return new Http2ServerUpgradeCodec(
buildHttp2FrameCodec(config, url.getOrDefaultApplicationModel()),
new HttpServerAfterUpgradeHandler(),
new HttpWriteQueueHandler(),
new FlushConsolidationHandler(64, true),
new TripleServerConnectionHandler(),

View File

@ -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.<br/>
*
* @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));
}
}