org.apache.coyote.http11.filters.GzipOutputFilter Java Examples

The following examples show how to use org.apache.coyote.http11.filters.GzipOutputFilter. You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: AbstractHttp11Processor.java    From Tomcat7.0.67 with Apache License 2.0 6 votes vote down vote up
/**
 * Initialize standard input and output filters.
 */
protected void initializeFilters(int maxTrailerSize, Set<String> allowedTrailerHeaders,
        int maxExtensionSize, int maxSwallowSize) {
    // Create and add the identity filters.
    getInputBuffer().addFilter(new IdentityInputFilter(maxSwallowSize));
    getOutputBuffer().addFilter(new IdentityOutputFilter());

    // Create and add the chunked filters.
    getInputBuffer().addFilter( new ChunkedInputFilter(maxTrailerSize,allowedTrailerHeaders,
            maxExtensionSize, maxSwallowSize));
    getOutputBuffer().addFilter(new ChunkedOutputFilter());

    // Create and add the void filters
    getInputBuffer().addFilter(new VoidInputFilter());
    getOutputBuffer().addFilter(new VoidOutputFilter());

    // Create and add buffered input filter
    getInputBuffer().addFilter(new BufferedInputFilter());

    // Create and add the chunked filters.
    //getInputBuffer().addFilter(new GzipInputFilter());
    getOutputBuffer().addFilter(new GzipOutputFilter());

    pluggableFilterIndex = getInputBuffer().getFilters().length;
}
 
Example #2
Source File: AbstractOutputBuffer.java    From Tomcat7.0.67 with Apache License 2.0 6 votes vote down vote up
/**
 * Flush the response.
 * 
 * @throws IOException an underlying I/O error occurred
 */
public void flush()
    throws IOException {

    if (!committed) {

        // Send the connector a request for commit. The connector should
        // then validate the headers, send them (using sendHeader) and 
        // set the filters accordingly.
        response.action(ActionCode.COMMIT, null);

    }
    
    // go through the filters and if there is gzip filter
    // invoke it to flush
    for (int i = 0; i <= lastActiveFilter; i++) {
        if (activeFilters[i] instanceof GzipOutputFilter) {
            if (log.isDebugEnabled()) {
                log.debug("Flushing the gzip filter at position " + i +
                        " of the filter chain...");
            }
            ((GzipOutputFilter) activeFilters[i]).flush();
            break;
        }
    }
}
 
Example #3
Source File: AbstractOutputBuffer.java    From tomcatsrc with Apache License 2.0 6 votes vote down vote up
/**
 * Flush the response.
 * 
 * @throws IOException an underlying I/O error occurred
 */
public void flush()
    throws IOException {

    if (!committed) {

        // Send the connector a request for commit. The connector should
        // then validate the headers, send them (using sendHeader) and 
        // set the filters accordingly.
        response.action(ActionCode.COMMIT, null);

    }
    
    // go through the filters and if there is gzip filter
    // invoke it to flush
    for (int i = 0; i <= lastActiveFilter; i++) {
        if (activeFilters[i] instanceof GzipOutputFilter) {
            if (log.isDebugEnabled()) {
                log.debug("Flushing the gzip filter at position " + i +
                        " of the filter chain...");
            }
            ((GzipOutputFilter) activeFilters[i]).flush();
            break;
        }
    }
}
 
