Author: rhuijben
Date: Wed Nov 25 10:35:59 2015
New Revision: 1716346

URL: http://svn.apache.org/viewvc?rev=1716346&view=rev
Log:
Don't retry reads of length 0 with success status until the end of time, while
reading from another bucket. Just return a read of 0 itself.

* buckets/fcgi_buckets.c
  (serf__bucket_fcgi_unframe_read_info): Return special error here.
  (serf_fcgi_unframe_read,
   serf_fcgi_unframe_peek): And fold it into success here.

* buckets/hpack_buckets.c
  (read_hpack_int): Return special error here...
  (hpack_read_bytes): ... and here.
  (serf_hpack_decode_read,
   serf_hpack_decode_peek): And fold it into success here.

* buckets/http2_frame_buckets.c
  (serf__bucket_http2_unframe_read_info): Return special error here.
  (serf_http2_unframe_read,
   serf_http2_unframe_read_iovec,
   serf_http2_unframe_peek): And fold it into success here.

* context.c
  (serf_error_string): Print new error.

* serf.h
  (SERF_ERROR_EMPTY_READ): Declare new error.

Modified:
    serf/trunk/buckets/fcgi_buckets.c
    serf/trunk/buckets/hpack_buckets.c
    serf/trunk/buckets/http2_frame_buckets.c
    serf/trunk/context.c
    serf/trunk/serf.h

Modified: serf/trunk/buckets/fcgi_buckets.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/buckets/fcgi_buckets.c?rev=1716346&r1=1716345&r2=1716346&view=diff
==============================================================================
--- serf/trunk/buckets/fcgi_buckets.c (original)
+++ serf/trunk/buckets/fcgi_buckets.c Wed Nov 25 10:35:59 2015
@@ -96,6 +96,8 @@ apr_status_t serf__bucket_fcgi_unframe_r
 
         if (SERF_BUCKET_READ_ERROR(status))
             return status;
