You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@knox.apache.org by kr...@apache.org on 2018/10/23 12:48:10 UTC

knox git commit: KNOX-1532 - Only decompress/recompress when there are rewrite rules

Repository: knox
Updated Branches:
  refs/heads/master ff03a0090 -> 2bd260120


KNOX-1532 - Only decompress/recompress when there are rewrite rules

Signed-off-by: Kevin Risden <kr...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/knox/repo
Commit: http://git-wip-us.apache.org/repos/asf/knox/commit/2bd26012
Tree: http://git-wip-us.apache.org/repos/asf/knox/tree/2bd26012
Diff: http://git-wip-us.apache.org/repos/asf/knox/diff/2bd26012

Branch: refs/heads/master
Commit: 2bd2601206a26b586be11f720beeaf626af8d6b4
Parents: ff03a00
Author: Kevin Risden <kr...@apache.org>
Authored: Fri Oct 19 12:21:35 2018 -0400
Committer: Kevin Risden <kr...@apache.org>
Committed: Tue Oct 23 08:47:51 2018 -0400

----------------------------------------------------------------------
 .../api/UrlRewriteStreamFilterFactory.java      | 24 ++++----
 .../filter/rewrite/impl/UrlRewriteRequest.java  | 12 +++-
 .../filter/rewrite/impl/UrlRewriteResponse.java | 65 ++++++++++----------
 .../impl/noop/NoOpUrlRewriteStreamFilter.java   | 55 -----------------
 ...ay.filter.rewrite.spi.UrlRewriteStreamFilter |  1 -
 5 files changed, 57 insertions(+), 100 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/knox/blob/2bd26012/gateway-provider-rewrite/src/main/java/org/apache/knox/gateway/filter/rewrite/api/UrlRewriteStreamFilterFactory.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite/src/main/java/org/apache/knox/gateway/filter/rewrite/api/UrlRewriteStreamFilterFactory.java b/gateway-provider-rewrite/src/main/java/org/apache/knox/gateway/filter/rewrite/api/UrlRewriteStreamFilterFactory.java
