]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
Merge r958253 from trunk:
authorJim Jagielski <jim@apache.org>
Mon, 29 Aug 2011 15:22:22 +0000 (15:22 +0000)
committerJim Jagielski <jim@apache.org>
Mon, 29 Aug 2011 15:22:22 +0000 (15:22 +0000)
Stop compressing if we are doing a HEAD request and the content-length filter
can't determine the content-length anyway.

Submitted by: Ruediger Pluem

Submitted by: sf
Reviewed/backported by: jim

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x@1162858 13f79535-47bb-0310-9956-ffa450edef68

STATUS
modules/filters/mod_deflate.c

diff --git a/STATUS b/STATUS
index ae0564b7ebf3c84d76229250d388722ea243faf5..4ed2788d8beb87106ffbe01e8217364ce77cbc00 100644 (file)
--- a/STATUS
+++ b/STATUS
@@ -92,12 +92,6 @@ RELEASE SHOWSTOPPERS:
 PATCHES ACCEPTED TO BACKPORT FROM TRUNK:
   [ start all new proposals below, under PATCHES PROPOSED. ]
 
-  * mod_deflate: Stop compressing HEAD requests if there is not Content-Length
-    header
-    Trunk patch: http://svn.apache.org/viewvc?rev=958253&view=rev
-    2.2.x patch: trunk patch works with offset
-    +1: sf, covener, jim
-
   * mod_reqtimeout: Disable keep-alive after read timeout
     Trunk patch: http://svn.apache.org/viewvc?rev=1103213&view=rev
     2.2.x patch: trunk patch works except for CHANGES
index 07ca194f97d234af5c3f6fed3252bd374ef35692..7856e35fa8776c4b10ce4f9eac668c1cc2f0a078 100644 (file)
@@ -582,6 +582,19 @@ static apr_status_t deflate_out_filter(ap_filter_t *f,
         apr_bucket *b;
         apr_size_t len;
 
+        /*
+         * Optimization: If we are a HEAD request and bytes_sent is not zero
+         * it means that we have passed the content-length filter once and
+         * have more data to sent. This means that the content-length filter
+         * could not determine our content-length for the response to the
+         * HEAD request anyway (the associated GET request would deliver the
+         * body in chunked encoding) and we can stop compressing.
+         */
+        if (r->header_only && r->bytes_sent) {
+            ap_remove_output_filter(f);
+            return ap_pass_brigade(f->next, bb);
+        }
+
         e = APR_BRIGADE_FIRST(bb);
 
         if (APR_BUCKET_IS_EOS(e)) {