Author: rhuijben
Date: Wed Nov 11 10:00:53 2015
New Revision: 1713794

URL: http://svn.apache.org/viewvc?rev=1713794&view=rev
Log:
Implement peek() and read_iovec() on the standard response bucket to
allow optimizing some operations while reading.

* buckets/response_buckets.c
  (serf_response_read_iovec,
   serf_response_peek): New function.
  (serf_bucket_type_response): Use new functions.

Modified:
    serf/trunk/buckets/response_buckets.c

Modified: serf/trunk/buckets/response_buckets.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/buckets/response_buckets.c?rev=1713794&r1=1713793&r2=1713794&view=diff
==============================================================================
--- serf/trunk/buckets/response_buckets.c (original)
+++ serf/trunk/buckets/response_buckets.c Wed Nov 11 10:00:53 2015
@@ -527,6 +527,56 @@ fake_eof:
     return status;
 }
 
+static apr_status_t serf_response_read_iovec(serf_bucket_t *bucket,
+                                             apr_size_t requested,
+                                             int vecs_size,
+                                             struct iovec *vecs,
+                                             int *vecs_used)
+{
+    response_context_t *ctx = bucket->data;
+    apr_status_t status;
+
+    status = wait_for_body(bucket, ctx);
+    if (status) {
+        *vecs_used = 0;
+        goto fake_eof;
+    }
+
+    status = serf_bucket_read_iovec(ctx->body, requested, vecs_size,
+                                    vecs, vecs_used);
+
+fake_eof:
+    if (APR_STATUS_IS_EOF(status) && ctx->error_on_eof)
+        return ctx->error_on_eof;
+
+    return status;
+}
+
+static apr_status_t serf_response_peek(serf_bucket_t *bucket,
+                                       const char **data,
+                                       apr_size_t *len)
+{
+    response_context_t *ctx = bucket->data;
+    apr_status_t status;
+
+    status = wait_for_body(bucket, ctx);
+    if (status) {
+        *data = NULL;
+        *len = 0;
+
+        if (SERF_BUCKET_READ_ERROR(status))
+            return status;
+        else
+            return APR_SUCCESS;
+    }
+
+    status = serf_bucket_peek(ctx->body, data, len);
+    if (APR_STATUS_IS_EOF(status) && ctx->error_on_eof)
+        return ctx->error_on_eof;
+
+    return status;
+}
+
 apr_status_t serf_response_full_become_aggregate(serf_bucket_t *bucket)
 {
     response_context_t *ctx = bucket->data;
@@ -584,10 +634,10 @@ const serf_bucket_type_t serf_bucket_typ
     "RESPONSE",
     serf_response_read,
     serf_response_readline,
-    serf_default_read_iovec,
+    serf_response_read_iovec,
     serf_default_read_for_sendfile,
     serf_buckets_are_v2,
-    serf_default_peek /* ### TODO */,
+    serf_response_peek,
     serf_response_destroy_and_data,
     serf_default_read_bucket,
     serf_default_get_remaining,


Reply via email to