Author: rhuijben
Date: Wed Nov 11 14:46:37 2015
New Revision: 1713861

URL: http://svn.apache.org/viewvc?rev=1713861&view=rev
Log:
Following up on r1713852, tweak the deflate2 function to a function that is
called before the actual reading starts.

* buckets/deflate_buckets.c
  (deflate_read2): Rename to...
  (serf_deflate_wait_for_data): And start returning success when there is
    something to read instead of calling deflate3.
  (serf_deflate_read): Call serf_deflate_wait_for_data and when successfull
    continue by calling deflate_read2.

Modified:
    serf/trunk/buckets/deflate_buckets.c

Modified: serf/trunk/buckets/deflate_buckets.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/buckets/deflate_buckets.c?rev=1713861&r1=1713860&r2=1713861&view=diff
==============================================================================
--- serf/trunk/buckets/deflate_buckets.c (original)
+++ serf/trunk/buckets/deflate_buckets.c Wed Nov 11 14:46:37 2015
@@ -334,9 +334,7 @@ static apr_status_t deflate_read3(serf_b
     return status;
 }
 
-static apr_status_t deflate_read2(serf_bucket_t *bucket,
-                                      apr_size_t requested,
-                                      const char **data, apr_size_t *len)
+static apr_status_t serf_deflate_wait_for_data(serf_bucket_t *bucket)
 {
     deflate_context_t *ctx = bucket->data;
     apr_status_t status;
@@ -369,12 +367,10 @@ static apr_status_t deflate_read2(serf_b
             if (ctx->stream_left == 0) {
                 ctx->state++;
                 if (APR_STATUS_IS_EAGAIN(status)) {
-                    *len = 0;
                     return status;
                 }
             }
             else if (status) {
-                *len = 0;
                 return status;
             }
             break;
@@ -440,10 +436,10 @@ static apr_status_t deflate_read2(serf_b
             ctx->state++;
             break;
         case STATE_INFLATE:
-            return deflate_read3(bucket, requested, data, len);
+            return APR_SUCCESS;
         case STATE_DONE:
             /* We're done inflating.  Use our finished buffer. */
-            return serf_bucket_read(ctx->stream, requested, data, len);
+            return ctx->inflate_stream ? APR_SUCCESS : APR_EOF;
         default:
             /* Not reachable */
             return APR_EGENERAL;
@@ -457,7 +453,20 @@ static apr_status_t serf_deflate_read(se
                                       apr_size_t requested,
                                       const char **data, apr_size_t *len)
 {
-  return deflate_read2(bucket, requested, data, len);
+    deflate_context_t *ctx = bucket->data;
+    apr_status_t status;
+
+    status = serf_deflate_wait_for_data(bucket);
+    if (status || (ctx->state != STATE_INFLATE && ctx->state != STATE_DONE)) {
+        *data = "";
+        *len = 0;
+        return status;
+    }
+
+    if (ctx->state == STATE_INFLATE)
+        return deflate_read3(bucket, requested, data, len);
+    else
+        return serf_bucket_read(ctx->inflate_stream, requested, data, len);
 }
 
 static apr_status_t serf_deflate_set_config(serf_bucket_t *bucket,


Reply via email to