You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by pe...@apache.org on 2020/11/10 07:02:34 UTC

[pulsar] 01/04: Fix request.getContentLength() to return 0 if it is less than 0 (#8448)

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

penghui pushed a commit to branch branch-2.6
in repository https://gitbox.apache.org/repos/asf/pulsar.git

commit b2f0837b8003c3d23611384a2fff63b17b23506b
Author: かとかい <25...@gmail.com>
AuthorDate: Thu Nov 5 15:22:56 2020 +0900

    Fix request.getContentLength() to return 0 if it is less than 0 (#8448)
    
    ### Motivation
    
    - "Negative initial size: -1" error occurs when submitting an HTTP request which has "Content-Type: application/json"  and no request body .
    
    ### Modifications
    
    - Pass 0 to argument of ByteArrayOutputStream if request.getContentLength() returns a negative number.
    - Add unit test.
    
    
    (cherry picked from commit 9ff92845e67a468938f135ff72d91755d16f2cbf)
---
 .../pulsar/proxy/server/AdminProxyHandler.java     |  2 +-
 .../pulsar/proxy/server/AdminProxyHandlerTest.java | 56 ++++++++++++++++++++++
 2 files changed, 57 insertions(+), 1 deletion(-)

diff --git a/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/AdminProxyHandler.java b/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/AdminProxyHandler.java
index 697ddf9..28a3140 100644
--- a/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/AdminProxyHandler.java
+++ b/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/server/AdminProxyHandler.java
@@ -169,7 +169,7 @@ class AdminProxyHandler extends ProxyServlet {
         private final ByteArrayOutputStream bodyBuffer;
         protected ReplayableProxyContentProvider(HttpServletRequest request, HttpServletResponse response, Request proxyRequest, InputStream input) {
             super(request, response, proxyRequest, input);
-            bodyBuffer = new ByteArrayOutputStream(request.getContentLength());
+            bodyBuffer = new ByteArrayOutputStream(Math.max(request.getContentLength(), 0));
         }
 
         @Override
diff --git a/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/AdminProxyHandlerTest.java b/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/AdminProxyHandlerTest.java
new file mode 100644
index 0000000..ad7f0e5
--- /dev/null
+++ b/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/AdminProxyHandlerTest.java
@@ -0,0 +1,56 @@
+/**
+ * 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.pulsar.proxy.server;
+
+import static org.mockito.Mockito.*;
+
+import org.eclipse.jetty.client.api.Request;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import java.io.InputStream;
+import java.io.ByteArrayOutputStream;
+import java.lang.reflect.Field;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public class AdminProxyHandlerTest {
+
+    @Test
+    public void replayableProxyContentProviderTest() throws Exception {
+
+        AdminProxyHandler adminProxyHandler = new AdminProxyHandler(mock(ProxyConfiguration.class),
+                mock(BrokerDiscoveryProvider.class));
+
+        HttpServletRequest request = mock(HttpServletRequest.class);
+        doReturn(-1).when(request).getContentLength();
+
+        try {
+            AdminProxyHandler.ReplayableProxyContentProvider replayableProxyContentProvider = adminProxyHandler.new ReplayableProxyContentProvider(
+                    request, mock(HttpServletResponse.class), mock(Request.class), mock(InputStream.class));
+            Field field = replayableProxyContentProvider.getClass().getDeclaredField("bodyBuffer");
+            field.setAccessible(true);
+            Assert.assertEquals(((ByteArrayOutputStream) field.get(replayableProxyContentProvider)).size(), 0);
+        } catch (IllegalArgumentException e) {
+            Assert.fail("IllegalArgumentException should not be thrown");
+        }
+
+    }
+}