Author: rhuijben
Date: Wed Nov 11 11:12:22 2015
New Revision: 1713810

URL: http://svn.apache.org/viewvc?rev=1713810&view=rev
Log:
As we already have buckets v2, add a readline2() api to it to allow
requesting reading of a line upto a certain maximum.

All users that don't need strict limiting should continue calling the
normal readline function on a bucket, but limiting buckets might want
to delegate old and new readline calls to readline2 to avoid reading
further then allowed.

This patch just adds the feature and the default implementation on all
buckets (either v2 or v1 via a fallback).

This should allow fixing quite a few bugs for users that want to call
readline things like a response body from a chunked response.

* buckets/aggregate_buckets.c
  (serf_bucket_type_aggregate): Add default method.

* buckets/barrier_buckets.c
  (serf_bucket_type_barrier): Add default method.

* buckets/buckets.c
  (serf_default_readline): Rename to...
  (serf_default_readline2): ... this and implement newer api.
  (serf_default_readline): Reimplement as call to serf_default_readline2.
  (v2_check): Add another NULL.
  (fallback_readline2): New function.
  (fallback_bucket_type): Add fallback_readline2.

* buckets/chunk_buckets.c
  (serf_bucket_type_chunk): Add default method.

* buckets/copy_buckets.c
  (serf_bucket_type_copy): Add default method.

* buckets/dechunk_buckets.c
  (serf_bucket_type_dechunk): Add default method.

* buckets/deflate_buckets.c
  (serf_bucket_type_deflate): Add default method.

* buckets/event_buckets.c
  (serf_bucket_type__event): Add default method.

* buckets/file_buckets.c
  (serf_bucket_type_file): Add default method.

* buckets/hpack_buckets.c
  (serf_bucket_type__hpack,
   serf_bucket_type__hpack_decode): Add default method.

* buckets/http2_frame_buckets.c
  (serf_bucket_type__http2_unframe,
   serf_bucket_type__http2_unpad,
   serf_bucket_type__http2_frame): Add default method.

* buckets/iovec_buckets.c
  (serf_bucket_type_iovec): Add default method.

* buckets/limit_buckets.c
  (serf_bucket_type_limit): Add default method.

* buckets/mmap_buckets.c
  (serf_bucket_type_mmap): Add default method.

* buckets/prefix_buckets.c
  (serf_bucket_type_prefix): Add default method.

* buckets/request_buckets.c
  (serf_bucket_type_request): Add default method.

* buckets/response_body_buckets.c
  (serf_bucket_type_response_body): Add default method.

* buckets/response_buckets.c
  (serf_bucket_type_response): Add default method.

* buckets/simple_buckets.c
  (serf_bucket_type_simple): Add default method.

* buckets/socket_buckets.c
  (serf_bucket_type_socket): Add default method.

* buckets/ssl_buckets.c
  (serf_bucket_type_ssl_encrypt,
   serf_bucket_type_ssl_decrypt): Add default method.

* serf.h
  (serf_bucket_type_t): Document that get_remaining() is a read function and
     add readline2.
  (serf_bucket_readline2): New define.

* serf_bucket_util.h
  (serf_default_readline2): New function.

Modified:
    serf/trunk/buckets/aggregate_buckets.c
    serf/trunk/buckets/barrier_buckets.c
    serf/trunk/buckets/buckets.c
    serf/trunk/buckets/chunk_buckets.c
    serf/trunk/buckets/copy_buckets.c
    serf/trunk/buckets/dechunk_buckets.c
    serf/trunk/buckets/deflate_buckets.c
    serf/trunk/buckets/event_buckets.c
    serf/trunk/buckets/file_buckets.c
    serf/trunk/buckets/hpack_buckets.c
    serf/trunk/buckets/http2_frame_buckets.c
    serf/trunk/buckets/iovec_buckets.c
    serf/trunk/buckets/limit_buckets.c
    serf/trunk/buckets/mmap_buckets.c
    serf/trunk/buckets/prefix_buckets.c
    serf/trunk/buckets/request_buckets.c
    serf/trunk/buckets/response_body_buckets.c
    serf/trunk/buckets/response_buckets.c
    serf/trunk/buckets/simple_buckets.c
    serf/trunk/buckets/socket_buckets.c
    serf/trunk/buckets/ssl_buckets.c
    serf/trunk/serf.h
    serf/trunk/serf_bucket_util.h

