]> granicus.if.org Git - apache/commitdiff
Modify the deflate input filter so that it should always return data on a
authorJustin Erenkrantz <jerenkrantz@apache.org>
Fri, 14 Jun 2002 07:58:34 +0000 (07:58 +0000)
committerJustin Erenkrantz <jerenkrantz@apache.org>
Fri, 14 Jun 2002 07:58:34 +0000 (07:58 +0000)
blocking read.

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

modules/filters/mod_deflate.c

index 4d0016e212d49ffc2ed0bc7f9914669022ac90ce..5a0b525bdd6c09a802274c125ea992dd337acdb3 100644 (file)
@@ -720,10 +720,29 @@ static apr_status_t deflate_in_filter(ap_filter_t *f,
                 APR_BRIGADE_INSERT_TAIL(ctx->proc_bb, eos); 
                 break;
             }
+
         }
         apr_brigade_cleanup(ctx->bb);
     }
 
+    /* If we are about to return nothing for a 'blocking' read and we have
+     * some data in our zlib buffer, flush it out so we can return something.
+     */
+    if (block == APR_BLOCK_READ &&
+        APR_BRIGADE_EMPTY(ctx->proc_bb) &&
+        ctx->stream.avail_out < c->bufferSize) {
+        apr_bucket *tmp_heap;
+        apr_size_t len;
+        ctx->stream.next_out = ctx->buffer;
+        len = c->bufferSize - ctx->stream.avail_out;
+
+        ctx->crc = crc32(ctx->crc, (const Bytef *)ctx->buffer, len);
+        tmp_heap = apr_bucket_heap_create((char *)ctx->buffer, len,
+                                          NULL, f->c->bucket_alloc);
+        APR_BRIGADE_INSERT_TAIL(ctx->proc_bb, tmp_heap);
+        ctx->stream.avail_out = c->bufferSize;
+    }
+
     if (!APR_BRIGADE_EMPTY(ctx->proc_bb)) {
         apr_bucket_brigade *newbb;