index 2d83e54..af8fd86 100644
--- a/gateway-provider-rewrite/src/main/java/org/apache/knox/gateway/filter/rewrite/api/UrlRewriteStreamFilterFactory.java
+++ b/gateway-provider-rewrite/src/main/java/org/apache/knox/gateway/filter/rewrite/api/UrlRewriteStreamFilterFactory.java
@@ -25,6 +25,7 @@ import javax.activation.MimeType;
 import javax.activation.MimeTypeParseException;
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.Map;
@@ -32,13 +33,12 @@ import java.util.ServiceLoader;
 
 public abstract class UrlRewriteStreamFilterFactory {
 
-  private static final String DEFAULT_CHARACTER_ENCODING = "ISO-8859-1";
-
   private static final Map<String,Map<String,UrlRewriteStreamFilter>> MAP = loadFactories();
 
   private UrlRewriteStreamFilterFactory() {
   }
 
+  @Deprecated
   public static InputStream create(
       MimeType type,
       String name,
@@ -48,27 +48,29 @@ public abstract class UrlRewriteStreamFilterFactory {
       UrlRewriter.Direction direction,
       UrlRewriteFilterContentDescriptor config )
           throws IOException {
-    InputStream filteredStream = null;
-    Map<String,UrlRewriteStreamFilter> nameMap = getNameMap( type );
-    UrlRewriteStreamFilter filter = getFilter( nameMap, name );
-    String charset = MimeTypes.getCharset( type, DEFAULT_CHARACTER_ENCODING );
+    UrlRewriteStreamFilter filter = create(type, name);
+    String charset = MimeTypes.getCharset( type, StandardCharsets.ISO_8859_1.name() );
+    final InputStream filteredStream;
     if( filter != null ) {
       filteredStream = filter.filter( stream, charset, rewriter, resolver, direction, config );
+    } else {
+      filteredStream = stream;
     }
     return filteredStream;
   }
 
+  public static UrlRewriteStreamFilter create(MimeType type, String name) {
+    Map<String,UrlRewriteStreamFilter> nameMap = getNameMap( type );
+    return getFilter( nameMap, name );
+  }
+
   private static Map<String,Map<String,UrlRewriteStreamFilter>> loadFactories() {
     Map<String,Map<String,UrlRewriteStreamFilter>> typeMap = new HashMap<>();
     ServiceLoader<UrlRewriteStreamFilter> filters = ServiceLoader.load( UrlRewriteStreamFilter.class );
     for( UrlRewriteStreamFilter filter : filters ) {
       String[] types = filter.getTypes();
       for( String type: types ) {
-        Map<String,UrlRewriteStreamFilter> nameMap = typeMap.get( type );
-        if( nameMap == null ) {
-          nameMap = new LinkedHashMap<String,UrlRewriteStreamFilter>();
-          typeMap.put( type, nameMap );
-        }
+        Map<String, UrlRewriteStreamFilter> nameMap = typeMap.computeIfAbsent(type, k -> new LinkedHashMap<>());
         for( String name: filter.getNames() ) {
           nameMap.put( name, filter );
         }

http://git-wip-us.apache.org/repos/asf/knox/blob/2bd26012/gateway-provider-rewrite/src/main/java/org/apache/knox/gateway/filter/rewrite/impl/UrlRewriteRequest.java
----------------------------------------------------------------------
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 6bd0e34..b274bd2 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
@@ -28,6 +28,7 @@ import org.apache.knox.gateway.filter.rewrite.api.UrlRewriteServletFilter;
 import org.apache.knox.gateway.filter.rewrite.api.UrlRewriteStreamFilterFactory;
 import org.apache.knox.gateway.filter.rewrite.api.UrlRewriter;
 import org.apache.knox.gateway.filter.rewrite.i18n.UrlRewriteMessages;
+import org.apache.knox.gateway.filter.rewrite.spi.UrlRewriteStreamFilter;
 import org.apache.knox.gateway.i18n.messages.MessagesFactory;
 import org.apache.knox.gateway.util.MimeTypes;
 import org.apache.knox.gateway.util.urltemplate.Parser;
@@ -48,6 +49,7 @@ import java.net.MalformedURLException;
 import java.net.URISyntaxException;
 import java.net.URL;
 import java.net.URLDecoder;
+import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 import java.util.Enumeration;
 import java.util.List;
@@ -265,7 +267,15 @@ public class UrlRewriteRequest extends GatewayRequestWrapper implements Resolver
           mimeType = MimeTypes.create(asType, getCharacterEncoding());
         }
       }
-      InputStream stream = UrlRewriteStreamFilterFactory.create( mimeType, null, input, rewriter, this, UrlRewriter.Direction.IN, filterContentConfig );
+
+      final InputStream stream;
+      UrlRewriteStreamFilter filter = UrlRewriteStreamFilterFactory.create(mimeType, null);
+      if(filter != null) {
+        String charset = MimeTypes.getCharset( mimeType, StandardCharsets.ISO_8859_1.name() );
+        stream = filter.filter(input, charset, rewriter, this, UrlRewriter.Direction.IN, filterContentConfig );
+      } else {
+        stream = input;
+      }
       input = new UrlRewriteRequestStream( stream );
     }
     return input;

http://git-wip-us.apache.org/repos/asf/knox/blob/2bd26012/gateway-provider-rewrite/src/main/java/org/apache/knox/gateway/filter/rewrite/impl/UrlRewriteResponse.java
----------------------------------------------------------------------
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 8d8f401..6c1ee3d 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
@@ -25,6 +25,7 @@ import org.apache.knox.gateway.filter.rewrite.api.UrlRewriteServletFilter;
 import org.apache.knox.gateway.filter.rewrite.api.UrlRewriteStreamFilterFactory;
 import org.apache.knox.gateway.filter.rewrite.api.UrlRewriter;
 import org.apache.knox.gateway.filter.rewrite.i18n.UrlRewriteMessages;
+import org.apache.knox.gateway.filter.rewrite.spi.UrlRewriteStreamFilter;
 import org.apache.knox.gateway.i18n.messages.MessagesFactory;
 import org.apache.knox.gateway.util.MimeTypes;
 import org.apache.knox.gateway.util.Urls;
@@ -46,6 +47,7 @@ import java.io.OutputStream;
 import java.net.InetAddress;
 import java.net.URISyntaxException;
 import java.net.UnknownHostException;
+import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
@@ -92,8 +94,7 @@ public class UrlRewriteResponse extends GatewayResponseWrapper implements Params
   private String xForwardedPort;
   private String xForwardedScheme;
 
-  public UrlRewriteResponse( FilterConfig config, HttpServletRequest request, HttpServletResponse response )
-      throws IOException {
+  public UrlRewriteResponse( FilterConfig config, HttpServletRequest request, HttpServletResponse response ) {
     super( response );
     this.rewriter = UrlRewriteServletContextListener.getUrlRewriter( config.getServletContext() );
     this.config = config;
@@ -150,25 +151,9 @@ public class UrlRewriteResponse extends GatewayResponseWrapper implements Params
 
   @Override
   public void streamResponse( InputStream input, OutputStream output ) throws IOException {
-    InputStream  inStream;
-    OutputStream outStream;
-
-
-    // Use this way to check whether the input stream is gzip compressed, in case
-    // the content encoding header is unknown, as it could be unset in inbound response
-    boolean isGzip = false;
-    BufferedInputStream inBuffer = new BufferedInputStream(input, STREAM_BUFFER_SIZE);
-    inBuffer.mark(2);
-    byte [] signature = new byte[2];
-    int len = inBuffer.read( signature ); //read the signature
-    if( len == 2 && signature[ 0 ] == (byte) 0x1f && signature[ 1 ] == (byte) 0x8b ) {
-      isGzip = true;
-    }
-    inBuffer.reset();
-
     MimeType mimeType = getMimeType();
     UrlRewriteFilterContentDescriptor filterContentConfig =
-                                                getRewriteFilterConfig(rewriter.getConfig(), bodyFilterName, mimeType);
+        getRewriteFilterConfig(rewriter.getConfig(), bodyFilterName, mimeType);
     if (filterContentConfig != null) {
       String asType = filterContentConfig.asType();
       if ( asType != null && asType.trim().length() > 0 ) {
@@ -176,24 +161,40 @@ public class UrlRewriteResponse extends GatewayResponseWrapper implements Params
       }
     }
 
-    if(isGzip) {
-      inStream = new GZIPInputStream(new GZIPInputStreamHelperInputStream(inBuffer), STREAM_BUFFER_SIZE);
+    UrlRewriteStreamFilter filter = UrlRewriteStreamFilterFactory.create(mimeType, null);
+
+    final InputStream inStream;
+    final OutputStream outStream;
+    if( filter != null ) {
+      // Use this way to check whether the input stream is gzip compressed, in case
+      // the content encoding header is unknown, as it could be unset in inbound response
+      boolean isGzip = false;
+      final BufferedInputStream inBuffer = new BufferedInputStream(input, STREAM_BUFFER_SIZE);
+      inBuffer.mark(2);
+      byte [] signature = new byte[2];
+      int len = inBuffer.read(signature);
+      if( len == 2 && signature[ 0 ] == (byte) 0x1f && signature[ 1 ] == (byte) 0x8b ) {
+        isGzip = true;
+      }
+      inBuffer.reset();
+
+      final InputStream unFilteredStream;
+      if(isGzip) {
+        unFilteredStream = new GZIPInputStream(new GZIPInputStreamHelperInputStream(inBuffer), STREAM_BUFFER_SIZE);
+      } else {
+        unFilteredStream = inBuffer;
+      }
+      String charset = MimeTypes.getCharset( mimeType, StandardCharsets.ISO_8859_1.name() );
+      inStream = filter.filter( unFilteredStream, charset, rewriter, this, UrlRewriter.Direction.OUT, filterContentConfig );
+      outStream = (isGzip) ? new GZIPOutputStream(output, STREAM_BUFFER_SIZE) : output;
     } else {
-      inStream = inBuffer;
+      inStream = input;
+      outStream = output;
     }
 
-    InputStream filteredInput = UrlRewriteStreamFilterFactory.create(mimeType,
-                                                                     null,
-                                                                     inStream,
-                                                                     rewriter,
-                                                                     this,
-                                                                     UrlRewriter.Direction.OUT,
-                                                                     filterContentConfig);
-    outStream = (isGzip) ? new GZIPOutputStream(output, STREAM_BUFFER_SIZE) : output;
     try {
-      IOUtils.copyLarge(filteredInput, outStream, new byte[STREAM_BUFFER_SIZE]);
+      IOUtils.copy(inStream, outStream, STREAM_BUFFER_SIZE);
     } finally {
-      //KNOX-685: outStream.flush();
       outStream.close();
     }
   }

http://git-wip-us.apache.org/repos/asf/knox/blob/2bd26012/gateway-provider-rewrite/src/main/java/org/apache/knox/gateway/filter/rewrite/impl/noop/NoOpUrlRewriteStreamFilter.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite/src/main/java/org/apache/knox/gateway/filter/rewrite/impl/noop/NoOpUrlRewriteStreamFilter.java b/gateway-provider-rewrite/src/main/java/org/apache/knox/gateway/filter/rewrite/impl/noop/NoOpUrlRewriteStreamFilter.java
deleted file mode 100644
index 6141e0d..0000000
--- a/gateway-provider-rewrite/src/main/java/org/apache/knox/gateway/filter/rewrite/impl/noop/NoOpUrlRewriteStreamFilter.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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.knox.gateway.filter.rewrite.impl.noop;
-
-import org.apache.knox.gateway.filter.rewrite.api.UrlRewriteFilterContentDescriptor;
-import org.apache.knox.gateway.filter.rewrite.api.UrlRewriter;
-import org.apache.knox.gateway.filter.rewrite.spi.UrlRewriteStreamFilter;
-import org.apache.knox.gateway.util.urltemplate.Resolver;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-public class NoOpUrlRewriteStreamFilter implements UrlRewriteStreamFilter {
-
-  private static String[] TYPES = new String[]{ null };
-  private static String[] NAMES = new String[]{ null };
-
-  @Override
-  public String[] getTypes() {
-    return TYPES;
-  }
-
-  @Override
-  public String[] getNames() {
-    return NAMES;
-  }
-
-  @Override
-  public InputStream filter(
-      InputStream stream,
-      String encoding,
-      UrlRewriter rewriter,
-      Resolver resolver,
-      UrlRewriter.Direction direction,
-      UrlRewriteFilterContentDescriptor config )
-          throws IOException {
-    return stream;
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/knox/blob/2bd26012/gateway-provider-rewrite/src/main/resources/META-INF/services/org.apache.knox.gateway.filter.rewrite.spi.UrlRewriteStreamFilter
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite/src/main/resources/META-INF/services/org.apache.knox.gateway.filter.rewrite.spi.UrlRewriteStreamFilter b/gateway-provider-rewrite/src/main/resources/META-INF/services/org.apache.knox.gateway.filter.rewrite.spi.UrlRewriteStreamFilter
index 0d347e1..87c3030 100644
--- a/gateway-provider-rewrite/src/main/resources/META-INF/services/org.apache.knox.gateway.filter.rewrite.spi.UrlRewriteStreamFilter
+++ b/gateway-provider-rewrite/src/main/resources/META-INF/services/org.apache.knox.gateway.filter.rewrite.spi.UrlRewriteStreamFilter
@@ -20,5 +20,4 @@ org.apache.knox.gateway.filter.rewrite.impl.json.JsonUrlRewriteStreamFilter
 org.apache.knox.gateway.filter.rewrite.impl.xml.XmlUrlRewriteStreamFilter
 org.apache.knox.gateway.filter.rewrite.impl.html.HtmlUrlRewriteStreamFilter
 org.apache.knox.gateway.filter.rewrite.impl.form.FormUrlRewriteStreamFilter
-org.apache.knox.gateway.filter.rewrite.impl.noop.NoOpUrlRewriteStreamFilter
 org.apache.knox.gateway.filter.rewrite.impl.javascript.JavaScriptUrlRewriteStreamFilter
\ No newline at end of file