On the get-remaining branch: Add a default get_remaining implementation
to avoid triggering a segfault when somebody tries to call this function
on a bucket that doesn't support this feature.

Add ### TODO on several callbacks that have the same problem,
caused by just being a #define to NULL.

* buckets/buckets.c
  (serf_default_get_remaining): New function.
  
* buckets/chunk_buckets.c
  (serf_bucket_type_chunk):
* buckets/copy_buckets.c
  (serf_bucket_type_copy):
* buckets/dechunk_buckets.c
  (serf_bucket_type_dechunk):
* buckets/deflate_buckets.c
  (serf_bucket_type_deflate):
* buckets/request_buckets.c
  (serf_bucket_type_request):
* buckets/response_body_buckets.c
  (serf_bucket_type_response_body):
* buckets/response_buckets.c
  (serf_bucket_type_response):
* buckets/socket_buckets.c
  (serf_bucket_type_socket):
* buckets/ssl_buckets.c
  (serf_bucket_type_ssl_encrypt,
   serf_bucket_type_ssl_decrypt):
     Set default get_remaining handler.
   
* serf_bucket_util.h
  (serf_default_get_remaining): New function.

* test/mock_sock_buckets.c
  (serf_bucket_type_mock_socket): Set get_remaining handler.


git-svn-id: https://svn.apache.org/repos/asf/serf/branches/get-remaining@1701864 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/buckets/buckets.c b/buckets/buckets.c
index ceb2628..ee6e208 100644
--- a/buckets/buckets.c
+++ b/buckets/buckets.c
@@ -129,6 +129,10 @@
     serf_default_destroy(bucket);
 }
 
+apr_uint64_t *serf_default_get_remaining(serf_bucket_t *bucket)
+{
+    return SERF_LENGTH_UNKNOWN;
+}
 
 serf_bucket_t * serf_buckets_are_v2(serf_bucket_t *bucket,
                                     const serf_bucket_type_t *type)
diff --git a/buckets/chunk_buckets.c b/buckets/chunk_buckets.c
index 13b2a75..9334cd1 100644
--- a/buckets/chunk_buckets.c
+++ b/buckets/chunk_buckets.c
@@ -255,6 +255,6 @@
     serf_chunk_peek,
     serf_chunk_destroy,
     serf_default_read_bucket,
-    NULL,
+    serf_default_get_remaining,
     serf_chunk_set_config,
 };
diff --git a/buckets/copy_buckets.c b/buckets/copy_buckets.c
index 042d1ba..7801250 100644
--- a/buckets/copy_buckets.c
+++ b/buckets/copy_buckets.c
@@ -198,6 +198,6 @@
     serf_copy_peek,
     serf_copy_destroy,
     serf_copy_read_bucket,
-    NULL,
+    serf_default_get_remaining,
     serf_copy_set_config,
 };
diff --git a/buckets/dechunk_buckets.c b/buckets/dechunk_buckets.c
index c99051f..d756746 100644
--- a/buckets/dechunk_buckets.c
+++ b/buckets/dechunk_buckets.c
@@ -205,13 +205,13 @@
 const serf_bucket_type_t serf_bucket_type_dechunk = {
     "DECHUNK",
     serf_dechunk_read,
-    serf_dechunk_readline,
+    serf_dechunk_readline /* ### TODO */,
     serf_default_read_iovec,
     serf_default_read_for_sendfile,
     serf_buckets_are_v2,
-    serf_dechunk_peek,
+    serf_dechunk_peek /* ### TODO */,
     serf_dechunk_destroy_and_data,
     serf_default_read_bucket,
-    NULL,
+    serf_default_get_remaining,
     serf_dechunk_set_config,
 };
diff --git a/buckets/deflate_buckets.c b/buckets/deflate_buckets.c
index f43b2dc..bba9082 100644
--- a/buckets/deflate_buckets.c
+++ b/buckets/deflate_buckets.c
@@ -451,13 +451,13 @@
 const serf_bucket_type_t serf_bucket_type_deflate = {
     "DEFLATE",
     serf_deflate_read,
-    serf_deflate_readline,
+    serf_deflate_readline /* ### TODO */,
     serf_default_read_iovec,
     serf_default_read_for_sendfile,
     serf_buckets_are_v2,
-    serf_deflate_peek,
+    serf_deflate_peek /* ### TODO */,
     serf_deflate_destroy_and_data,
     serf_default_read_bucket,
-    NULL,
+    serf_default_get_remaining,
     serf_deflate_set_config,
 };
