com.planetj.servlet.filter.compression
Class CompressingHttpServletResponse

java.lang.Object
  extended by javax.servlet.ServletResponseWrapper
      extended by javax.servlet.http.HttpServletResponseWrapper
          extended by com.planetj.servlet.filter.compression.CompressingHttpServletResponse
All Implemented Interfaces:
javax.servlet.http.HttpServletResponse, javax.servlet.ServletResponse

final class CompressingHttpServletResponse
extends javax.servlet.http.HttpServletResponseWrapper

Implementation of HttpServletResponse which will optionally compress data written to the response.

Author:
Sean Owen

Field Summary
(package private) static java.lang.String ACCEPT_ENCODING_HEADER
           
private static java.lang.String COMPRESSED_BY_VALUE
           
private  java.lang.String compressedContentEncoding
           
private  boolean compressing
           
private  CompressingServletOutputStream compressingSOS
           
private  CompressingStreamFactory compressingStreamFactory
           
(package private) static java.lang.String CONTENT_ENCODING_HEADER
           
private static java.lang.String CONTENT_LENGTH_HEADER
           
private static java.lang.String CONTENT_TYPE_HEADER
           
private  boolean contentTypeOK
           
private  CompressingFilterContext context
           
private  javax.servlet.http.HttpServletResponse httpResponse
           
private  boolean isGetOutputStreamCalled
           
private  boolean isGetWriterCalled
           
private  CompressingFilterLoggerImpl logger
           
private  java.io.PrintWriter printWriter
           
private  java.lang.String savedContentEncoding
           
private  int savedContentLength
           
private  boolean savedContentLengthSet
           
private static java.lang.String VARY_HEADER
           
private static java.lang.String X_COMPRESSED_BY_HEADER
           
 
Fields inherited from interface javax.servlet.http.HttpServletResponse
SC_ACCEPTED, SC_BAD_GATEWAY, SC_BAD_REQUEST, SC_CONFLICT, SC_CONTINUE, SC_CREATED, SC_EXPECTATION_FAILED, SC_FORBIDDEN, SC_FOUND, SC_GATEWAY_TIMEOUT, SC_GONE, SC_HTTP_VERSION_NOT_SUPPORTED, SC_INTERNAL_SERVER_ERROR, SC_LENGTH_REQUIRED, SC_METHOD_NOT_ALLOWED, SC_MOVED_PERMANENTLY, SC_MOVED_TEMPORARILY, SC_MULTIPLE_CHOICES, SC_NO_CONTENT, SC_NON_AUTHORITATIVE_INFORMATION, SC_NOT_ACCEPTABLE, SC_NOT_FOUND, SC_NOT_IMPLEMENTED, SC_NOT_MODIFIED, SC_OK, SC_PARTIAL_CONTENT, SC_PAYMENT_REQUIRED, SC_PRECONDITION_FAILED, SC_PROXY_AUTHENTICATION_REQUIRED, SC_REQUEST_ENTITY_TOO_LARGE, SC_REQUEST_TIMEOUT, SC_REQUEST_URI_TOO_LONG, SC_REQUESTED_RANGE_NOT_SATISFIABLE, SC_RESET_CONTENT, SC_SEE_OTHER, SC_SERVICE_UNAVAILABLE, SC_SWITCHING_PROTOCOLS, SC_TEMPORARY_REDIRECT, SC_UNAUTHORIZED, SC_UNSUPPORTED_MEDIA_TYPE, SC_USE_PROXY
 
Constructor Summary
CompressingHttpServletResponse(javax.servlet.http.HttpServletResponse httpResponse, CompressingStreamFactory compressingStreamFactory, java.lang.String contentEncoding, CompressingFilterContext context)
           
 
Method Summary
 void addDateHeader(java.lang.String name, long value)
           
 void addHeader(java.lang.String name, java.lang.String value)
           
 void addIntHeader(java.lang.String name, int value)
           
(package private)  void close()
           
 void flushBuffer()
           
private  void flushWriter()
           
private  CompressingServletOutputStream getCompressingServletOutputStream()
           
 javax.servlet.ServletOutputStream getOutputStream()
           
 java.io.PrintWriter getWriter()
           
