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");
+ }
+
+ }
+}