Modified: serf/trunk/buckets/aggregate_buckets.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/buckets/aggregate_buckets.c?rev=1713810&r1=1713809&r2=1713810&view=diff
==============================================================================
--- serf/trunk/buckets/aggregate_buckets.c (original)
+++ serf/trunk/buckets/aggregate_buckets.c Wed Nov 11 11:12:22 2015
@@ -572,6 +572,7 @@ const serf_bucket_type_t serf_bucket_typ
     serf_aggregate_peek,
     serf_aggregate_destroy_and_data,
     serf_aggregate_read_bucket,
+    serf_default_readline2,
     serf_aggregate_get_remaining,
     serf_aggregate_set_config,
 };

Modified: serf/trunk/buckets/barrier_buckets.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/buckets/barrier_buckets.c?rev=1713810&r1=1713809&r2=1713810&view=diff
==============================================================================
--- serf/trunk/buckets/barrier_buckets.c (original)
+++ serf/trunk/buckets/barrier_buckets.c Wed Nov 11 11:12:22 2015
@@ -106,6 +106,7 @@ const serf_bucket_type_t serf_bucket_typ
     serf_barrier_peek,
     serf_barrier_destroy,
     serf_default_read_bucket,
+    serf_default_readline2,
     serf_barrier_get_remaining,
     serf_barrier_set_config,
 };

Modified: serf/trunk/buckets/buckets.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/buckets/buckets.c?rev=1713810&r1=1713809&r2=1713810&view=diff
==============================================================================
--- serf/trunk/buckets/buckets.c (original)
+++ serf/trunk/buckets/buckets.c Wed Nov 11 11:12:22 2015
@@ -125,14 +125,13 @@ apr_status_t serf_default_peek(
     return APR_SUCCESS;
 }
 
-apr_status_t serf_default_readline(serf_bucket_t *bucket, int acceptable,
-                                   int *found,
-                                   const char **data, apr_size_t *len)
+apr_status_t serf_default_readline2(serf_bucket_t *bucket, int acceptable,
+                                    apr_size_t requested, int *found,
+                                    const char **data, apr_size_t *len)
 {
     apr_status_t status;
     const char *peek_data;
     apr_size_t peek_len;
-    apr_size_t requested;
 
     status = bucket->type->peek(bucket, &peek_data, &peek_len);
 
@@ -143,6 +142,9 @@ apr_status_t serf_default_readline(serf_
         const char *cr = NULL;
         const char *lf = NULL;
 
+        if (peek_len > requested)
+          peek_len = requested;
+
         if ((acceptable & SERF_NEWLINE_CR) || (acceptable & SERF_NEWLINE_CRLF))
             cr = memchr(peek_data, '\r', peek_len);
         if ((acceptable & SERF_NEWLINE_LF))
@@ -174,7 +176,7 @@ apr_status_t serf_default_readline(serf_
         else
             requested = peek_len;
     }
-    else {
+    else if (requested > 1) {
         /* We can't peek...
            The only valid thing to do is try to read upto one EOL */
         if ((acceptable & SERF_NEWLINE_ANY) == SERF_NEWLINE_CRLF)
@@ -212,6 +214,14 @@ apr_status_t serf_default_readline(serf_
     return status;
 }
 
+apr_status_t serf_default_readline(serf_bucket_t *bucket, int acceptable,
+                                   int *found,
+                                   const char **data, apr_size_t *len)
+{
+    /* We explicitly call this function directly and *not* via the callback */
+    return serf_default_readline2(bucket, acceptable, SERF_READ_ALL_AVAIL,
+                                  found, data, len);
+}
 
 void serf_default_destroy(serf_bucket_t *bucket)
 {
@@ -251,6 +261,7 @@ static const serf_bucket_type_t v2_check
   NULL /* peek */,
   NULL /* destroy */,
   NULL /* read_bucket_v2 */,
+  NULL /* readline2 */,
   NULL /* get_remaining */,
   NULL /* set_config */
 };
@@ -270,6 +281,21 @@ apr_status_t serf_default_ignore_config(
     return APR_SUCCESS;
 }
 
+static apr_status_t fallback_readline2(serf_bucket_t *bucket, int acceptable,
+                                       apr_size_t requested, int *found,
+                                       const char **data, apr_size_t *len)
+{
+  if (requested == SERF_READ_ALL_AVAIL) {
+      /* A v1 bucket might have an efficient readline() for this case */
+      return bucket->type->readline(bucket, acceptable, found, data, len);
+  }
+  else {
+      /* Fall back to the default limiting implementation using peek+read */
+      return serf_default_readline2(bucket, acceptable, requested, found,
+                                    data, len);
+  }
+}
+
 /* Fallback type definition to return for buckets that don't implement
    a specific version of the bucket spec */
 static const serf_bucket_type_t fallback_bucket_type =
@@ -283,6 +309,7 @@ static const serf_bucket_type_t fallback
   NULL /* peek */,
   NULL /* destroy */,
   serf_buckets_are_v2,
+  fallback_readline2,
   serf_default_get_remaining,
   serf_default_ignore_config,
 };

Modified: serf/trunk/buckets/chunk_buckets.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/buckets/chunk_buckets.c?rev=1713810&r1=1713809&r2=1713810&view=diff
==============================================================================
--- serf/trunk/buckets/chunk_buckets.c (original)
+++ serf/trunk/buckets/chunk_buckets.c Wed Nov 11 11:12:22 2015
@@ -255,6 +255,7 @@ const serf_bucket_type_t serf_bucket_typ
     serf_chunk_peek,
     serf_chunk_destroy,
     serf_default_read_bucket,
+    serf_default_readline2,
     serf_default_get_remaining,
     serf_chunk_set_config,
 };

Modified: serf/trunk/buckets/copy_buckets.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/buckets/copy_buckets.c?rev=1713810&r1=1713809&r2=1713810&view=diff
==============================================================================
--- serf/trunk/buckets/copy_buckets.c (original)
+++ serf/trunk/buckets/copy_buckets.c Wed Nov 11 11:12:22 2015
@@ -337,6 +337,7 @@ const serf_bucket_type_t serf_bucket_typ
     serf_copy_peek,
     serf_copy_destroy,
     serf_copy_read_bucket,
+    serf_default_readline2,
     serf_copy_get_remaining,
     serf_copy_set_config,
 };

Modified: serf/trunk/buckets/dechunk_buckets.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/buckets/dechunk_buckets.c?rev=1713810&r1=1713809&r2=1713810&view=diff
==============================================================================
--- serf/trunk/buckets/dechunk_buckets.c (original)
+++ serf/trunk/buckets/dechunk_buckets.c Wed Nov 11 11:12:22 2015
@@ -207,6 +207,7 @@ const serf_bucket_type_t serf_bucket_typ
     serf_default_peek /* ### TODO */,
     serf_dechunk_destroy_and_data,
     serf_default_read_bucket,
+    serf_default_readline2,
     serf_default_get_remaining,
     serf_dechunk_set_config,
 };