+        else if (!len && !status)
+            return SERF_ERROR_EMPTY_READ;
 
         if (len < FCGI_RECORD_SIZE) {
             memcpy(ctx->buffer + FCGI_RECORD_SIZE - ctx->record_remaining,
@@ -170,7 +172,7 @@ static apr_status_t serf_fcgi_unframe_re
     if (status)
     {
         *len = 0;
-        return status;
+        return (status == SERF_ERROR_EMPTY_READ) ? APR_SUCCESS : status;
     }
 
     if (requested > ctx->payload_remaining)
@@ -219,7 +221,7 @@ static apr_status_t serf_fcgi_unframe_pe
     if (status)
     {
         *len = 0;
-        return status;
+        return (status == SERF_ERROR_EMPTY_READ) ? APR_SUCCESS : status;
     }
 
     status = serf_bucket_peek(ctx->stream, data, len);

Modified: serf/trunk/buckets/hpack_buckets.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/buckets/hpack_buckets.c?rev=1716346&r1=1716345&r2=1716346&view=diff
==============================================================================
--- serf/trunk/buckets/hpack_buckets.c (original)
+++ serf/trunk/buckets/hpack_buckets.c Wed Nov 25 10:35:59 2015
@@ -1251,11 +1251,11 @@ read_hpack_int(apr_uint32_t *v,
         const char *data;
         apr_size_t len;
 
-        do {
-            status = serf_bucket_read(ctx->stream, 1, &data, &len);
-        } while ((status == APR_SUCCESS) && !len);
+        status = serf_bucket_read(ctx->stream, 1, &data, &len);
 
-        if (SERF_BUCKET_READ_ERROR(status) || len == 0)
+        if (!status && !len)
+            return SERF_ERROR_EMPTY_READ;
+        else if (SERF_BUCKET_READ_ERROR(status) || len == 0)
             return status;
 
         ctx->buffer[0] = *data;
@@ -1291,11 +1291,10 @@ read_hpack_int(apr_uint32_t *v,
             if ((7 * (ctx->buffer_used - 1) + bits) >= 32)
                 return SERF_ERROR_HTTP2_COMPRESSION_ERROR;
 
-            do {
-                status = serf_bucket_read(ctx->stream, 1, &data, &len);
-            } while ((status == APR_SUCCESS) && !len);
-
-            if (SERF_BUCKET_READ_ERROR(status) || len == 0)
+            status = serf_bucket_read(ctx->stream, 1, &data, &len);
+            if (!status && !len)
+                return SERF_ERROR_EMPTY_READ;
+            else if (SERF_BUCKET_READ_ERROR(status) || len == 0)
                 return status;
 
             ctx->buffer[ctx->buffer_used] = *data;
@@ -1577,6 +1576,8 @@ static apr_status_t hpack_read_bytes(ser
 
         if (status)
             break;
+        else if (!status && !len)
+            return SERF_ERROR_EMPTY_READ;
     }
 
     if (ctx->buffer_used == required)
@@ -1608,11 +1609,10 @@ hpack_process(serf_bucket_t *bucket)
                     const char *data;
                     apr_size_t len;
 
-                    do {
-                        status = serf_bucket_read(ctx->stream, 1, &data, &len);
-                    } while (status == APR_SUCCESS && !len);
-
-                    if (SERF_BUCKET_READ_ERROR(status) || len == 0)
+                    status = serf_bucket_read(ctx->stream, 1, &data, &len);
+                    if (!status && !len)
+                        return SERF_ERROR_EMPTY_READ;
+                    else if (SERF_BUCKET_READ_ERROR(status) || len == 0)
                         break;
 
                     ctx->key_hm = ctx->val_hm = FALSE;
@@ -1883,7 +1883,6 @@ hpack_process(serf_bucket_t *bucket)
 
     if (APR_STATUS_IS_EOF(status))
     {
-        serf_bucket_t *b;
         if (ctx->state != HPACK_DECODE_STATE_INITIAL)
             return SERF_ERROR_HTTP2_COMPRESSION_ERROR;
 
@@ -1911,10 +1910,10 @@ serf_hpack_decode_read(serf_bucket_t *bu
     apr_status_t status;
 
     status = hpack_process(bucket);
-    if (SERF_BUCKET_READ_ERROR(status) || !ctx->agg)
+    if (status || !ctx->agg)
     {
         *len = 0;
-        return status;
+        return (status == SERF_ERROR_EMPTY_READ) ? APR_SUCCESS : status;
     }
 
     return serf_bucket_read(ctx->agg, requested, data, len);
@@ -1929,10 +1928,10 @@ serf_hpack_decode_peek(serf_bucket_t *bu
     apr_status_t status;
 
     status = hpack_process(bucket);
-    if (SERF_BUCKET_READ_ERROR(status) || !ctx->agg)
+    if (status || !ctx->agg)
     {
         *len = 0;
-        return status;
+        return (status == SERF_ERROR_EMPTY_READ) ? APR_SUCCESS : status;
     }
 
     return serf_bucket_peek(ctx->agg, data, len);

Modified: serf/trunk/buckets/http2_frame_buckets.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/buckets/http2_frame_buckets.c?rev=1716346&r1=1716345&r2=1716346&view=diff
==============================================================================
--- serf/trunk/buckets/http2_frame_buckets.c (original)
+++ serf/trunk/buckets/http2_frame_buckets.c Wed Nov 25 10:35:59 2015
@@ -105,6 +105,8 @@ serf__bucket_http2_unframe_read_info(ser
         status = serf_bucket_read(ctx->stream, ctx->prefix_remaining, &data, 
&len);
         if (SERF_BUCKET_READ_ERROR(status))
             return status;
+        else if (!status && !len)
+            return SERF_ERROR_EMPTY_READ;
 
         if (len < FRAME_PREFIX_SIZE) {
             memcpy(ctx->buffer + FRAME_PREFIX_SIZE - ctx->prefix_remaining,
@@ -208,7 +210,7 @@ serf_http2_unframe_read(serf_bucket_t *b
 
     if (status) {
         *len = 0;
-        return status;
+        return (status == SERF_ERROR_EMPTY_READ) ? APR_SUCCESS : status;
     }
 
     if (ctx->payload_remaining == 0) {
@@ -242,8 +244,8 @@ static apr_status_t
 serf_http2_unframe_read_iovec(serf_bucket_t *bucket,
                               apr_size_t requested,
                               int vecs_size,
-struct iovec *vecs,
-    int *vecs_used)
+                              struct iovec *vecs,
+                              int *vecs_used)
 {
     http2_unframe_context_t *ctx = bucket->data;
     apr_status_t status;
@@ -252,7 +254,7 @@ struct iovec *vecs,
 
     if (status) {
         *vecs_used = 0;
-        return status;
+        return (status == SERF_ERROR_EMPTY_READ) ? APR_SUCCESS : status;
     }
 
     if (ctx->payload_remaining == 0) {
@@ -301,7 +303,7 @@ serf_http2_unframe_peek(serf_bucket_t *b
 
     if (status) {
         *len = 0;
-        return status;
+        return (status == SERF_ERROR_EMPTY_READ) ? APR_SUCCESS : status;
     }
 
     status = serf_bucket_peek(ctx->stream, data, len);

Modified: serf/trunk/context.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/context.c?rev=1716346&r1=1716345&r2=1716346&view=diff
==============================================================================
--- serf/trunk/context.c (original)
+++ serf/trunk/context.c Wed Nov 25 10:35:59 2015
@@ -380,6 +380,8 @@ const char *serf_error_string(apr_status
         return "The stream returned less data than was expected";
     case SERF_ERROR_EMPTY_STREAM:
         return "The stream is empty";
+    case SERF_ERROR_EMPTY_READ:
+        return "A successfull read of nothing occured";
 
     case SERF_ERROR_SSL_COMM_FAILED:
         return "An error occurred during SSL communication";

Modified: serf/trunk/serf.h
URL: 
http://svn.apache.org/viewvc/serf/trunk/serf.h?rev=1716346&r1=1716345&r2=1716346&view=diff
==============================================================================
--- serf/trunk/serf.h (original)
+++ serf/trunk/serf.h Wed Nov 25 10:35:59 2015
@@ -111,6 +111,8 @@ typedef struct serf_config_t serf_config
 #define SERF_ERROR_TRUNCATED_STREAM (SERF_ERROR_START + 13)
 /* The stream is empty */
 #define SERF_ERROR_EMPTY_STREAM (SERF_ERROR_START + 14)
+/* An empty read was returned. */
+#define SERF_ERROR_EMPTY_READ (SERF_ERROR_START + 15)
 
 /* Http-2 stream errors, mapped into our error range */
 #define SERF_ERROR_HTTP2_NO_ERROR (SERF_ERROR_START + 50)


Reply via email to