From 7d9f063fbd94b64dbcd3d6a9819ff6d1b3e12760 Mon Sep 17 00:00:00 2001 From: liuhy Date: Mon, 3 Aug 2026 00:00:04 -0700 Subject: [PATCH 1/2] [ISSUE #10776] Handle short HTTP2 protocol buffers --- .../http2proxy/Http2ProtocolProxyHandler.java | 3 +++ .../Http2ProtocolProxyHandlerTest.java | 24 ++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/proxy/src/main/java/org/apache/rocketmq/proxy/remoting/protocol/http2proxy/Http2ProtocolProxyHandler.java b/proxy/src/main/java/org/apache/rocketmq/proxy/remoting/protocol/http2proxy/Http2ProtocolProxyHandler.java index 4ab0a01f70c..a12a5f20d27 100644 --- a/proxy/src/main/java/org/apache/rocketmq/proxy/remoting/protocol/http2proxy/Http2ProtocolProxyHandler.java +++ b/proxy/src/main/java/org/apache/rocketmq/proxy/remoting/protocol/http2proxy/Http2ProtocolProxyHandler.java @@ -85,6 +85,9 @@ public boolean match(ByteBuf in) { if (!ConfigurationManager.getProxyConfig().isEnableRemotingLocalProxyGrpc()) { return false; } + if (in.readableBytes() < Integer.BYTES) { + return false; + } // If starts with 'PRI ' return in.getInt(in.readerIndex()) == PRI_INT; diff --git a/proxy/src/test/java/org/apache/rocketmq/proxy/remoting/protocol/http2proxy/Http2ProtocolProxyHandlerTest.java b/proxy/src/test/java/org/apache/rocketmq/proxy/remoting/protocol/http2proxy/Http2ProtocolProxyHandlerTest.java index 4a417ea68a2..9edd9e2f80e 100644 --- a/proxy/src/test/java/org/apache/rocketmq/proxy/remoting/protocol/http2proxy/Http2ProtocolProxyHandlerTest.java +++ b/proxy/src/test/java/org/apache/rocketmq/proxy/remoting/protocol/http2proxy/Http2ProtocolProxyHandlerTest.java @@ -17,15 +17,20 @@ package org.apache.rocketmq.proxy.remoting.protocol.http2proxy; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; import io.netty.channel.Channel; import io.netty.channel.ChannelPipeline; import io.netty.handler.codec.haproxy.HAProxyMessageEncoder; +import org.apache.rocketmq.proxy.config.ConfigurationManager; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; @@ -44,6 +49,8 @@ public class Http2ProtocolProxyHandlerTest { @Before public void setUp() throws Exception { + ConfigurationManager.initConfig(); + ConfigurationManager.getProxyConfig().setEnableRemotingLocalProxyGrpc(true); http2ProtocolProxyHandler = new Http2ProtocolProxyHandler(); } @@ -55,4 +62,19 @@ public void configPipeline() { when(outboundPipeline.addFirst(any(HAProxyMessageEncoder.class))).thenReturn(outboundPipeline); http2ProtocolProxyHandler.configPipeline(inboundChannel, outboundChannel); } -} \ No newline at end of file + + @Test + public void matchReturnsFalseForShortBuffers() { + assertFalse(http2ProtocolProxyHandler.match(Unpooled.EMPTY_BUFFER)); + + ByteBuf shortBuffer = Unpooled.wrappedBuffer(new byte[] {'P', 'R', 'I'}); + assertFalse(http2ProtocolProxyHandler.match(shortBuffer)); + } + + @Test + public void matchReturnsTrueForHttp2PrefacePrefix() { + ByteBuf http2Prefix = Unpooled.wrappedBuffer(new byte[] {'P', 'R', 'I', ' '}); + + assertTrue(http2ProtocolProxyHandler.match(http2Prefix)); + } +} From f5a345da2c0205d3c623a7e1f4665028380b5555 Mon Sep 17 00:00:00 2001 From: liuhy Date: Tue, 4 Aug 2026 04:06:34 -0700 Subject: [PATCH 2/2] test(proxy): isolate http2 protocol handler config --- .../http2proxy/Http2ProtocolProxyHandlerTest.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/proxy/src/test/java/org/apache/rocketmq/proxy/remoting/protocol/http2proxy/Http2ProtocolProxyHandlerTest.java b/proxy/src/test/java/org/apache/rocketmq/proxy/remoting/protocol/http2proxy/Http2ProtocolProxyHandlerTest.java index 9edd9e2f80e..ee0596e589a 100644 --- a/proxy/src/test/java/org/apache/rocketmq/proxy/remoting/protocol/http2proxy/Http2ProtocolProxyHandlerTest.java +++ b/proxy/src/test/java/org/apache/rocketmq/proxy/remoting/protocol/http2proxy/Http2ProtocolProxyHandlerTest.java @@ -23,6 +23,8 @@ import io.netty.channel.ChannelPipeline; import io.netty.handler.codec.haproxy.HAProxyMessageEncoder; import org.apache.rocketmq.proxy.config.ConfigurationManager; +import org.apache.rocketmq.proxy.config.InitConfigTest; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -35,9 +37,10 @@ import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) -public class Http2ProtocolProxyHandlerTest { +public class Http2ProtocolProxyHandlerTest extends InitConfigTest { private Http2ProtocolProxyHandler http2ProtocolProxyHandler; + private boolean originalEnableRemotingLocalProxyGrpc; @Mock private Channel inboundChannel; @Mock @@ -49,11 +52,16 @@ public class Http2ProtocolProxyHandlerTest { @Before public void setUp() throws Exception { - ConfigurationManager.initConfig(); + originalEnableRemotingLocalProxyGrpc = ConfigurationManager.getProxyConfig().isEnableRemotingLocalProxyGrpc(); ConfigurationManager.getProxyConfig().setEnableRemotingLocalProxyGrpc(true); http2ProtocolProxyHandler = new Http2ProtocolProxyHandler(); } + @After + public void tearDown() { + ConfigurationManager.getProxyConfig().setEnableRemotingLocalProxyGrpc(originalEnableRemotingLocalProxyGrpc); + } + @Test public void configPipeline() { when(inboundChannel.pipeline()).thenReturn(inboundPipeline);