Modified: serf/trunk/buckets/deflate_buckets.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/buckets/deflate_buckets.c?rev=1713810&r1=1713809&r2=1713810&view=diff
==============================================================================
--- serf/trunk/buckets/deflate_buckets.c (original)
+++ serf/trunk/buckets/deflate_buckets.c Wed Nov 11 11:12:22 2015
@@ -454,6 +454,7 @@ const serf_bucket_type_t serf_bucket_typ
     serf_default_peek /* ### TODO */,
     serf_deflate_destroy_and_data,
     serf_default_read_bucket,
+    serf_default_readline2,
     serf_default_get_remaining,
     serf_deflate_set_config,
 };

Modified: serf/trunk/buckets/event_buckets.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/buckets/event_buckets.c?rev=1713810&r1=1713809&r2=1713810&view=diff
==============================================================================
--- serf/trunk/buckets/event_buckets.c (original)
+++ serf/trunk/buckets/event_buckets.c Wed Nov 11 11:12:22 2015
@@ -136,6 +136,7 @@ const serf_bucket_type_t serf_bucket_typ
     serf_event_peek,
     serf_event_destroy,
     serf_default_read_bucket,
+    serf_default_readline2,
     serf_event_get_remaining,
     serf_default_ignore_config,
 };

Modified: serf/trunk/buckets/file_buckets.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/buckets/file_buckets.c?rev=1713810&r1=1713809&r2=1713810&view=diff
==============================================================================
--- serf/trunk/buckets/file_buckets.c (original)
+++ serf/trunk/buckets/file_buckets.c Wed Nov 11 11:12:22 2015
@@ -158,6 +158,7 @@ const serf_bucket_type_t serf_bucket_typ
     serf_file_peek,
     serf_default_destroy_and_data,
     serf_default_read_bucket,
+    serf_default_readline2,
     serf_file_get_remaining,
     serf_default_ignore_config,
 };

