]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
Don't try to compress requests with a zero sized body.
authorStefan Fritsch <sf@apache.org>
Wed, 13 Jul 2011 20:38:33 +0000 (20:38 +0000)
committerStefan Fritsch <sf@apache.org>
Wed, 13 Jul 2011 20:38:33 +0000 (20:38 +0000)
PR: 51350

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1146418 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
modules/filters/mod_deflate.c

diff --git a/CHANGES b/CHANGES
index 7f92cacf04887d49bfa45e9c412681e2fcde1e30..a4c6c335b26b3c59cb526de7dcfd6c5a4f3577dd 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -2,6 +2,9 @@
 
 Changes with Apache 2.3.14
 
+  *) mod_deflate: Don't try to compress requests with a zero sized body.
+     PR 51350. [Stefan Fritsch]
+
   *) core: Fix startup on IP6-only systems. PR 50592. [Joe Orton,
      <root linkage white-void net>]
 
index a11c6022be1e150cba61d843240515a87467f223..2f186433b755f9ad5b7e9f22483298057ab3b771 100644 (file)
@@ -426,6 +426,8 @@ static apr_status_t deflate_out_filter(ap_filter_t *f,
     request_rec *r = f->r;
     deflate_ctx *ctx = f->ctx;
     int zRC;
+    apr_size_t len;
+    const char *data;
     deflate_filter_config *c;
 
     /* Do nothing if asked to filter nothing. */
@@ -446,6 +448,28 @@ static apr_status_t deflate_out_filter(ap_filter_t *f,
         char *token;
         const char *encoding;
 
+        /* Delay initialization until we have seen some data */
+        e = APR_BRIGADE_FIRST(bb);
+        while (1) {
+            apr_status_t rc;
+            if (e == APR_BRIGADE_SENTINEL(bb))
+                return ap_pass_brigade(f->next, bb);
+            if (APR_BUCKET_IS_EOS(e)) {
+                ap_remove_output_filter(f);
+                return ap_pass_brigade(f->next, bb);
+            }
+            if (APR_BUCKET_IS_METADATA(e))
+                continue;
+
+            rc = apr_bucket_read(e, &data, &len, APR_BLOCK_READ);
+            if (rc != APR_SUCCESS)
+                return rc;
+            if (len > 0)
+                break;
+
+            e = APR_BUCKET_NEXT(e);
+        }
+
         ctx = f->ctx = apr_pcalloc(r->pool, sizeof(*ctx));
 
         /*
@@ -645,9 +669,7 @@ static apr_status_t deflate_out_filter(ap_filter_t *f,
 
     while (!APR_BRIGADE_EMPTY(bb))
     {
-        const char *data;
         apr_bucket *b;
-        apr_size_t len;
 
         /*
          * Optimization: If we are a HEAD request and bytes_sent is not zero