You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2017/11/30 10:20:45 UTC

svn commit: r1816703 - in /tomcat/trunk/java/org/apache/coyote/http2: Stream.java StreamProcessor.java

Author: markt
Date: Thu Nov 30 10:20:45 2017
New Revision: 1816703

URL: http://svn.apache.org/viewvc?rev=1816703&view=rev
Log:
First pass at implementing compression for responses

Modified:
    tomcat/trunk/java/org/apache/coyote/http2/Stream.java
    tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java

Modified: tomcat/trunk/java/org/apache/coyote/http2/Stream.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/Stream.java?rev=1816703&r1=1816702&r2=1816703&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/Stream.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/Stream.java Thu Nov 30 10:20:45 2017
@@ -34,6 +34,7 @@ import org.apache.coyote.InputBuffer;
 import org.apache.coyote.Request;
 import org.apache.coyote.Response;
 import org.apache.coyote.http.HttpOutputBuffer;
+import org.apache.coyote.http11.OutputFilter;
 import org.apache.coyote.http2.HpackDecoder.HeaderEmitter;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
@@ -58,7 +59,7 @@ class Stream extends AbstractStream impl
     static {
         Response response =  new Response();
         response.setStatus(100);
-        StreamProcessor.prepareHeaders(response);
+        StreamProcessor.prepareHeaders(null, response, true, null, null);
         ACK_HEADERS = response.getMimeHeaders();
     }
 
@@ -414,6 +415,11 @@ class Stream extends AbstractStream impl
     }
 
 
+    final void addOutputFilter(OutputFilter filter) {
+        http2OutputBuffer.addFilter(filter);
+    }
+
+
     final void writeTrailers() throws IOException {
         Supplier<Map<String,String>> supplier = coyoteResponse.getTrailerFields();
         if (supplier == null) {

Modified: tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java?rev=1816703&r1=1816702&r2=1816703&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java Thu Nov 30 10:20:45 2017
@@ -27,6 +27,7 @@ import org.apache.coyote.ContainerThread
 import org.apache.coyote.ErrorState;
 import org.apache.coyote.Request;
 import org.apache.coyote.Response;
+import org.apache.coyote.http11.filters.GzipOutputFilter;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.util.buf.ByteChunk;
@@ -106,7 +107,7 @@ class StreamProcessor extends AbstractPr
         if (handler.hasAsyncIO() && handler.getProtocol().getUseSendfile()) {
             prepareSendfile();
         }
-        prepareHeaders(response);
+        prepareHeaders(request, response, sendfileData == null, handler.getProtocol(), stream);
         stream.writeHeaders();
     }
 
@@ -127,7 +128,10 @@ class StreamProcessor extends AbstractPr
     }
 
 
-    static void prepareHeaders(Response coyoteResponse) {
+    // Static so it can be used by Stream to build the MimeHeaders required for
+    // an ACK. For that use case coyoteRequest, protocol and stream will be null.
+    static void prepareHeaders(Request coyoteRequest, Response coyoteResponse, boolean noSendfile,
+            Http2Protocol protocol, Stream stream) {
         MimeHeaders headers = coyoteResponse.getMimeHeaders();
         int statusCode = coyoteResponse.getStatus();
 
@@ -151,6 +155,14 @@ class StreamProcessor extends AbstractPr
         if (statusCode >= 200 && headers.getValue("date") == null) {
             headers.addValue("date").setString(FastHttpDateFormat.getCurrentDate());
         }
+
+        // Compression can't be used with sendfile
+        if (noSendfile && protocol != null &&
+                protocol.useCompression(coyoteRequest, coyoteResponse)) {
+            // Enable compression. Headers will have been set. Need to configure
+            // output filter at this point.
+            stream.addOutputFilter(new GzipOutputFilter());
+        }
     }
 
 



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org