Modified: serf/trunk/buckets/hpack_buckets.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/buckets/hpack_buckets.c?rev=1713810&r1=1713809&r2=1713810&view=diff
==============================================================================
--- serf/trunk/buckets/hpack_buckets.c (original)
+++ serf/trunk/buckets/hpack_buckets.c Wed Nov 11 11:12:22 2015
@@ -1039,6 +1039,7 @@ const serf_bucket_type_t serf_bucket_typ
   serf_hpack_peek,
   serf_hpack_destroy_and_data,
   serf_default_read_bucket,
+  serf_default_readline2,
   serf_hpack_get_remaining,
   serf_default_ignore_config,
 };
@@ -1924,6 +1925,7 @@ const serf_bucket_type_t serf_bucket_typ
   serf_hpack_decode_peek,
   serf_hpack_decode_destroy,
   serf_default_read_bucket,
+  serf_default_readline2,
   serf_default_get_remaining,
   serf_hpack_decode_set_config
 };

Modified: serf/trunk/buckets/http2_frame_buckets.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/buckets/http2_frame_buckets.c?rev=1713810&r1=1713809&r2=1713810&view=diff
==============================================================================
--- serf/trunk/buckets/http2_frame_buckets.c (original)
+++ serf/trunk/buckets/http2_frame_buckets.c Wed Nov 11 11:12:22 2015
@@ -332,6 +332,7 @@ const serf_bucket_type_t serf_bucket_typ
   serf_http2_unframe_peek,
   serf_default_destroy_and_data,
   serf_default_read_bucket,
+  serf_default_readline2,
   serf_http2_unframe_get_remaining,
   serf_default_ignore_config
 };
@@ -594,6 +595,7 @@ const serf_bucket_type_t serf_bucket_typ
   serf_http2_unpad_peek,
   serf_http2_unpad_destroy,
   serf_default_read_bucket,
+  serf_default_readline2,
   serf_http2_unpad_get_remaining,
   serf_default_ignore_config
 };
@@ -965,6 +967,7 @@ const serf_bucket_type_t serf_bucket_typ
   serf_http2_frame_peek,
   serf_http2_frame_destroy,
   serf_default_read_bucket,
+  serf_default_readline2,
   serf_default_get_remaining,
   serf_default_ignore_config
 };

Modified: serf/trunk/buckets/iovec_buckets.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/buckets/iovec_buckets.c?rev=1713810&r1=1713809&r2=1713810&view=diff
==============================================================================
--- serf/trunk/buckets/iovec_buckets.c (original)
+++ serf/trunk/buckets/iovec_buckets.c Wed Nov 11 11:12:22 2015
@@ -179,6 +179,7 @@ const serf_bucket_type_t serf_bucket_typ
     serf_iovec_peek,
     serf_default_destroy_and_data,
     serf_default_read_bucket,
+    serf_default_readline2,
     serf_iovec_get_remaining,
     serf_default_ignore_config
 };

Modified: serf/trunk/buckets/limit_buckets.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/buckets/limit_buckets.c?rev=1713810&r1=1713809&r2=1713810&view=diff
==============================================================================
--- serf/trunk/buckets/limit_buckets.c (original)
+++ serf/trunk/buckets/limit_buckets.c Wed Nov 11 11:12:22 2015
@@ -176,6 +176,7 @@ const serf_bucket_type_t serf_bucket_typ
     serf_limit_peek,
     serf_limit_destroy,
     serf_default_read_bucket,
+    serf_default_readline2,
     serf_limit_get_remaining,
     serf_limit_set_config,
 };

Modified: serf/trunk/buckets/mmap_buckets.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/buckets/mmap_buckets.c?rev=1713810&r1=1713809&r2=1713810&view=diff
==============================================================================
--- serf/trunk/buckets/mmap_buckets.c (original)
+++ serf/trunk/buckets/mmap_buckets.c Wed Nov 11 11:12:22 2015
@@ -145,6 +145,7 @@ const serf_bucket_type_t serf_bucket_typ
     serf_mmap_peek,
     serf_default_destroy_and_data,
     serf_default_read_bucket,
+    serf_default_readline2,
     serf_mmap_get_remaining,
     serf_default_ignore_config,
 };

