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é <[email protected]>
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();
}