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-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org