Author: markt
Date: Wed Nov 3 18:54:56 2010
New Revision: 1030610
URL: http://svn.apache.org/viewvc?rev=1030610&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=49625
Ensure Vary header is set if response may be compressed rather than only
setting it if it is compressed.
Modified:
tomcat/tc6.0.x/trunk/STATUS.txt
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11Processor.java
Modified: tomcat/tc6.0.x/trunk/STATUS.txt
URL:
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/STATUS.txt?rev=1030610&r1=1030609&r2=1030610&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/STATUS.txt (original)
+++ tomcat/tc6.0.x/trunk/STATUS.txt Wed Nov 3 18:54:56 2010
@@ -102,14 +102,6 @@ PATCHES PROPOSED TO BACKPORT:
but from debugging it looks that it is called by Tomcat code only
(JspServlet).
-* Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=49625
- Ensure Vary header is set if response may be compressed rather than only
- setting it if it is compressed.
- http://svn.apache.org/viewvc?rev=1002133&view=rev
- (patch needs to be applied separately to BIO, NIO and APR HTTP connectors)
- +1: markt, mturk, kkolinko
- -1:
-
* Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=49730
Correct race condition in StandardThreadExecutor that can lead to long delays
in processing requests. Patch provided by Sylvain Laurent.
Modified:
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java
URL:
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java?rev=1030610&r1=1030609&r2=1030610&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java
Wed Nov 3 18:54:56 2010
@@ -1520,16 +1520,42 @@ public class Http11AprProcessor implemen
/**
- * Check for compression
+ * Check if the resource could be compressed, if the client supports it.
*/
private boolean isCompressable() {
- // Nope Compression could works in HTTP 1.0 also
- // cf: mod_deflate
+ // Check if content is not already gzipped
+ MessageBytes contentEncodingMB =
+ response.getMimeHeaders().getValue("Content-Encoding");
+
+ if ((contentEncodingMB != null)
+ && (contentEncodingMB.indexOf("gzip") != -1))
+ return false;
+
+ // If force mode, always compress (test purposes only)
+ if (compressionLevel == 2)
+ return true;
+
+ // Check if sufficient length to trigger the compression
+ long contentLength = response.getContentLengthLong();
+ if ((contentLength == -1)
+ || (contentLength > compressionMinSize)) {
+ // Check for compatible MIME-TYPE
+ if (compressableMimeTypes != null) {
+ return (startsWithStringArray(compressableMimeTypes,
+ response.getContentType()));
+ }
+ }
+
+ return false;
+ }
- // Compression only since HTTP 1.1
- // if (! http11)
- // return false;
+
+ /**
+ * Check if compression should be used for this resource. Already checked
+ * that the resource could be compressed if the client supports it.
+ */
+ private boolean useCompression() {
// Check if browser support gzip encoding
MessageBytes acceptEncodingMB =
@@ -1539,15 +1565,7 @@ public class Http11AprProcessor implemen
|| (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 force mode, always compress (test purposes only)
if (compressionLevel == 2)
return true;
@@ -1565,21 +1583,10 @@ public class Http11AprProcessor implemen
}
}
- // Check if suffisant len to trig the compression
- long contentLength = response.getContentLengthLong();
- if ((contentLength == -1)
- || (contentLength > compressionMinSize)) {
- // Check for compatible MIME-TYPE
- if (compressableMimeTypes != null) {
- return (startsWithStringArray(compressableMimeTypes,
- response.getContentType()));
- }
- }
-
- return false;
+ return true;
}
-
+
/**
* When committing the response, we have to validate the set of headers, as
* well as setup the response filters.
@@ -1634,9 +1641,13 @@ public class Http11AprProcessor implemen
}
// Check for compression
+ boolean isCompressable = false;
boolean useCompression = false;
if (entityBody && (compressionLevel > 0) && (sendfileData == null)) {
- useCompression = isCompressable();
+ isCompressable = isCompressable();
+ if (isCompressable) {
+ useCompression = useCompression();
+ }
// Change content-length to -1 to force chunking
if (useCompression) {
response.setContentLength(-1);
@@ -1679,6 +1690,9 @@ public class Http11AprProcessor implemen
if (useCompression) {
outputBuffer.addActiveFilter(outputFilters[Constants.GZIP_FILTER]);
headers.setValue("Content-Encoding").setString("gzip");
+ }
+ // If it might be compressed, set the Vary header
+ if (isCompressable) {
// Make Proxies happy via Vary (from mod_deflate)
MessageBytes vary = headers.getValue("Vary");
if (vary == null) {
Modified:
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java
URL:
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java?rev=1030610&r1=1030609&r2=1030610&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java
Wed Nov 3 18:54:56 2010
@@ -1549,16 +1549,42 @@ public class Http11NioProcessor implemen
/**
- * Check for compression
+ * Check if the resource could be compressed, if the client supports it.
*/
private boolean isCompressable() {
- // Nope Compression could works in HTTP 1.0 also
- // cf: mod_deflate
+ // Check if content is not already gzipped
+ MessageBytes contentEncodingMB =
+ response.getMimeHeaders().getValue("Content-Encoding");
+
+ if ((contentEncodingMB != null)
+ && (contentEncodingMB.indexOf("gzip") != -1))
+ return false;
+
+ // If force mode, always compress (test purposes only)
+ if (compressionLevel == 2)
+ return true;
+
+ // Check if sufficient length to trigger the compression
+ long contentLength = response.getContentLengthLong();
+ if ((contentLength == -1)
+ || (contentLength > compressionMinSize)) {
+ // Check for compatible MIME-TYPE
+ if (compressableMimeTypes != null) {
+ return (startsWithStringArray(compressableMimeTypes,
+ response.getContentType()));
+ }
+ }
+
+ return false;
+ }
- // Compression only since HTTP 1.1
- // if (! http11)
- // return false;
+
+ /**
+ * Check if compression should be used for this resource. Already checked
+ * that the resource could be compressed if the client supports it.
+ */
+ private boolean useCompression() {
// Check if browser support gzip encoding
MessageBytes acceptEncodingMB =
@@ -1568,15 +1594,7 @@ public class Http11NioProcessor implemen
|| (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 force mode, always compress (test purposes only)
if (compressionLevel == 2)
return true;
@@ -1594,21 +1612,10 @@ public class Http11NioProcessor implemen
}
}
- // Check if suffisant len to trig the compression
- long contentLength = response.getContentLengthLong();
- if ((contentLength == -1)
- || (contentLength > compressionMinSize)) {
- // Check for compatible MIME-TYPE
- if (compressableMimeTypes != null) {
- return (startsWithStringArray(compressableMimeTypes,
- response.getContentType()));
- }
- }
-
- return false;
+ return true;
}
-
+
/**
* When committing the response, we have to validate the set of headers, as
* well as setup the response filters.
@@ -1662,9 +1669,13 @@ public class Http11NioProcessor implemen
// Check for compression
+ boolean isCompressable = false;
boolean useCompression = false;
if (entityBody && (compressionLevel > 0) && (sendfileData == null)) {
- useCompression = isCompressable();
+ isCompressable = isCompressable();
+ if (isCompressable) {
+ useCompression = useCompression();
+ }
// Change content-length to -1 to force chunking
if (useCompression) {
response.setContentLength(-1);
@@ -1707,6 +1718,9 @@ public class Http11NioProcessor implemen
if (useCompression) {
outputBuffer.addActiveFilter(outputFilters[Constants.GZIP_FILTER]);
headers.setValue("Content-Encoding").setString("gzip");
+ }
+ // If it might be compressed, set the Vary header
+ if (isCompressable) {
// Make Proxies happy via Vary (from mod_deflate)
MessageBytes vary = headers.getValue("Vary");
if (vary == null) {
Modified:
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11Processor.java
URL:
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11Processor.java?rev=1030610&r1=1030609&r2=1030610&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11Processor.java
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11Processor.java Wed
Nov 3 18:54:56 2010
@@ -1431,16 +1431,42 @@ public class Http11Processor implements
/**
- * Check for compression
+ * Check if the resource could be compressed, if the client supports it.
*/
private boolean isCompressable() {
- // Nope Compression could works in HTTP 1.0 also
- // cf: mod_deflate
+ // Check if content is not already gzipped
+ MessageBytes contentEncodingMB =
+ response.getMimeHeaders().getValue("Content-Encoding");
+
+ if ((contentEncodingMB != null)
+ && (contentEncodingMB.indexOf("gzip") != -1))
+ return false;
+
+ // If force mode, always compress (test purposes only)
+ if (compressionLevel == 2)
+ return true;
+
+ // Check if sufficient length to trigger the compression
+ long contentLength = response.getContentLengthLong();
+ if ((contentLength == -1)
+ || (contentLength > compressionMinSize)) {
+ // Check for compatible MIME-TYPE
+ if (compressableMimeTypes != null) {
+ return (startsWithStringArray(compressableMimeTypes,
+ response.getContentType()));
+ }
+ }
+
+ return false;
+ }
+
- // Compression only since HTTP 1.1
- // if (! http11)
- // return false;
+ /**
+ * Check if compression should be used for this resource. Already checked
+ * that the resource could be compressed if the client supports it.
+ */
+ private boolean useCompression() {
// Check if browser support gzip encoding
MessageBytes acceptEncodingMB =
@@ -1450,15 +1476,7 @@ public class Http11Processor implements
|| (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 force mode, always compress (test purposes only)
if (compressionLevel == 2)
return true;
@@ -1476,21 +1494,10 @@ public class Http11Processor implements
}
}
- // Check if suffisant len to trig the compression
- long contentLength = response.getContentLengthLong();
- if ((contentLength == -1)
- || (contentLength > compressionMinSize)) {
- // Check for compatible MIME-TYPE
- if (compressableMimeTypes != null) {
- return (startsWithStringArray(compressableMimeTypes,
- response.getContentType()));
- }
- }
-
- return false;
+ return true;
}
-
+
/**
* When committing the response, we have to validate the set of headers, as
* well as setup the response filters.
@@ -1528,10 +1535,13 @@ public class Http11Processor implements
}
// Check for compression
+ boolean isCompressable = false;
boolean useCompression = false;
if (entityBody && (compressionLevel > 0)) {
- useCompression = isCompressable();
-
+ isCompressable = isCompressable();
+ if (isCompressable) {
+ useCompression = useCompression();
+ }
// Change content-length to -1 to force chunking
if (useCompression) {
response.setContentLength(-1);
@@ -1574,6 +1584,9 @@ public class Http11Processor implements
if (useCompression) {
outputBuffer.addActiveFilter(outputFilters[Constants.GZIP_FILTER]);
headers.setValue("Content-Encoding").setString("gzip");
+ }
+ // If it might be compressed, set the Vary header
+ if (isCompressable) {
// Make Proxies happy via Vary (from mod_deflate)
MessageBytes vary = headers.getValue("Vary");
if (vary == null) {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]