Author: rhuijben Date: Mon Oct 12 13:27:21 2015 New Revision: 1708112 URL: http://svn.apache.org/viewvc?rev=1708112&view=rev Log: Merge the get-remaining branch back to trunk to add a few more testcases on v2 buckets.
Modified: serf/trunk/ (props changed) 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/file_buckets.c serf/trunk/buckets/limit_buckets.c serf/trunk/buckets/log_wrapper_buckets.c serf/trunk/buckets/mmap_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 serf/trunk/test/mock_sock_buckets.c serf/trunk/test/test_buckets.c Propchange: serf/trunk/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Mon Oct 12 13:27:21 2015 @@ -1,4 +1,5 @@ /serf/branches/copy-bucket:1699343-1699443 /serf/branches/fix-authn-errors:1699959-1700007 +/serf/branches/get-remaining:1701859-1708111 /serf/branches/multiple_ssl_impls:1699382 /serf/branches/windows-sspi:1698866-1698877 Modified: serf/trunk/buckets/aggregate_buckets.c URL: http://svn.apache.org/viewvc/serf/trunk/buckets/aggregate_buckets.c?rev=1708112&r1=1708111&r2=1708112&view=diff ============================================================================== --- serf/trunk/buckets/aggregate_buckets.c (original) +++ serf/trunk/buckets/aggregate_buckets.c Mon Oct 12 13:27:21 2015 @@ -492,6 +492,29 @@ static serf_bucket_t * serf_aggregate_re return serf_bucket_read_bucket(ctx->list->bucket, type); } +static apr_uint64_t serf_aggregate_get_remaining(serf_bucket_t *bucket) +{ + aggregate_context_t *ctx = bucket->data; + apr_uint64_t remaining = 0; + bucket_list_t *cur; + + if (ctx->hold_open) { + return SERF_LENGTH_UNKNOWN; + } + + for(cur = ctx->list; cur != NULL; cur = cur->next) { + apr_uint64_t bucket_remaining = serf_bucket_get_remaining(cur->bucket); + + if (bucket_remaining == SERF_LENGTH_UNKNOWN) { + return SERF_LENGTH_UNKNOWN; + } + + remaining += bucket_remaining; + } + + return remaining; +} + static apr_status_t serf_aggregate_set_config(serf_bucket_t *bucket, serf_config_t *config) { @@ -524,5 +547,6 @@ const serf_bucket_type_t serf_bucket_typ serf_aggregate_peek, serf_aggregate_destroy_and_data, serf_aggregate_read_bucket, + 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=1708112&r1=1708111&r2=1708112&view=diff ============================================================================== --- serf/trunk/buckets/barrier_buckets.c (original) +++ serf/trunk/buckets/barrier_buckets.c Mon Oct 12 13:27:21 2015 @@ -79,6 +79,13 @@ static void serf_barrier_destroy(serf_bu serf_default_destroy(bucket); } +static apr_uint64_t serf_barrier_get_remaining(serf_bucket_t *bucket) +{ + serf_bucket_t *stream = bucket->data; + + return serf_bucket_get_remaining(stream); +} + static apr_status_t serf_barrier_set_config(serf_bucket_t *bucket, serf_config_t *config) { @@ -99,5 +106,6 @@ const serf_bucket_type_t serf_bucket_typ serf_barrier_peek, serf_barrier_destroy, serf_default_read_bucket, + 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=1708112&r1=1708111&r2=1708112&view=diff ============================================================================== --- serf/trunk/buckets/buckets.c (original) +++ serf/trunk/buckets/buckets.c Mon Oct 12 13:27:21 2015 @@ -129,6 +129,10 @@ void serf_default_destroy_and_data(serf_ 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) Modified: serf/trunk/buckets/chunk_buckets.c URL: http://svn.apache.org/viewvc/serf/trunk/buckets/chunk_buckets.c?rev=1708112&r1=1708111&r2=1708112&view=diff ============================================================================== --- serf/trunk/buckets/chunk_buckets.c (original) +++ serf/trunk/buckets/chunk_buckets.c Mon Oct 12 13:27:21 2015 @@ -255,5 +255,6 @@ const serf_bucket_type_t serf_bucket_typ serf_chunk_peek, serf_chunk_destroy, serf_default_read_bucket, + 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=1708112&r1=1708111&r2=1708112&view=diff ============================================================================== --- serf/trunk/buckets/copy_buckets.c (original) +++ serf/trunk/buckets/copy_buckets.c Mon Oct 12 13:27:21 2015 @@ -198,5 +198,6 @@ const serf_bucket_type_t serf_bucket_typ serf_copy_peek, serf_copy_destroy, serf_copy_read_bucket, + serf_default_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=1708112&r1=1708111&r2=1708112&view=diff ============================================================================== --- serf/trunk/buckets/dechunk_buckets.c (original) +++ serf/trunk/buckets/dechunk_buckets.c Mon Oct 12 13:27:21 2015 @@ -205,12 +205,13 @@ static apr_status_t serf_dechunk_set_con 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, + 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=1708112&r1=1708111&r2=1708112&view=diff ============================================================================== --- serf/trunk/buckets/deflate_buckets.c (original) +++ serf/trunk/buckets/deflate_buckets.c Mon Oct 12 13:27:21 2015 @@ -451,12 +451,13 @@ static apr_status_t serf_deflate_set_con 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, + serf_default_get_remaining, serf_deflate_set_config, }; Modified: serf/trunk/buckets/file_buckets.c URL: http://svn.apache.org/viewvc/serf/trunk/buckets/file_buckets.c?rev=1708112&r1=1708111&r2=1708112&view=diff ============================================================================== --- serf/trunk/buckets/file_buckets.c (original) +++ serf/trunk/buckets/file_buckets.c Mon Oct 12 13:27:21 2015 @@ -27,6 +27,7 @@ typedef struct file_context_t { apr_file_t *file; serf_databuf_t databuf; + apr_uint64_t remaining; } file_context_t; @@ -45,11 +46,11 @@ serf_bucket_t *serf_bucket_file_create( { apr_status_t status; file_context_t *ctx; -#if APR_HAS_MMAP apr_finfo_t finfo; status = apr_file_info_get(&finfo, APR_FINFO_SIZE, file); +#if APR_HAS_MMAP /* See if we'd be better off mmap'ing this file instead. * * Note that there is a failure case here that we purposely fall through: @@ -77,6 +78,13 @@ serf_bucket_t *serf_bucket_file_create( ctx->databuf.read = file_reader; ctx->databuf.read_baton = ctx; + if (status == APR_SUCCESS) { + ctx->remaining = finfo.size; + } + else { + ctx->remaining = SERF_LENGTH_UNKNOWN; + } + return serf_bucket_create(&serf_bucket_type_file, allocator, ctx); } @@ -85,8 +93,21 @@ static apr_status_t serf_file_read(serf_ const char **data, apr_size_t *len) { file_context_t *ctx = bucket->data; + apr_status_t status; + + status = serf_databuf_read(&ctx->databuf, requested, data, len); + + if (SERF_BUCKET_READ_ERROR(status)) + { + return status; + } + + /* Update remaining length if known. */ + if (ctx->remaining != SERF_LENGTH_UNKNOWN) { + ctx->remaining -= *len; + } - return serf_databuf_read(&ctx->databuf, requested, data, len); + return status; } static apr_status_t serf_file_readline(serf_bucket_t *bucket, @@ -94,8 +115,22 @@ static apr_status_t serf_file_readline(s const char **data, apr_size_t *len) { file_context_t *ctx = bucket->data; + apr_status_t status; + + status = serf_databuf_readline(&ctx->databuf, acceptable, found, data, len); + + if (SERF_BUCKET_READ_ERROR(status)) + { + return status; + } + + /* Update remaining length if known. */ + if (ctx->remaining != SERF_LENGTH_UNKNOWN) { + ctx->remaining -= *len; + } + + return status; - return serf_databuf_readline(&ctx->databuf, acceptable, found, data, len); } static apr_status_t serf_file_peek(serf_bucket_t *bucket, @@ -107,6 +142,12 @@ static apr_status_t serf_file_peek(serf_ return serf_databuf_peek(&ctx->databuf, data, len); } +static apr_uint64_t serf_file_get_remaining(serf_bucket_t *bucket) +{ + file_context_t *ctx = bucket->data; + return ctx->remaining; +} + const serf_bucket_type_t serf_bucket_type_file = { "FILE", serf_file_read, @@ -117,5 +158,6 @@ const serf_bucket_type_t serf_bucket_typ serf_file_peek, serf_default_destroy_and_data, serf_default_read_bucket, + serf_file_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=1708112&r1=1708111&r2=1708112&view=diff ============================================================================== --- serf/trunk/buckets/limit_buckets.c (original) +++ serf/trunk/buckets/limit_buckets.c Mon Oct 12 13:27:21 2015 @@ -121,6 +121,13 @@ static void serf_limit_destroy(serf_buck serf_default_destroy_and_data(bucket); } +static apr_uint64_t serf_limit_get_remaining(serf_bucket_t *bucket) +{ + limit_context_t *ctx = bucket->data; + + return ctx->remaining; +} + static apr_status_t serf_limit_set_config(serf_bucket_t *bucket, serf_config_t *config) { @@ -141,5 +148,6 @@ const serf_bucket_type_t serf_bucket_typ serf_limit_peek, serf_limit_destroy, serf_default_read_bucket, + serf_limit_get_remaining, serf_limit_set_config, }; Modified: serf/trunk/buckets/log_wrapper_buckets.c URL: http://svn.apache.org/viewvc/serf/trunk/buckets/log_wrapper_buckets.c?rev=1708112&r1=1708111&r2=1708112&view=diff ============================================================================== --- serf/trunk/buckets/log_wrapper_buckets.c (original) +++ serf/trunk/buckets/log_wrapper_buckets.c Mon Oct 12 13:27:21 2015 @@ -161,6 +161,7 @@ serf_bucket_t *serf__bucket_log_wrapper_ bkt_type->read_for_sendfile = wrapped->type->read_for_sendfile; if (wrapped->type->read_bucket == serf_buckets_are_v2) { bkt_type->read_bucket_v2 = wrapped->type->read_bucket_v2; + bkt_type->get_remaining = wrapped->type->get_remaining; } /* Wrap these functions */ Modified: serf/trunk/buckets/mmap_buckets.c URL: http://svn.apache.org/viewvc/serf/trunk/buckets/mmap_buckets.c?rev=1708112&r1=1708111&r2=1708112&view=diff ============================================================================== --- serf/trunk/buckets/mmap_buckets.c (original) +++ serf/trunk/buckets/mmap_buckets.c Mon Oct 12 13:27:21 2015 @@ -118,6 +118,12 @@ static apr_status_t serf_mmap_peek(serf_ return APR_EOF; } +static apr_uint64_t serf_mmap_get_remaining(serf_bucket_t *bucket) +{ + mmap_context_t *ctx = bucket->data; + return ctx->remaining; +} + const serf_bucket_type_t serf_bucket_type_mmap = { "MMAP", serf_mmap_read, @@ -128,6 +134,7 @@ const serf_bucket_type_t serf_bucket_typ serf_mmap_peek, serf_default_destroy_and_data, serf_default_read_bucket, + serf_mmap_get_remaining, serf_default_ignore_config, }; @@ -144,6 +151,7 @@ const serf_bucket_type_t serf_bucket_typ NULL, NULL, NULL, + NULL, NULL, NULL, NULL, Modified: serf/trunk/buckets/request_buckets.c URL: http://svn.apache.org/viewvc/serf/trunk/buckets/request_buckets.c?rev=1708112&r1=1708111&r2=1708112&view=diff ============================================================================== --- serf/trunk/buckets/request_buckets.c (original) +++ serf/trunk/buckets/request_buckets.c Mon Oct 12 13:27:21 2015 @@ -245,6 +245,7 @@ const serf_bucket_type_t serf_bucket_typ serf_request_peek, serf_request_destroy, serf_default_read_bucket, + 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=1708112&r1=1708111&r2=1708112&view=diff ============================================================================== --- serf/trunk/buckets/response_body_buckets.c (original) +++ serf/trunk/buckets/response_body_buckets.c Mon Oct 12 13:27:21 2015 @@ -149,5 +149,6 @@ const serf_bucket_type_t serf_bucket_typ serf_response_body_peek, serf_response_body_destroy, serf_default_read_bucket, + serf_default_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=1708112&r1=1708111&r2=1708112&view=diff ============================================================================== --- serf/trunk/buckets/response_buckets.c (original) +++ serf/trunk/buckets/response_buckets.c Mon Oct 12 13:27:21 2015 @@ -542,8 +542,9 @@ const serf_bucket_type_t serf_bucket_typ 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, + 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=1708112&r1=1708111&r2=1708112&view=diff ============================================================================== --- serf/trunk/buckets/simple_buckets.c (original) +++ serf/trunk/buckets/simple_buckets.c Mon Oct 12 13:27:21 2015 @@ -153,6 +153,12 @@ static void serf_simple_destroy(serf_buc serf_default_destroy_and_data(bucket); } +static apr_uint64_t serf_simple_get_remaining(serf_bucket_t *bucket) +{ + simple_context_t *ctx = bucket->data; + return ctx->remaining; +} + const serf_bucket_type_t serf_bucket_type_simple = { "SIMPLE", serf_simple_read, @@ -163,5 +169,6 @@ const serf_bucket_type_t serf_bucket_typ serf_simple_peek, serf_simple_destroy, serf_default_read_bucket, + 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=1708112&r1=1708111&r2=1708112&view=diff ============================================================================== --- serf/trunk/buckets/socket_buckets.c (original) +++ serf/trunk/buckets/socket_buckets.c Mon Oct 12 13:27:21 2015 @@ -119,5 +119,6 @@ const serf_bucket_type_t serf_bucket_typ serf_socket_peek, serf_default_destroy_and_data, serf_default_read_bucket, + 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=1708112&r1=1708111&r2=1708112&view=diff ============================================================================== --- serf/trunk/buckets/ssl_buckets.c (original) +++ serf/trunk/buckets/ssl_buckets.c Mon Oct 12 13:27:21 2015 @@ -2161,6 +2161,7 @@ const serf_bucket_type_t serf_bucket_typ serf_ssl_peek, serf_ssl_encrypt_destroy_and_data, serf_default_read_bucket, + serf_default_get_remaining, serf_ssl_set_config, }; @@ -2174,5 +2175,6 @@ const serf_bucket_type_t serf_bucket_typ serf_ssl_peek, serf_ssl_decrypt_destroy_and_data, serf_default_read_bucket, + serf_default_get_remaining, serf_ssl_set_config, }; Modified: serf/trunk/serf.h URL: http://svn.apache.org/viewvc/serf/trunk/serf.h?rev=1708112&r1=1708111&r2=1708112&view=diff ============================================================================== --- serf/trunk/serf.h (original) +++ serf/trunk/serf.h Mon Oct 12 13:27:21 2015 @@ -779,6 +779,11 @@ serf_bucket_t *serf_request_bucket_reque */ #define SERF_NEWLINE_CRLF_SPLIT 0x0010 +/** Used to indicate that length of remaining data in bucket is unknown. See + * serf_bucket_type_t->get_remaining(). + */ +#define SERF_LENGTH_UNKNOWN ((apr_uint64_t) -1) + struct serf_bucket_type_t { /** name of this bucket type */ @@ -923,6 +928,13 @@ struct serf_bucket_type_t { serf_bucket_t * (*read_bucket_v2)(serf_bucket_t *bucket, const serf_bucket_type_t *type); + /* Returns length of remaining data to be read in @a bucket. Returns + * SERF_LENGTH_UNKNOWN if length is unknown. + * + * @since New in 1.4. + */ + apr_uint64_t (*get_remaining)(serf_bucket_t *bucket); + /* Provides a reference to a config object containing all configuration * values relevant for this bucket. * @@ -981,6 +993,10 @@ serf_bucket_t * serf_buckets_are_v2(serf #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_get_remaining(b) \ + ((b)->type->read_bucket == serf_buckets_are_v2 ? \ + (b)->type->get_remaining(b) : \ + SERF_LENGTH_UNKNOWN) #define serf_bucket_set_config(b,c) \ ((b)->type->read_bucket == serf_buckets_are_v2 ? \ (b)->type->set_config(b,c) : \ Modified: serf/trunk/serf_bucket_util.h URL: http://svn.apache.org/viewvc/serf/trunk/serf_bucket_util.h?rev=1708112&r1=1708111&r2=1708112&view=diff ============================================================================== --- serf/trunk/serf_bucket_util.h (original) +++ serf/trunk/serf_bucket_util.h Mon Oct 12 13:27:21 2015 @@ -103,6 +103,14 @@ void serf_default_destroy_and_data( 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 Modified: serf/trunk/test/mock_sock_buckets.c URL: http://svn.apache.org/viewvc/serf/trunk/test/mock_sock_buckets.c?rev=1708112&r1=1708111&r2=1708112&view=diff ============================================================================== --- serf/trunk/test/mock_sock_buckets.c (original) +++ serf/trunk/test/mock_sock_buckets.c Mon Oct 12 13:27:21 2015 @@ -95,5 +95,6 @@ const serf_bucket_type_t serf_bucket_typ serf_mock_sock_peek, serf_default_destroy_and_data, serf_default_read_bucket, + serf_default_get_remaining, serf_mock_sock_set_config, }; Modified: serf/trunk/test/test_buckets.c URL: http://svn.apache.org/viewvc/serf/trunk/test/test_buckets.c?rev=1708112&r1=1708111&r2=1708112&view=diff ============================================================================== --- serf/trunk/test/test_buckets.c (original) +++ serf/trunk/test/test_buckets.c Mon Oct 12 13:27:21 2015 @@ -606,6 +606,12 @@ static void test_aggregate_buckets(CuTes bkt = SERF_BUCKET_SIMPLE_STRING(BODY, alloc); serf_bucket_aggregate_append(aggbkt, bkt); + /* If you see result -1 in the next line, this is most likely caused by + not properly detecting v2 buckets via the magic function pointer. + Most likely you are seeing a linkage problem which causes seeing + different pointers for serf_buckets_are_v2() */ + CuAssertIntEquals(tc, 62, (int)serf_bucket_get_remaining(aggbkt)); + status = serf_bucket_read_iovec(aggbkt, 0, 32, tgt_vecs, &vecs_used); CuAssertIntEquals(tc, APR_SUCCESS, status); @@ -635,6 +641,8 @@ static void test_aggregate_buckets(CuTes bkt = SERF_BUCKET_SIMPLE_STRING_LEN(BODY+15, strlen(BODY)-15, alloc); serf_bucket_aggregate_append(aggbkt, bkt); + CuAssertTrue(tc, serf_bucket_get_remaining(aggbkt) == 62); + read_and_check_bucket(tc, aggbkt, BODY); /* Test 5: multiple child buckets prepended. */ @@ -645,6 +653,8 @@ static void test_aggregate_buckets(CuTes bkt = SERF_BUCKET_SIMPLE_STRING_LEN(BODY, 15, alloc); serf_bucket_aggregate_prepend(aggbkt, bkt); + CuAssertTrue(tc, serf_bucket_get_remaining(aggbkt) == 62); + read_and_check_bucket(tc, aggbkt, BODY); /* Test 6: ensure peek doesn't return APR_EAGAIN, or APR_EOF incorrectly. */