diff --git a/buckets/request_buckets.c b/buckets/request_buckets.c
index 02a5a2d..f60887d 100644
--- a/buckets/request_buckets.c
+++ b/buckets/request_buckets.c
@@ -245,7 +245,7 @@
     serf_request_peek,
     serf_request_destroy,
     serf_default_read_bucket,
-    NULL,
+    serf_default_get_remaining,
     serf_request_set_config,
 };
 
diff --git a/buckets/response_body_buckets.c b/buckets/response_body_buckets.c
index 33726cc..db6da6e 100644
--- a/buckets/response_body_buckets.c
+++ b/buckets/response_body_buckets.c
@@ -149,6 +149,6 @@
     serf_response_body_peek,
     serf_response_body_destroy,
     serf_default_read_bucket,
-    NULL,
+    serf_default_get_remaining,
     serf_response_body_set_config,
 };
diff --git a/buckets/response_buckets.c b/buckets/response_buckets.c
index bc1d3a6..f93626e 100644
--- a/buckets/response_buckets.c
+++ b/buckets/response_buckets.c
@@ -542,9 +542,9 @@
     serf_default_read_iovec,
     serf_default_read_for_sendfile,
     serf_buckets_are_v2,
-    serf_response_peek,
+    serf_response_peek /* ### TODO */,
     serf_response_destroy_and_data,
     serf_default_read_bucket,
-    NULL,
+    serf_default_get_remaining,
     serf_response_set_config,
 };
diff --git a/buckets/socket_buckets.c b/buckets/socket_buckets.c
index ec67246..db1de1a 100644
--- a/buckets/socket_buckets.c
+++ b/buckets/socket_buckets.c
@@ -119,6 +119,6 @@
     serf_socket_peek,
     serf_default_destroy_and_data,
     serf_default_read_bucket,
-    NULL,
+    serf_default_get_remaining,
     serf_default_ignore_config,
 };
diff --git a/buckets/ssl_buckets.c b/buckets/ssl_buckets.c
index 4a6c1d3..3349c11 100644
--- a/buckets/ssl_buckets.c
+++ b/buckets/ssl_buckets.c
@@ -2161,7 +2161,7 @@
     serf_ssl_peek,
     serf_ssl_encrypt_destroy_and_data,
     serf_default_read_bucket,
-    NULL,
+    serf_default_get_remaining,
     serf_ssl_set_config,
 };
 
@@ -2175,6 +2175,6 @@
     serf_ssl_peek,
     serf_ssl_decrypt_destroy_and_data,
     serf_default_read_bucket,
-    NULL,
+    serf_default_get_remaining,
     serf_ssl_set_config,
 };
diff --git a/serf_bucket_util.h b/serf_bucket_util.h
index b61f655..c28b0ec 100644
--- a/serf_bucket_util.h
+++ b/serf_bucket_util.h
@@ -103,6 +103,14 @@
     serf_bucket_t *bucket);
 
 /**
+ * Default implementation of the @see get_remaining functionality.
+ *
+ * This function will just return SERF_LENGTH_UNKNOWN.
+ */
+apr_uint64_t *serf_default_get_remaining(
+    serf_bucket_t *bucket);
+
+/**
  * Default implementation of the @see set_config functionality.
  *
  * This function will not do anything, it should be used in buckets
diff --git a/test/mock_sock_buckets.c b/test/mock_sock_buckets.c
index efca8e1..bc3698f 100644
--- a/test/mock_sock_buckets.c
+++ b/test/mock_sock_buckets.c
@@ -95,6 +95,6 @@
     serf_mock_sock_peek,
     serf_default_destroy_and_data,
     serf_default_read_bucket,
-    NULL,
+    serf_default_get_remaining,
     serf_mock_sock_set_config,
 };