Example #4
Source File: StreamProcessor.java    From Tomcat8-Source-Read with MIT License 4 votes vote down vote up
static void prepareHeaders(Request coyoteRequest, Response coyoteResponse,
        Http2Protocol protocol, Stream stream) {
    MimeHeaders headers = coyoteResponse.getMimeHeaders();
    int statusCode = coyoteResponse.getStatus();

    // Add the pseudo header for status
    headers.addValue(":status").setString(Integer.toString(statusCode));

    // Check to see if a response body is present
    if (!(statusCode < 200 || statusCode == 204 || statusCode == 205 || statusCode == 304)) {
        String contentType = coyoteResponse.getContentType();
        if (contentType != null) {
            headers.setValue("content-type").setString(contentType);
        }
        String contentLanguage = coyoteResponse.getContentLanguage();
        if (contentLanguage != null) {
            headers.setValue("content-language").setString(contentLanguage);
        }
        // Add a content-length header if a content length has been set unless
        // the application has already added one
        long contentLength = coyoteResponse.getContentLengthLong();
        if (contentLength != -1 && headers.getValue("content-length") == null) {
            headers.addValue("content-length").setLong(contentLength);
        }
    } else {
        if (statusCode == 205) {
            // RFC 7231 requires the server to explicitly signal an empty
            // response in this case
            coyoteResponse.setContentLength(0);
        } else {
            coyoteResponse.setContentLength(-1);
        }
    }

    // Add date header unless it is an informational response or the
    // application has already set one
    if (statusCode >= 200 && headers.getValue("date") == null) {
        headers.addValue("date").setString(FastHttpDateFormat.getCurrentDate());
    }

    if (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());
    }
}
 
Example #5
Source File: Http11Processor.java    From Tomcat8-Source-Read with MIT License 4 votes vote down vote up
/**
 * Http11 NIO处理器.
 * 拿到连接.传递连接.处理连接.处理的关键地方.
 * 1.inputBuffer and  outputBuffer绑定在了NioSocketWrapper.
 * 2. Http11Processor持有NioSocketWrapper对象.
 * 3. NioSocketWrapper去读写数据填充到对应的两个Buffer内.
 * @param protocol
 * @param endpoint
 */
@SuppressWarnings("deprecation")
public Http11Processor(AbstractHttp11Protocol<?> protocol, AbstractEndpoint<?> endpoint) {
    super(endpoint);
    this.protocol = protocol;

    httpParser = new HttpParser(protocol.getRelaxedPathChars(),
            protocol.getRelaxedQueryChars());
    /**
     * Http11 InputBuffer  绑定到 {@link org.apache.coyote.Request}
     */
    inputBuffer = new Http11InputBuffer(request, protocol.getMaxHttpHeaderSize(),
            protocol.getRejectIllegalHeaderName(), httpParser);
    request.setInputBuffer(inputBuffer);
    /**
     * Http11 OutputBuffer  绑定到{@link org.apache.coyote.Response}
     */
    outputBuffer = new Http11OutputBuffer(response, protocol.getMaxHttpHeaderSize(),
            protocol.getSendReasonPhrase());
    response.setOutputBuffer(outputBuffer);

    // Create and add the identity filters.
    inputBuffer.addFilter(new IdentityInputFilter(protocol.getMaxSwallowSize()));
    outputBuffer.addFilter(new IdentityOutputFilter());

    // Create and add the chunked filters.
    inputBuffer.addFilter(new ChunkedInputFilter(protocol.getMaxTrailerSize(),
            protocol.getAllowedTrailerHeadersInternal(), protocol.getMaxExtensionSize(),
            protocol.getMaxSwallowSize()));
    outputBuffer.addFilter(new ChunkedOutputFilter());

    // Create and add the void filters.
    inputBuffer.addFilter(new VoidInputFilter());
    outputBuffer.addFilter(new VoidOutputFilter());

    // Create and add buffered input filter
    inputBuffer.addFilter(new BufferedInputFilter());

    // Create and add the gzip filters.
    //inputBuffer.addFilter(new GzipInputFilter());
    outputBuffer.addFilter(new GzipOutputFilter());

    pluggableFilterIndex = inputBuffer.getFilters().length;
}
 
Example #6
Source File: TestGzipOutputFilter.java    From Tomcat7.0.67 with Apache License 2.0 4 votes vote down vote up
/**
 * Test the interaction betwen gzip and flushing. The idea is to: 1. create
 * a internal output buffer, response, and attach an active gzipoutputfilter
 * to the output buffer 2. set the output stream of the internal buffer to
 * be a ByteArrayOutputStream so we can inspect the output bytes 3. write a
 * chunk out using the gzipoutputfilter and invoke a flush on the
 * InternalOutputBuffer 4. read from the ByteArrayOutputStream to find out
 * what's being written out (flushed) 5. find out what's expected by wrting
 * to GZIPOutputStream and close it (to force flushing) 6. Compare the size
 * of the two arrays, they should be close (instead of one being much
 * shorter than the other one)
 *
 * @throws Exception
 */
