hgomez 2002/12/19 03:49:55 Modified: http11/src/java/org/apache/coyote/http11 Http11Processor.java Log: More parameters to the compression code : - Add a list of UserAgent for which no compression should be done - Add a list of MimeTypes for which compression is ok Also compression is disabled when not in HTTP 1.1 Revision Changes Path 1.52 +165 -40 jakarta-tomcat-connectors/http11/src/java/org/apache/coyote/http11/Http11Processor.java Index: Http11Processor.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/http11/src/java/org/apache/coyote/http11/Http11Processor.java,v retrieving revision 1.51 retrieving revision 1.52 diff -u -r1.51 -r1.52 --- Http11Processor.java 19 Dec 2002 09:34:28 -0000 1.51 +++ Http11Processor.java 19 Dec 2002 11:49:55 -0000 1.52 @@ -118,7 +118,7 @@ response.setHook(this); outputBuffer = new InternalOutputBuffer(response); response.setOutputBuffer(outputBuffer); - request.setResponse(response); + request.setResponse(response); initializeFilters(); @@ -263,6 +263,18 @@ /** + * List of user agents to not use gzip with + */ + protected String[] noCompressionUserAgents = null; + + + /** + * List of MIMES which could be gzipped + */ + protected String[] compressableMimeTypes = null; + + + /** * Host name (used to avoid useless B2C conversion on the host name). */ protected char[] hostNameC = new char[0]; @@ -310,6 +322,67 @@ } + /** + * Add user-agent for which gzip compression didn't works + * The user agent String given will be exactly matched + * to the user-agent header submitted by the client. + * + * @param userAgent user-agent string + */ + public void addNoCompressionUserAgent(String userAgent) { + addStringArray(noCompressionUserAgents, userAgent); + } + + + /** + * Set no compression user agent list (this method is best when used with + * a large number of connectors, where it would be better to have all of + * them referenced a single array). + */ + public void setNoCompressionUserAgents(String[] noCompressionUserAgents) { + this.noCompressionUserAgents = noCompressionUserAgents; + } + + + /** + * Return the list of no compression user agents. + */ + public String[] findNoCompressionUserAgents() { + return (noCompressionUserAgents); + } + + + /** + * Add a mime-type which will be compressable + * The mime-type String will be exactly matched + * in the response mime-type header . + * + * @param userAgent user-agent string + */ + public void addCompressableMimeType(String mimeType) { + addStringArray(compressableMimeTypes, mimeType); + } + + + /** + * Set compressable mime-type list (this method is best when used with + * a large number of connectors, where it would be better to have all of + * them referenced a single array). + */ + public void setCompressableMimeType(String[] compressableMimeTypes) { + this.compressableMimeTypes = compressableMimeTypes; + } + + + /** + * Return the list of restricted user agents. + */ + public String[] findCompressableMimeTypes() { + return (compressableMimeTypes); + } + + + // --------------------------------------------------------- Public Methods @@ -336,6 +409,38 @@ /** + * General use method + * + * @param sArray the StringArray + * @param value string + */ + private void addStringArray(String sArray[], String value) { + if (sArray == null) + sArray = new String[0]; + String[] results = new String[sArray.length + 1]; + for (int i = 0; i < sArray.length; i++) + results[i] = sArray[i]; + results[sArray.length] = value; + sArray = results; + } + + /** + * General use method + * + * @param sArray the StringArray + * @param value string + */ + private boolean inStringArray(String sArray[], String value) { + for (int i = 0; i < sArray.length; i++) { + if (sArray[i].equals(value)) { + return true; + } + } + return false; + } + + + /** * Add restricted user-agent (which will downgrade the connector * to HTTP/1.0 mode). The user agent String given will be exactly matched * to the user-agent header submitted by the client. @@ -343,13 +448,7 @@ * @param userAgent user-agent string */ public void addRestrictedUserAgent(String userAgent) { - if (restrictedUserAgents == null) - restrictedUserAgents = new String[0]; - String[] results = new String[restrictedUserAgents.length + 1]; - for (int i = 0; i < restrictedUserAgents.length; i++) - results[i] = restrictedUserAgents[i]; - results[restrictedUserAgents.length] = userAgent; - restrictedUserAgents = results; + addStringArray(restrictedUserAgents, userAgent); } @@ -944,7 +1043,58 @@ } + /* + * Check for compression + * + */ + private boolean isCompressable() + { + // Compression only since HTTP 1.1 + if (! http11) + return false; + + // Check if browser support gzip encoding + MessageBytes acceptEncodingMB = + request.getMimeHeaders().getValue("accept-encoding"); + + if ((acceptEncodingMB == null) + || (acceptEncodingMB.indexOf("gzip") == -1)) + return false; + + // Check if content is not allready gzipped + MessageBytes contentEncodingMB = + response.getMimeHeaders().getValue("Content-Encoding"); + + if ((contentEncodingMB != null) + && (contentEncodingMB.indexOf("gzip") != -1)) + return false; + + // If force mode, allways compress (test purposes only) + if (compressionLevel == 2) + return true; + + // Check for incompatible Browser + if (noCompressionUserAgents != null) { + MessageBytes userAgentValueMB = + request.getMimeHeaders().getValue("user-agent"); + String userAgentValue = userAgentValueMB.toString(); + + if (inStringArray(noCompressionUserAgents, userAgentValue)) + return false; + } + // Check if suffisant len to trig the compression + int contentLength = response.getContentLength(); + if ((contentLength == -1) + || (contentLength > compressionMinSize)) { + // Check for compatible MIME-TYPE + if (compressableMimeTypes != null) + return (inStringArray(compressableMimeTypes, response.getContentType())); + } + + return false; + } + /** * When committing the response, we have to validate the set of headers, as * well as setup the response filters. @@ -984,38 +1134,11 @@ // Check for compression boolean useCompression = false; if (entityBody && (compressionLevel > 0)) { - // Check accept-encoding - // FIXME: write a comma parser; also reuse - // for transfer-encoding parsing - MessageBytes acceptEncodingMB = - request.getMimeHeaders().getValue("accept-encoding"); - if ((acceptEncodingMB != null) - && (acceptEncodingMB.indexOf("gzip") != -1)) { - - // Check in content is not allready gzipped - MessageBytes contentEncodingMB = - response.getMimeHeaders().getValue("Content-Encoding"); - - if ((contentEncodingMB == null) - || (contentEncodingMB.indexOf("gzip") == -1)){ - // Check content-type - if (compressionLevel == 1) { - int contentLength = response.getContentLength(); - // FIXME: Make the value configurable - if ((contentLength == -1) - || (contentLength > compressionMinSize)) { - useCompression = - response.getContentType().startsWith("text/"); - } - } else { - useCompression = true; - } - } - - // Change content-length to -1 to force chunking - if (useCompression) { - response.setContentLength(-1); - } + useCompression = isCompressable(); + + // Change content-length to -1 to force chunking + if (useCompression) { + response.setContentLength(-1); } } @@ -1054,6 +1177,8 @@ outputBuffer.addActiveFilter(outputFilters[Constants.GZIP_FILTER]); // FIXME: Make content-encoding generation dynamic response.setHeader("Content-Encoding", "gzip"); + // Make Proxies happy via Vary (from mod_deflate) + response.setHeader("Vary", "Accept-Encoding"); } // Add date header
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>