Modified: serf/trunk/buckets/prefix_buckets.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/buckets/prefix_buckets.c?rev=1713810&r1=1713809&r2=1713810&view=diff
==============================================================================
--- serf/trunk/buckets/prefix_buckets.c (original)
+++ serf/trunk/buckets/prefix_buckets.c Wed Nov 11 11:12:22 2015
@@ -227,17 +227,18 @@ static void serf_prefix_destroy(serf_buc
 }
 
 const serf_bucket_type_t serf_bucket_type_prefix = {
-  "prefix",
-  serf_prefix_read,
-  serf_default_readline,
-  serf_prefix_read_iovec,
-  serf_default_read_for_sendfile,
-  serf_buckets_are_v2,
-  serf_prefix_peek,
-  serf_prefix_destroy,
-  serf_default_read_bucket,
-  serf_prefix_get_remaining,
-  serf_prefix_set_config
+    "prefix",
+    serf_prefix_read,
+    serf_default_readline,
+    serf_prefix_read_iovec,
+    serf_default_read_for_sendfile,
+    serf_buckets_are_v2,
+    serf_prefix_peek,
+    serf_prefix_destroy,
+    serf_default_read_bucket,
+    serf_default_readline2,
+    serf_prefix_get_remaining,
+    serf_prefix_set_config
 };
 
 

Modified: serf/trunk/buckets/request_buckets.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/buckets/request_buckets.c?rev=1713810&r1=1713809&r2=1713810&view=diff
==============================================================================
--- serf/trunk/buckets/request_buckets.c (original)
+++ serf/trunk/buckets/request_buckets.c Wed Nov 11 11:12:22 2015
@@ -272,6 +272,7 @@ const serf_bucket_type_t serf_bucket_typ
     serf_request_peek,
     serf_request_destroy,
     serf_request_read_bucket,
+    serf_default_readline2,
     serf_default_get_remaining,
     serf_request_set_config,
 };

Modified: serf/trunk/buckets/response_body_buckets.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/buckets/response_body_buckets.c?rev=1713810&r1=1713809&r2=1713810&view=diff
==============================================================================
--- serf/trunk/buckets/response_body_buckets.c (original)
+++ serf/trunk/buckets/response_body_buckets.c Wed Nov 11 11:12:22 2015
@@ -202,6 +202,7 @@ const serf_bucket_type_t serf_bucket_typ
     serf_response_body_peek,
     serf_response_body_destroy,
     serf_default_read_bucket,
+    serf_default_readline2,
     serf_response_body_get_remaining,
     serf_response_body_set_config,
 };

Modified: serf/trunk/buckets/response_buckets.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/buckets/response_buckets.c?rev=1713810&r1=1713809&r2=1713810&view=diff
==============================================================================
--- serf/trunk/buckets/response_buckets.c (original)
+++ serf/trunk/buckets/response_buckets.c Wed Nov 11 11:12:22 2015
@@ -640,6 +640,7 @@ const serf_bucket_type_t serf_bucket_typ
     serf_response_peek,
     serf_response_destroy_and_data,
     serf_default_read_bucket,
+    serf_default_readline2,
     serf_default_get_remaining,
     serf_response_set_config,
 };

Modified: serf/trunk/buckets/simple_buckets.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/buckets/simple_buckets.c?rev=1713810&r1=1713809&r2=1713810&view=diff
==============================================================================
--- serf/trunk/buckets/simple_buckets.c (original)
+++ serf/trunk/buckets/simple_buckets.c Wed Nov 11 11:12:22 2015
@@ -169,6 +169,7 @@ const serf_bucket_type_t serf_bucket_typ
     serf_simple_peek,
     serf_simple_destroy,
     serf_default_read_bucket,
+    serf_default_readline2,
     serf_simple_get_remaining,
     serf_default_ignore_config,
 };

Modified: serf/trunk/buckets/socket_buckets.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/buckets/socket_buckets.c?rev=1713810&r1=1713809&r2=1713810&view=diff
==============================================================================
--- serf/trunk/buckets/socket_buckets.c (original)
+++ serf/trunk/buckets/socket_buckets.c Wed Nov 11 11:12:22 2015
@@ -119,6 +119,7 @@ const serf_bucket_type_t serf_bucket_typ
     serf_socket_peek,
     serf_default_destroy_and_data,
     serf_default_read_bucket,
+    serf_default_readline2,
     serf_default_get_remaining,
     serf_default_ignore_config,
 };