private  boolean isAllowedHeader(java.lang.String header)
          Returns true if and only if the named HTTP header may be set directly by the application, as some headers must be handled specially.
private  boolean isCompressableContentType(java.lang.String contentType)
          Checks to see if the given content type should be compressed.
(package private)  boolean isCompressing()
           
private  boolean mustCompress()
           
private  boolean mustNotCompress()
           
(package private)  void rawStreamCommitted()
           
 void reset()
           
 void resetBuffer()
           
 void setContentLength(int contentLength)
           
 void setContentType(java.lang.String contentType)
           
 void setDateHeader(java.lang.String name, long value)
           
 void setHeader(java.lang.String name, java.lang.String value)
           
 void setIntHeader(java.lang.String name, int value)
           
private  void setResponseHeaders()
           
(package private)  void switchToCompression()
           
 java.lang.String toString()
           
 
Methods inherited from class javax.servlet.http.HttpServletResponseWrapper
addCookie, containsHeader, encodeRedirectUrl, encodeRedirectURL, encodeUrl, encodeURL, sendError, sendError, sendRedirect, setStatus, setStatus
 
Methods inherited from class javax.servlet.ServletResponseWrapper
getBufferSize, getCharacterEncoding, getContentType, getLocale, getResponse, isCommitted, setBufferSize, setCharacterEncoding, setLocale, setResponse
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 
Methods inherited from interface javax.servlet.ServletResponse
getBufferSize, getCharacterEncoding, getContentType, getLocale, isCommitted, setBufferSize, setCharacterEncoding, setLocale
 

Field Detail

ACCEPT_ENCODING_HEADER

static final java.lang.String ACCEPT_ENCODING_HEADER
See Also:
Constant Field Values

CONTENT_ENCODING_HEADER

static final java.lang.String CONTENT_ENCODING_HEADER
See Also:
Constant Field Values

CONTENT_LENGTH_HEADER

private static final java.lang.String CONTENT_LENGTH_HEADER
See Also:
Constant Field Values

CONTENT_TYPE_HEADER

private static final java.lang.String CONTENT_TYPE_HEADER
See Also:
Constant Field Values

VARY_HEADER

private static final java.lang.String VARY_HEADER
See Also:
Constant Field Values

X_COMPRESSED_BY_HEADER

private static final java.lang.String X_COMPRESSED_BY_HEADER
See Also:
Constant Field Values

COMPRESSED_BY_VALUE

private static final java.lang.String COMPRESSED_BY_VALUE

httpResponse

private final javax.servlet.http.HttpServletResponse httpResponse

context

private final CompressingFilterContext context

logger

private final CompressingFilterLoggerImpl logger

compressedContentEncoding

private final java.lang.String compressedContentEncoding

compressingStreamFactory

private final CompressingStreamFactory compressingStreamFactory

compressingSOS

private CompressingServletOutputStream compressingSOS

printWriter

private java.io.PrintWriter printWriter

isGetOutputStreamCalled

private boolean isGetOutputStreamCalled

isGetWriterCalled

private boolean isGetWriterCalled

compressing

private boolean compressing

savedContentLength

private int savedContentLength

savedContentLengthSet

private boolean savedContentLengthSet

savedContentEncoding

private java.lang.String savedContentEncoding

contentTypeOK

private boolean contentTypeOK
Constructor Detail

CompressingHttpServletResponse

CompressingHttpServletResponse(javax.servlet.http.HttpServletResponse httpResponse,
                               CompressingStreamFactory compressingStreamFactory,
                               java.lang.String contentEncoding,
                               CompressingFilterContext context)
Method Detail

getOutputStream

@NotNull
public javax.servlet.ServletOutputStream getOutputStream()
                                                  throws java.io.IOException
Specified by:
getOutputStream in interface javax.servlet.ServletResponse
Overrides:
getOutputStream in class javax.servlet.ServletResponseWrapper
Throws:
java.io.IOException

getWriter

@NotNull
public java.io.PrintWriter getWriter()
                              throws java.io.IOException
Specified by:
getWriter in interface javax.servlet.ServletResponse
Overrides:
getWriter in class javax.servlet.ServletResponseWrapper
Throws:
java.io.IOException

