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

more pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/knox.git


The following commit(s) were added to refs/heads/master by this push:
     new 81fe6fc  KNOX-1986 - Do not attempt to rewrite empty payload (#129)
81fe6fc is described below

commit 81fe6fcb71b9d55d07fddbd34d126fe0d8ef9558
Author: Sandeep Moré <m...@apache.org>
AuthorDate: Fri Aug 9 18:20:41 2019 -0400

    KNOX-1986 - Do not attempt to rewrite empty payload (#129)
---
 .../filter/rewrite/impl/UrlRewriteRequest.java     |  7 +-
 .../filter/rewrite/impl/UrlRewriteRequestTest.java | 87 ++++++++++++++++++++++
 .../knox/test/mock/MockServletInputStream.java     |  5 ++
 3 files changed, 98 insertions(+), 1 deletion(-)

diff --git 
a/gateway-provider-rewrite/src/main/java/org/apache/knox/gateway/filter/rewrite/impl/UrlRewriteRequest.java
 
b/gateway-provider-rewrite/src/main/java/org/apache/knox/gateway/filter/rewrite/impl/UrlRewriteRequest.java
index 1430f93..5fc1079 100644
--- 
a/gateway-provider-rewrite/src/main/java/org/apache/knox/gateway/filter/rewrite/impl/UrlRewriteRequest.java
+++ 
b/gateway-provider-rewrite/src/main/java/org/apache/knox/gateway/filter/rewrite/impl/UrlRewriteRequest.java
@@ -235,7 +235,12 @@ public class UrlRewriteRequest extends 
GatewayRequestWrapper implements Resolver
   @Override
   public ServletInputStream getInputStream() throws IOException {
     ServletInputStream input = super.getInputStream();
-    if( getContentLength() != 0 ) {
+    /**
+     *  Make sure payload is not empty before adding
+     *  content-type specific filters. We cannot rely on 
request.getContentLength()
+     *  since previous filters update it to return -1
+     */
+    if( getContentLength() != 0 && input.available() != 0 ) {
       MimeType mimeType = getMimeType();
 
       /* In cases where content type is application/text and content-encoding 
is gzip */
diff --git 
a/gateway-provider-rewrite/src/test/java/org/apache/knox/gateway/filter/rewrite/impl/UrlRewriteRequestTest.java
 
b/gateway-provider-rewrite/src/test/java/org/apache/knox/gateway/filter/rewrite/impl/UrlRewriteRequestTest.java
index 2b408e2..7aace6b 100644
--- 
a/gateway-provider-rewrite/src/test/java/org/apache/knox/gateway/filter/rewrite/impl/UrlRewriteRequestTest.java
+++ 
b/gateway-provider-rewrite/src/test/java/org/apache/knox/gateway/filter/rewrite/impl/UrlRewriteRequestTest.java
@@ -39,10 +39,12 @@ import javax.servlet.ServletContext;
 import javax.servlet.ServletInputStream;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URI;
+import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.Collections;
@@ -100,6 +102,91 @@ public class UrlRewriteRequestTest {
     assertEquals(hostHeader, "targethost.com");
   }
 
+  @Test
+  public void testEmptyPayload() throws Exception {
+
+    /* copy results */
+    final ByteArrayOutputStream results = new ByteArrayOutputStream();
+    final ByteArrayInputStream bai = new ByteArrayInputStream(
+        "".getBytes(StandardCharsets.UTF_8));
+
+    final ServletInputStream payload = new ServletInputStream() {
+
+      @Override
+      public int read() throws IOException {
+        return bai.read();
+      }
+
+      @Override
+      public int available() throws IOException {
+        return bai.available();
+      }
+
+      @Override
+      public boolean isFinished() {
+        return false;
+      }
+
+      @Override
+      public boolean isReady() {
+        return false;
+      }
+
+      @Override
+      public void setReadListener(ReadListener readListener) {
+
+      }
+    };
+
+    UrlRewriteProcessor rewriter = EasyMock
+        .createNiceMock(UrlRewriteProcessor.class);
+
+    ServletContext context = EasyMock.createNiceMock(ServletContext.class);
+    EasyMock.expect(context.getServletContextName())
+        .andReturn("test-cluster-name").anyTimes();
+    EasyMock.expect(context.getInitParameter("test-init-param-name"))
+        .andReturn("test-init-param-value").anyTimes();
+    EasyMock.expect(context.getAttribute(
+        UrlRewriteServletContextListener.PROCESSOR_ATTRIBUTE_NAME))
+        .andReturn(rewriter).anyTimes();
+
+    FilterConfig config = EasyMock.createNiceMock(FilterConfig.class);
+    EasyMock.expect(config.getInitParameter("test-filter-init-param-name"))
+        .andReturn("test-filter-init-param-value").anyTimes();
+    EasyMock.expect(config.getServletContext()).andReturn(context).anyTimes();
+
+    HttpServletRequest request = EasyMock
+        .createNiceMock(HttpServletRequest.class);
+    EasyMock.expect(request.getScheme()).andReturn("https").anyTimes();
+    EasyMock.expect(request.getServerName()).andReturn("targethost.com")
+        .anyTimes();
+    EasyMock.expect(request.getServerPort()).andReturn(80).anyTimes();
+    EasyMock.expect(request.getRequestURI()).andReturn("/").anyTimes();
+    EasyMock.expect(request.getQueryString()).andReturn(null).anyTimes();
+    EasyMock.expect(request.getHeader("Host")).andReturn("sourcehost.com")
+        .anyTimes();
+
+    EasyMock.expect(request.getMethod()).andReturn("POST").anyTimes();
+    EasyMock.expect(request.getContentType())
+        .andReturn("application/xml").anyTimes();
+    EasyMock.expect(request.getInputStream()).andReturn(payload).anyTimes();
+    EasyMock.expect(request.getContentLength()).andReturn(-1).anyTimes();
+
+    HttpServletResponse response = EasyMock
+        .createNiceMock(HttpServletResponse.class);
+    //    EasyMock.replay( rewriter, context, config, request, response );
+    EasyMock.replay(rewriter, context, config, request, response);
+
+    // instantiate UrlRewriteRequest so that we can use it as a Template 
factory for targetUrl
+    UrlRewriteRequest rewriteRequest = new UrlRewriteRequest(config, request);
+
+    ServletInputStream inputStream = rewriteRequest.getInputStream();
+    HttpEntity entity = new InputStreamEntity(inputStream,
+        request.getContentLength(), ContentType.parse("application/xml"));
+    entity.writeTo(results);
+
+  }
+
   /*
    * Test the case where a request has
    * Content-Type:text/xml and Content-Encoding:gzip
diff --git 
a/gateway-test-utils/src/main/java/org/apache/knox/test/mock/MockServletInputStream.java
 
b/gateway-test-utils/src/main/java/org/apache/knox/test/mock/MockServletInputStream.java
index fe6c6a7..214cd6e 100644
--- 
a/gateway-test-utils/src/main/java/org/apache/knox/test/mock/MockServletInputStream.java
+++ 
b/gateway-test-utils/src/main/java/org/apache/knox/test/mock/MockServletInputStream.java
@@ -37,6 +37,11 @@ public class MockServletInputStream extends 
ServletInputStream {
   }
 
   @Override
+  public int available() throws IOException {
+    return stream.available();
+  }
+
+  @Override
   public boolean isFinished() {
     throw new UnsupportedOperationException();
   }

Reply via email to