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(); }