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

lmccay 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 1ef048f  [KNOX-2622] Support Deflate Encoding for the Inbound Response 
(#459)
1ef048f is described below

commit 1ef048fa2d6ad6de566b1435880e3fe998839f59
Author: Zikun Xu <xuzikun2...@gmail.com>
AuthorDate: Mon Jun 21 19:02:44 2021 -0700

    [KNOX-2622] Support Deflate Encoding for the Inbound Response (#459)
---
 .../filter/rewrite/impl/UrlRewriteResponse.java      | 20 ++++++++++++++++++--
 .../filter/rewrite/impl/UrlRewriteResponseTest.java  | 19 +++++++++++++------
 2 files changed, 31 insertions(+), 8 deletions(-)

diff --git 
a/gateway-provider-rewrite/src/main/java/org/apache/knox/gateway/filter/rewrite/impl/UrlRewriteResponse.java
 
b/gateway-provider-rewrite/src/main/java/org/apache/knox/gateway/filter/rewrite/impl/UrlRewriteResponse.java
index 73c0025..73f16ba 100644
--- 
a/gateway-provider-rewrite/src/main/java/org/apache/knox/gateway/filter/rewrite/impl/UrlRewriteResponse.java
+++ 
b/gateway-provider-rewrite/src/main/java/org/apache/knox/gateway/filter/rewrite/impl/UrlRewriteResponse.java
@@ -55,7 +55,9 @@ import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.zip.DeflaterOutputStream;
 import java.util.zip.GZIPOutputStream;
+import java.util.zip.InflaterInputStream;
 
 import static 
org.apache.knox.gateway.filter.rewrite.impl.UrlRewriteUtil.getRewriteFilterConfig;
 import static 
org.apache.knox.gateway.filter.rewrite.impl.UrlRewriteUtil.pickFirstRuleWithEqualsIgnoreCasePathMatch;
@@ -90,6 +92,7 @@ public class UrlRewriteResponse extends 
GatewayResponseWrapper implements Params
   private String xForwardedHostname;
   private String xForwardedPort;
   private String xForwardedScheme;
+  private String contentEncoding;
 
   public UrlRewriteResponse( FilterConfig config, HttpServletRequest request, 
HttpServletResponse response ) {
     super( response );
@@ -102,6 +105,7 @@ public class UrlRewriteResponse extends 
GatewayResponseWrapper implements Params
     this.bodyFilterName = config.getInitParameter( 
UrlRewriteServletFilter.RESPONSE_BODY_FILTER_PARAM );
     this.headersFilterName = config.getInitParameter( 
UrlRewriteServletFilter.RESPONSE_HEADERS_FILTER_PARAM );
     this.headersFilterConfig = getRewriteFilterConfig( rewriter.getConfig(), 
headersFilterName, UrlRewriteServletFilter.HEADERS_MIME_TYPE );
+    this.contentEncoding = "";
   }
 
   protected boolean ignoreHeader( String name ) {
@@ -121,11 +125,18 @@ public class UrlRewriteResponse extends 
GatewayResponseWrapper implements Params
     return value;
   }
 
+  private void setContentEncoding(String name, String value) {
+    if ("Content-Encoding".equalsIgnoreCase(name)) {
+      contentEncoding = value;
+    }
+  }
+
   // Ignore the Content-Length from the dispatch respond since the respond 
body may be rewritten.
   @Override
   public void setHeader( String name, String value ) {
     if( !ignoreHeader( name) ) {
       value = rewriteValue( value, pickFirstRuleWithEqualsIgnoreCasePathMatch( 
headersFilterConfig, name ) );
+      setContentEncoding(name, value);
       super.setHeader( name, value );
     }
   }
@@ -136,6 +147,7 @@ public class UrlRewriteResponse extends 
GatewayResponseWrapper implements Params
     if( !ignoreHeader( name ) ) {
       String rule = pickFirstRuleWithEqualsIgnoreCasePathMatch( 
headersFilterConfig, name );
       value = rewriteValue( value, rule );
+      setContentEncoding(name, value);
       super.addHeader( name, value );
     }
   }
@@ -175,14 +187,18 @@ public class UrlRewriteResponse extends 
GatewayResponseWrapper implements Params
       inBuffer.reset();
 
       final InputStream unFilteredStream;
-      if(isGzip) {
+      if(isGzip || "gzip".equalsIgnoreCase(contentEncoding)) {
         unFilteredStream = new GzipCompressorInputStream(inBuffer, true);
+        outStream = new GZIPOutputStream(output, STREAM_BUFFER_SIZE);
+      } else if ("deflate".equalsIgnoreCase(contentEncoding)) {
+        unFilteredStream = new InflaterInputStream(inBuffer);
+        outStream = new DeflaterOutputStream(output);
       } else {
         unFilteredStream = inBuffer;
+        outStream = output;
       }
       String charset = MimeTypes.getCharset( mimeType, 
StandardCharsets.UTF_8.name() );
       inStream = filter.filter( unFilteredStream, charset, rewriter, this, 
UrlRewriter.Direction.OUT, filterContentConfig );
-      outStream = (isGzip) ? new GZIPOutputStream(output, STREAM_BUFFER_SIZE) 
: output;
     } else {
       inStream = input;
       outStream = output;
diff --git 
a/gateway-provider-rewrite/src/test/java/org/apache/knox/gateway/filter/rewrite/impl/UrlRewriteResponseTest.java
 
b/gateway-provider-rewrite/src/test/java/org/apache/knox/gateway/filter/rewrite/impl/UrlRewriteResponseTest.java
index 93df8bc..2c53928 100644
--- 
a/gateway-provider-rewrite/src/test/java/org/apache/knox/gateway/filter/rewrite/impl/UrlRewriteResponseTest.java
+++ 
b/gateway-provider-rewrite/src/test/java/org/apache/knox/gateway/filter/rewrite/impl/UrlRewriteResponseTest.java
@@ -35,8 +35,10 @@ import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.List;
+import java.util.zip.DeflaterOutputStream;
 import java.util.zip.GZIPInputStream;
 import java.util.zip.GZIPOutputStream;
+import java.util.zip.InflaterInputStream;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -135,7 +137,7 @@ public class UrlRewriteResponseTest {
 
     UrlRewriteResponse rewriteResponse = new UrlRewriteResponse(config, 
request, response);
     String content = "<?xml version=\"1.0\" 
standalone=\"no\"?><data>abc-大数据</data>";
-    testStreamResponse(content, rewriteResponse, false);
+    testStreamResponse(content, rewriteResponse, "");
   }
 
   @Test
@@ -158,16 +160,19 @@ public class UrlRewriteResponseTest {
     UrlRewriteResponse rewriteResponse = new UrlRewriteResponse( config, 
request, response );
 
     String content = "content to test gzip streaming";
-    testStreamResponse(content, rewriteResponse, false);
-    testStreamResponse(content, rewriteResponse, true);
+    testStreamResponse(content, rewriteResponse, "");
+    testStreamResponse(content, rewriteResponse, "gzip");
+    testStreamResponse(content, rewriteResponse, "deflate");
   }
 
-  private void testStreamResponse(String content, UrlRewriteResponse 
rewriteResponse, boolean isGzip) throws IOException {
+  private void testStreamResponse(String content, UrlRewriteResponse 
rewriteResponse, String contentType) throws IOException {
     Path inputFile = Files.createTempFile("input", "test");
     Path outputFile = Files.createTempFile("output", "test");
     try {
       try(OutputStream outputStream = Files.newOutputStream(inputFile);
-          OutputStream outStream = isGzip ? new GZIPOutputStream( outputStream 
) : outputStream) {
+          OutputStream outStream = "gzip".equalsIgnoreCase(contentType) ?
+                  new GZIPOutputStream( outputStream ) :
+                  "deflate".equalsIgnoreCase(contentType) ? new 
DeflaterOutputStream( outputStream ) : outputStream) {
         outStream.write(content.getBytes(StandardCharsets.UTF_8));
       }
 
@@ -177,7 +182,9 @@ public class UrlRewriteResponseTest {
       }
 
       try(InputStream inputStream = Files.newInputStream(outputFile);
-          InputStream inStream = isGzip ? new GZIPInputStream(inputStream) : 
inputStream) {
+          InputStream inStream = "gzip".equalsIgnoreCase(contentType) ?
+                  new GZIPInputStream(inputStream) :
+                  "deflate".equalsIgnoreCase(contentType) ? new 
InflaterInputStream(inputStream) : inputStream) {
         assertThat(String.valueOf(IOUtils.toCharArray(inStream, 
StandardCharsets.UTF_8)), is(content));
       }
     } finally {

Reply via email to