@Test
public void testFlushingWithGzip() throws Exception {
    // set up response, InternalOutputBuffer, and ByteArrayOutputStream
    Response res = new Response();
    InternalOutputBuffer iob = new InternalOutputBuffer(res, 8 * 1024);
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    iob.outputStream = bos;
    res.setOutputBuffer(iob);

    // set up GzipOutputFilter to attach to the InternalOutputBuffer
    GzipOutputFilter gf = new GzipOutputFilter();
    iob.addFilter(gf);
    iob.addActiveFilter(gf);

    // write a chunk out
    ByteChunk chunk = new ByteChunk(1024);
    byte[] d = "Hello there tomcat developers, there is a bug in JDK".getBytes();
    chunk.append(d, 0, d.length);
    iob.doWrite(chunk, res);

    // flush the InternalOutputBuffer
    iob.flush();

    // read from the ByteArrayOutputStream to find out what's being written
    // out (flushed)
    byte[] dataFound = bos.toByteArray();

    // find out what's expected by wrting to GZIPOutputStream and close it
    // (to force flushing)
    ByteArrayOutputStream gbos = new ByteArrayOutputStream(1024);
    GZIPOutputStream gos = new GZIPOutputStream(gbos);
    gos.write(d);
    gos.close();

    // read the expected data
    byte[] dataExpected = gbos.toByteArray();

    // most of the data should have been flushed out
    assertTrue(dataFound.length >= (dataExpected.length - 20));
}
 
Example #7
Source File: TestGzipOutputFilter.java    From tomcatsrc with Apache License 2.0 4 votes vote down vote up
/**
 * Test the interaction betwen gzip and flushing. The idea is to: 1. create
 * a internal output buffer, response, and attach an active gzipoutputfilter
 * to the output buffer 2. set the output stream of the internal buffer to
 * be a ByteArrayOutputStream so we can inspect the output bytes 3. write a
 * chunk out using the gzipoutputfilter and invoke a flush on the
 * InternalOutputBuffer 4. read from the ByteArrayOutputStream to find out
 * what's being written out (flushed) 5. find out what's expected by wrting
 * to GZIPOutputStream and close it (to force flushing) 6. Compare the size
 * of the two arrays, they should be close (instead of one being much
 * shorter than the other one)
 *
 * @throws Exception
 */
@Test
public void testFlushingWithGzip() throws Exception {
    // set up response, InternalOutputBuffer, and ByteArrayOutputStream
    Response res = new Response();
    InternalOutputBuffer iob = new InternalOutputBuffer(res, 8 * 1024);
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    iob.outputStream = bos;
    res.setOutputBuffer(iob);

    // set up GzipOutputFilter to attach to the InternalOutputBuffer
    GzipOutputFilter gf = new GzipOutputFilter();
    iob.addFilter(gf);
    iob.addActiveFilter(gf);

    // write a chunk out
    ByteChunk chunk = new ByteChunk(1024);
    byte[] d = "Hello there tomcat developers, there is a bug in JDK".getBytes();
    chunk.append(d, 0, d.length);
    iob.doWrite(chunk, res);

    // flush the InternalOutputBuffer
    iob.flush();

    // read from the ByteArrayOutputStream to find out what's being written
    // out (flushed)
    byte[] dataFound = bos.toByteArray();

    // find out what's expected by wrting to GZIPOutputStream and close it
    // (to force flushing)
    ByteArrayOutputStream gbos = new ByteArrayOutputStream(1024);
    GZIPOutputStream gos = new GZIPOutputStream(gbos);
    gos.write(d);
    gos.close();

    // read the expected data
    byte[] dataExpected = gbos.toByteArray();

    // most of the data should have been flushed out
    assertTrue(dataFound.length >= (dataExpected.length - 20));
}