Modified: serf/trunk/buckets/ssl_buckets.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/buckets/ssl_buckets.c?rev=1713810&r1=1713809&r2=1713810&view=diff
==============================================================================
--- serf/trunk/buckets/ssl_buckets.c (original)
+++ serf/trunk/buckets/ssl_buckets.c Wed Nov 11 11:12:22 2015
@@ -2359,6 +2359,7 @@ const serf_bucket_type_t serf_bucket_typ
     serf_ssl_peek,
     serf_ssl_encrypt_destroy_and_data,
     serf_default_read_bucket,
+    serf_default_readline2,
     serf_default_get_remaining,
     serf_ssl_set_config,
 };
@@ -2373,6 +2374,7 @@ const serf_bucket_type_t serf_bucket_typ
     serf_ssl_peek,
     serf_ssl_decrypt_destroy_and_data,
     serf_default_read_bucket,
+    serf_default_readline2,
     serf_default_get_remaining,
     serf_ssl_set_config,
 };

Modified: serf/trunk/serf.h
URL: 
http://svn.apache.org/viewvc/serf/trunk/serf.h?rev=1713810&r1=1713809&r2=1713810&view=diff
==============================================================================
--- serf/trunk/serf.h (original)
+++ serf/trunk/serf.h Wed Nov 11 11:12:22 2015
@@ -832,7 +832,7 @@ struct serf_bucket_type_t {
      * The data will exist until one of two conditions occur:
      *
      * 1) this bucket is destroyed
-     * 2) another call to any read function or to peek()
+     * 2) another call to any read function, get_remaining() or to peek()
      *
      * If an application needs the data to exist for a longer duration,
      * then it must make a copy.
@@ -965,6 +965,28 @@ struct serf_bucket_type_t {
     serf_bucket_t * (*read_bucket_v2)(serf_bucket_t *bucket,
                                       const serf_bucket_type_t *type);
 
+    /**
+     * Read (and consume) a line of data upto @a requested bytes from @bucket.
+     *
+     * Most api users would typically just use readline() unless limiting of
+     * the result is required.
+     *
+     * The acceptable forms of a newline are given by @a acceptable, and
+     * the type found is returned in @a found. If a newline is not present
+     * in the returned data, then SERF_NEWLINE_NONE is stored into @a found.
+     *
+     * A pointer to the data is returned in @a data, and its length is
+     * specified by @a len. The data will include the newline, if present.
+     *
+     * The lifetime of the data is the same as that of the @see read
+     * function above.
+     *
+     * @since New in 1.4 / Buckets v2.
+     */
+    apr_status_t(*readline2)(serf_bucket_t *bucket, int acceptable,
+                             apr_size_t requested, int *found,
+                             const char **data, apr_size_t *len);
+
     /* Returns length of remaining data to be read in @a bucket. Returns
      * SERF_LENGTH_UNKNOWN if length is unknown.
      *
@@ -1038,6 +1060,8 @@ const serf_bucket_type_t *serf_get_type(
 #define serf_bucket_read_bucket(b,t) ((b)->type->read_bucket(b,t))
 #define serf_bucket_peek(b,d,l) ((b)->type->peek(b,d,l))
 #define serf_bucket_destroy(b) ((b)->type->destroy(b))
+#define serf_bucket_readline2(b,a,r,f,d,l) \
+    SERF__RECREAD(b, (b)->type->readline2(b,a,r,f,d,l))
 #define serf_bucket_get_remaining(b) (serf_get_type(b, 2)->get_remaining(b))
 #define serf_bucket_set_config(b,c) (serf_get_type(b, 2)->set_config(b, c))
 

Modified: serf/trunk/serf_bucket_util.h
URL: 
http://svn.apache.org/viewvc/serf/trunk/serf_bucket_util.h?rev=1713810&r1=1713809&r2=1713810&view=diff
==============================================================================
--- serf/trunk/serf_bucket_util.h (original)
+++ serf/trunk/serf_bucket_util.h Wed Nov 11 11:12:22 2015
@@ -126,6 +126,16 @@ void serf_default_destroy_and_data(
     serf_bucket_t *bucket);
 
 /**
+ * Default implementation of the @see readline2 functionality.
+ *
+ * This function will use the @see read function, when possible optimized by
+ * the @a peek function to return the requested result.
+ */
+apr_status_t serf_default_readline2(serf_bucket_t *bucket, int acceptable,
+                                    apr_size_t requested, int *found,
+                                    const char **data, apr_size_t *len);
+
+/**
  * Default implementation of the @see get_remaining functionality.
  *
  * This function will just return SERF_LENGTH_UNKNOWN.


Reply via email to