addHeader

public void addHeader(java.lang.String name,
                      java.lang.String value)
Specified by:
addHeader in interface javax.servlet.http.HttpServletResponse
Overrides:
addHeader in class javax.servlet.http.HttpServletResponseWrapper

addIntHeader

public void addIntHeader(java.lang.String name,
                         int value)
Specified by:
addIntHeader in interface javax.servlet.http.HttpServletResponse
Overrides:
addIntHeader in class javax.servlet.http.HttpServletResponseWrapper

addDateHeader

public void addDateHeader(java.lang.String name,
                          long value)
Specified by:
addDateHeader in interface javax.servlet.http.HttpServletResponse
Overrides:
addDateHeader in class javax.servlet.http.HttpServletResponseWrapper

setHeader

public void setHeader(java.lang.String name,
                      java.lang.String value)
Specified by:
setHeader in interface javax.servlet.http.HttpServletResponse
Overrides:
setHeader in class javax.servlet.http.HttpServletResponseWrapper

setIntHeader

public void setIntHeader(java.lang.String name,
                         int value)
Specified by:
setIntHeader in interface javax.servlet.http.HttpServletResponse
Overrides:
setIntHeader in class javax.servlet.http.HttpServletResponseWrapper

setDateHeader

public void setDateHeader(java.lang.String name,
                          long value)
Specified by:
setDateHeader in interface javax.servlet.http.HttpServletResponse
Overrides:
setDateHeader in class javax.servlet.http.HttpServletResponseWrapper

flushBuffer

public void flushBuffer()
                 throws java.io.IOException
Specified by:
flushBuffer in interface javax.servlet.ServletResponse
Overrides:
flushBuffer in class javax.servlet.ServletResponseWrapper
Throws:
java.io.IOException

reset

public void reset()
Specified by:
reset in interface javax.servlet.ServletResponse
Overrides:
reset in class javax.servlet.ServletResponseWrapper

resetBuffer

public void resetBuffer()
Specified by:
resetBuffer in interface javax.servlet.ServletResponse
Overrides:
resetBuffer in class javax.servlet.ServletResponseWrapper

setContentLength

public void setContentLength(int contentLength)
Specified by:
setContentLength in interface javax.servlet.ServletResponse
Overrides:
setContentLength in class javax.servlet.ServletResponseWrapper

setContentType

public void setContentType(java.lang.String contentType)
Specified by:
setContentType in interface javax.servlet.ServletResponse
Overrides:
setContentType in class javax.servlet.ServletResponseWrapper

toString

@NotNull
public java.lang.String toString()
Overrides:
toString in class java.lang.Object

isCompressing

boolean isCompressing()

close

void close()
     throws java.io.IOException
Throws:
java.io.IOException

setResponseHeaders

private void setResponseHeaders()

rawStreamCommitted

void rawStreamCommitted()

switchToCompression

void switchToCompression()

isAllowedHeader

private boolean isAllowedHeader(java.lang.String header)

Returns true if and only if the named HTTP header may be set directly by the application, as some headers must be handled specially. null is allowed, though it setting a header named null will probably generate an exception from the underlying HttpServletResponse. CONTENT_LENGTH_HEADER, CONTENT_ENCODING_HEADER and X_COMPRESSED_BY_HEADER are not allowed.

Parameters:
header - name of HTTP header
Returns:
true if and only if header can be set directly by application

flushWriter

private void flushWriter()

isCompressableContentType

private boolean isCompressableContentType(java.lang.String contentType)
Checks to see if the given content type should be compressed. This checks against the includeContentTypes and excludeContentTypes filter init parameters; if the former is set and the given content type is in that parameter's list, or if the latter is set and the content type is not in that list, then this method returns true.

Parameters:
contentType - content type of response
Returns:
true if and only if the given content type should be compressed

getCompressingServletOutputStream

@NotNull
private CompressingServletOutputStream getCompressingServletOutputStream()
                                                                  throws java.io.IOException
Throws:
java.io.IOException

mustNotCompress

private boolean mustNotCompress()

mustCompress

private boolean mustCompress()