This is an automated email from the ASF dual-hosted git repository.

albumenj pushed a commit to branch 3.3
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/3.3 by this push:
     new 61d7f2e412 Fix memory leak in HttpPostRequestDecoder when body is 
empty (#14760)
61d7f2e412 is described below

commit 61d7f2e412a448983bfa102c4aa97e817c08b07a
Author: Sean Yang <[email protected]>
AuthorDate: Fri Oct 11 13:41:45 2024 +0800

    Fix memory leak in HttpPostRequestDecoder when body is empty (#14760)
---
 .../java/org/apache/dubbo/remoting/http12/HttpUtils.java    |  3 +--
 .../protocol/tri/rest/support/basic/RestProtocolTest.groovy | 13 +++++++++++++
 2 files changed, 14 insertions(+), 2 deletions(-)

diff --git 
a/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/HttpUtils.java
 
b/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/HttpUtils.java
index 488242d921..d20ccec53c 100644
--- 
a/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/HttpUtils.java
+++ 
b/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/HttpUtils.java
@@ -32,7 +32,6 @@ import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
 import io.netty.buffer.ByteBufInputStream;
 import io.netty.buffer.ByteBufOutputStream;
-import io.netty.buffer.Unpooled;
 import io.netty.buffer.UnpooledByteBufAllocator;
 import io.netty.handler.codec.http.DefaultFullHttpRequest;
 import io.netty.handler.codec.http.DefaultHttpHeaders;
@@ -169,7 +168,7 @@ public final class HttpUtils {
                 inputStream.mark(Integer.MAX_VALUE);
             }
             if (inputStream.available() == 0) {
-                data = Unpooled.EMPTY_BUFFER;
+                return null;
             } else {
                 data = HEAP_ALLOC.buffer();
                 ByteBufOutputStream os = new ByteBufOutputStream(data);
diff --git 
a/dubbo-rpc/dubbo-rpc-triple/src/test/groovy/org/apache/dubbo/rpc/protocol/tri/rest/support/basic/RestProtocolTest.groovy
 
b/dubbo-rpc/dubbo-rpc-triple/src/test/groovy/org/apache/dubbo/rpc/protocol/tri/rest/support/basic/RestProtocolTest.groovy
index 430a646d01..57e836d44a 100644
--- 
a/dubbo-rpc/dubbo-rpc-triple/src/test/groovy/org/apache/dubbo/rpc/protocol/tri/rest/support/basic/RestProtocolTest.groovy
+++ 
b/dubbo-rpc/dubbo-rpc-triple/src/test/groovy/org/apache/dubbo/rpc/protocol/tri/rest/support/basic/RestProtocolTest.groovy
@@ -24,6 +24,9 @@ import 
org.apache.dubbo.rpc.protocol.tri.rest.test.BaseServiceTest
 import org.apache.dubbo.rpc.protocol.tri.test.TestRequest
 import org.apache.dubbo.rpc.protocol.tri.test.TestRunnerBuilder
 
+import io.netty.buffer.AbstractByteBuf
+import io.netty.util.ResourceLeakDetector
+
 class RestProtocolTest extends BaseServiceTest {
 
     @Override
@@ -174,8 +177,14 @@ class RestProtocolTest extends BaseServiceTest {
             '/argTest' | 'Sam is 8 years old'
     }
 
+    @SuppressWarnings('GroovyAccessibility')
     def "urlEncodeForm body test"() {
         given:
+            def level = ResourceLeakDetector.level
+            def leaks = AbstractByteBuf.leakDetector.allLeaks
+            ResourceLeakDetector.level = ResourceLeakDetector.Level.PARANOID
+            leaks.clear()
+        and:
             def request = new TestRequest(
                 path: path,
                 contentType: MediaType.APPLICATION_FROM_URLENCODED,
@@ -183,9 +192,13 @@ class RestProtocolTest extends BaseServiceTest {
             )
         expect:
             runner.post(request) == output
+            leaks.empty
+        cleanup:
+            ResourceLeakDetector.level = level
         where:
             path       | body             | output
             '/argTest' | 'name=Sam&age=8' | 'Sam is 8 years old'
+            '/argTest' | '' | 'null is 0 years old'
     }
 
     def "override mapping test"() {

Reply via email to