Author: rhuijben Date: Mon Oct 26 20:15:02 2015 New Revision: 1710686 URL: http://svn.apache.org/viewvc?rev=1710686&view=rev Log: Turn all the http2 related new bucket types and their functions into private types. No functional changes.
This patch breaks compilin http2_protocol.c. I'll fix that in a separate commit that does contain functional changes. * buckets/hpack_buckets.c (includes): Add http2_buckets.h. (serf_hpack_table_create): Rename to... (serf__hpack_table_create): ... this. (hpack_copy_from_headers, serf__bucket_hpack_create_from_request): Update caller. (serf_bucket_hpack_create): Rename to... (serf__bucket_hpack_create): ... this. (serf_bucket_hpack_setc): Rename to... serf__bucket_hpack_setc): ... this. Update caller (serf_bucket_hpack_setx): Rename to... (serf__bucket_hpack_setx): ... this. (serf_bucket_type_hpack): Rename to... (serf_bucket_type__hpack): ... this. (serf_bucket_hpack_decode_create): Rename to... (serf__bucket_hpack_decode_create): ... this. (serf_bucket_type_hpack_decode): Rename to... (serf_bucket_type__hpack_decode): ... this. * buckets/http2_frame_buckets.c (includes): Add http2_buckets.h. (serf_bucket_http2_unframe_create): Rename to... (serf__bucket_http2_unframe_create): ... this. (serf_bucket_http2_unframe_read_info): Rename to... (serf__bucket_http2_unframe_read_info): ... this. (*): Update caller. (serf_bucket_http2_unpad_create): Rename to... (serf__bucket_http2_unpad_create): ... this. (serf_bucket_type_http2_unpad): Rename to... (serf_bucket_type__http2_unpad): ... this. (serf_bucket_http2_frame_create): Rename to... (serf__bucket_http2_frame_create): ... this. (serf_bucket_type_http2_frame): Rename to... (serf_bucket_type__http2_frame): ... this. * protocols/http2_buckets.h New file, copied from serf_bucket_types.h. * serf_bucket_types.h Remove all http2 types and functions. * serf_private.h (serf_hpack_table_t): Add typedef. * test/test_buckets.c (includes): Add http2_buckets.h. (test_http2_unframe_buckets, test_http2_unpad_buckets, test_hpack_header_encode, test_http2_frame_bucket_basic): Update caller. Added: serf/trunk/protocols/http2_buckets.h - copied, changed from r1710678, serf/trunk/serf_bucket_types.h Modified: serf/trunk/buckets/hpack_buckets.c serf/trunk/buckets/http2_frame_buckets.c serf/trunk/serf_bucket_types.h serf/trunk/serf_private.h serf/trunk/test/test_buckets.c Modified: serf/trunk/buckets/hpack_buckets.c URL: http://svn.apache.org/viewvc/serf/trunk/buckets/hpack_buckets.c?rev=1710686&r1=1710685&r2=1710686&view=diff ============================================================================== --- serf/trunk/buckets/hpack_buckets.c (original) +++ serf/trunk/buckets/hpack_buckets.c Mon Oct 26 20:15:02 2015 @@ -25,6 +25,7 @@ #include "serf.h" #include "serf_bucket_util.h" #include "serf_private.h" +#include "protocols/http2_buckets.h" #include "hpack_huffman.inc" #define EOS_CHAR (256) @@ -372,9 +373,9 @@ static const apr_uint64_t hpack_static_t serf_hpack_table_t * -serf_hpack_table_create(int for_http2, - apr_size_t default_max_table_size, - apr_pool_t *result_pool) +serf__hpack_table_create(int for_http2, + apr_size_t default_max_table_size, + apr_pool_t *result_pool) { serf_hpack_table_t *tbl = apr_pcalloc(result_pool, sizeof(*tbl)); @@ -470,7 +471,7 @@ hpack_copy_from_headers(void *baton, return APR_SUCCESS; } - serf_bucket_hpack_setc(hpack, key, value); + serf__bucket_hpack_setc(hpack, key, value); return APR_SUCCESS; } @@ -485,7 +486,7 @@ serf__bucket_hpack_create_from_request(s { const char *uri, *method, *host; - serf_bucket_t *hpack = serf_bucket_hpack_create(hpack_table, allocator); + serf_bucket_t *hpack = serf__bucket_hpack_create(hpack_table, allocator); serf_bucket_t *headers = serf_bucket_request_get_headers(request); @@ -493,10 +494,10 @@ serf__bucket_hpack_create_from_request(s serf__bucket_request_read(request, NULL, &uri, &method); - serf_bucket_hpack_setc(hpack, ":method", method); - serf_bucket_hpack_setc(hpack, ":scheme", scheme); - serf_bucket_hpack_setc(hpack, ":authority", host); - serf_bucket_hpack_setc(hpack, ":path", uri); + serf__bucket_hpack_setc(hpack, ":method", method); + serf__bucket_hpack_setc(hpack, ":scheme", scheme); + serf__bucket_hpack_setc(hpack, ":authority", host); + serf__bucket_hpack_setc(hpack, ":path", uri); serf_bucket_headers_do(headers, hpack_copy_from_headers, hpack); @@ -507,8 +508,8 @@ serf__bucket_hpack_create_from_request(s serf_bucket_t * -serf_bucket_hpack_create(serf_hpack_table_t *hpack_table, - serf_bucket_alloc_t *allocator) +serf__bucket_hpack_create(serf_hpack_table_t *hpack_table, + serf_bucket_alloc_t *allocator) { serf_hpack_context_t *ctx = serf_bucket_mem_alloc(allocator, sizeof(*ctx)); @@ -516,25 +517,27 @@ serf_bucket_hpack_create(serf_hpack_tabl ctx->tbl = hpack_table; ctx->first = ctx->last = NULL; - return serf_bucket_create(&serf_bucket_type_hpack, allocator, ctx); + return serf_bucket_create(&serf_bucket_type__hpack, allocator, ctx); } -void serf_bucket_hpack_setc(serf_bucket_t *hpack_bucket, - const char *key, - const char *value) +void +serf__bucket_hpack_setc(serf_bucket_t *hpack_bucket, + const char *key, + const char *value) { - serf_bucket_hpack_setx(hpack_bucket, - key, strlen(key), TRUE, - value, strlen(value), TRUE); + serf__bucket_hpack_setx(hpack_bucket, + key, strlen(key), TRUE, + value, strlen(value), TRUE); } -void serf_bucket_hpack_setx(serf_bucket_t *hpack_bucket, - const char *key, - apr_size_t key_size, - int key_copy, - const char *value, - apr_size_t value_size, - int value_copy) +void +serf__bucket_hpack_setx(serf_bucket_t *hpack_bucket, + const char *key, + apr_size_t key_size, + int key_copy, + const char *value, + apr_size_t value_size, + int value_copy) { serf_hpack_context_t *ctx = hpack_bucket->data; serf_hpack_entry_t *entry; @@ -820,7 +823,7 @@ serf_hpack_destroy_and_data(serf_bucket_ /* ### need to implement */ #define serf_hpack_readline NULL -const serf_bucket_type_t serf_bucket_type_hpack = { +const serf_bucket_type_t serf_bucket_type__hpack = { "HPACK", serf_hpack_read, serf_hpack_readline, @@ -889,17 +892,17 @@ hpack_decode_databuf_reader(void *baton, apr_size_t *len); serf_bucket_t * -serf_bucket_hpack_decode_create(serf_bucket_t *stream, - apr_status_t (*item_callback)( +serf__bucket_hpack_decode_create(serf_bucket_t *stream, + apr_status_t (*item_callback)( void *baton, const char *key, apr_size_t key_size, const char *value, apr_size_t value_size), - void *item_baton, - apr_size_t max_entry_size, - serf_hpack_table_t *hpack_table, - serf_bucket_alloc_t *alloc) + void *item_baton, + apr_size_t max_entry_size, + serf_hpack_table_t *hpack_table, + serf_bucket_alloc_t *alloc) { serf_hpack_decode_ctx_t *ctx = serf_bucket_mem_calloc(alloc, sizeof(*ctx)); @@ -933,7 +936,7 @@ serf_bucket_hpack_decode_create(serf_buc ctx->tbl->rl_start = ctx->tbl->rl_first; ctx->tbl->rl_indexable = ctx->tbl->rl_count; - return serf_bucket_create(&serf_bucket_type_hpack_decode, alloc, ctx); + return serf_bucket_create(&serf_bucket_type__hpack_decode, alloc, ctx); } static apr_status_t @@ -1558,7 +1561,7 @@ serf_hpack_decode_destroy(serf_bucket_t serf_default_destroy_and_data(bucket); } -const serf_bucket_type_t serf_bucket_type_hpack_decode = { +const serf_bucket_type_t serf_bucket_type__hpack_decode = { "HPACK-DECODE", serf_hpack_decode_read, serf_hpack_decode_readline, @@ -1567,4 +1570,4 @@ const serf_bucket_type_t serf_bucket_typ serf_default_read_bucket, serf_hpack_decode_peek, serf_hpack_decode_destroy -}; \ No newline at end of file +}; Modified: serf/trunk/buckets/http2_frame_buckets.c URL: http://svn.apache.org/viewvc/serf/trunk/buckets/http2_frame_buckets.c?rev=1710686&r1=1710685&r2=1710686&view=diff ============================================================================== --- serf/trunk/buckets/http2_frame_buckets.c (original) +++ serf/trunk/buckets/http2_frame_buckets.c Mon Oct 26 20:15:02 2015 @@ -26,6 +26,8 @@ #include "serf_bucket_util.h" #include "serf_private.h" +#include "protocols/http2_buckets.h" + /* https://tools.ietf.org/html/rfc7540#section-4.1 */ #define FRAME_PREFIX_SIZE 9 @@ -47,10 +49,10 @@ typedef struct http2_unframe_context_t } http2_unframe_context_t; serf_bucket_t * -serf_bucket_http2_unframe_create(serf_bucket_t *stream, - int destroy_stream, - apr_size_t max_payload_size, - serf_bucket_alloc_t *allocator) +serf__bucket_http2_unframe_create(serf_bucket_t *stream, + int destroy_stream, + apr_size_t max_payload_size, + serf_bucket_alloc_t *allocator) { http2_unframe_context_t *ctx; @@ -60,14 +62,14 @@ serf_bucket_http2_unframe_create(serf_bu ctx->prefix_remaining = sizeof(ctx->prefix_buffer); ctx->destroy_stream = (destroy_stream != 0); - return serf_bucket_create(&serf_bucket_type_http2_unframe, allocator, ctx); + return serf_bucket_create(&serf_bucket_type__http2_unframe, allocator, ctx); } apr_status_t -serf_bucket_http2_unframe_read_info(serf_bucket_t *bucket, - apr_int32_t *stream_id, - unsigned char *frame_type, - unsigned char *flags) +serf__bucket_http2_unframe_read_info(serf_bucket_t *bucket, + apr_int32_t *stream_id, + unsigned char *frame_type, + unsigned char *flags) { http2_unframe_context_t *ctx = bucket->data; const char *data; @@ -110,8 +112,8 @@ serf_bucket_http2_unframe_read_info(serf ctx->payload_remaining = payload_length; /* Use recursion to fill output arguments if necessary */ - serf_bucket_http2_unframe_read_info(bucket, stream_id, frame_type, - flags); + serf__bucket_http2_unframe_read_info(bucket, stream_id, frame_type, + flags); /* https://tools.ietf.org/html/rfc7540#section-4.2 An endpoint MUST send an error code of FRAME_SIZE_ERROR if a frame @@ -138,7 +140,7 @@ serf_http2_unframe_read(serf_bucket_t *b http2_unframe_context_t *ctx = bucket->data; apr_status_t status; - status = serf_bucket_http2_unframe_read_info(bucket, NULL, NULL, NULL); + status = serf__bucket_http2_unframe_read_info(bucket, NULL, NULL, NULL); if (status) { @@ -177,7 +179,7 @@ serf_http2_unframe_read_iovec(serf_bucke http2_unframe_context_t *ctx = bucket->data; apr_status_t status; - status = serf_bucket_http2_unframe_read_info(bucket, NULL, NULL, NULL); + status = serf__bucket_http2_unframe_read_info(bucket, NULL, NULL, NULL); if (status) { @@ -221,7 +223,7 @@ serf_http2_unframe_peek(serf_bucket_t *b http2_unframe_context_t *ctx = bucket->data; apr_status_t status; - status = serf_bucket_http2_unframe_read_info(bucket, NULL, NULL, NULL); + status = serf__bucket_http2_unframe_read_info(bucket, NULL, NULL, NULL); if (status) { @@ -256,7 +258,7 @@ serf_http2_unframe_get_remaining(serf_bu http2_unframe_context_t *ctx = bucket->data; apr_status_t status; - status = serf_bucket_http2_unframe_read_info(bucket, NULL, NULL, NULL); + status = serf__bucket_http2_unframe_read_info(bucket, NULL, NULL, NULL); if (status) return SERF_LENGTH_UNKNOWN; @@ -267,7 +269,7 @@ serf_http2_unframe_get_remaining(serf_bu /* ### need to implement */ #define serf_http2_unframe_readline NULL -const serf_bucket_type_t serf_bucket_type_http2_unframe = { +const serf_bucket_type_t serf_bucket_type__http2_unframe = { "H2-UNFRAME", serf_http2_unframe_read, serf_http2_unframe_readline /* ### TODO */, @@ -292,9 +294,9 @@ typedef struct http2_unpad_context_t } http2_unpad_context_t; serf_bucket_t * -serf_bucket_http2_unpad_create(serf_bucket_t *stream, - int destroy_stream, - serf_bucket_alloc_t *allocator) +serf__bucket_http2_unpad_create(serf_bucket_t *stream, + int destroy_stream, + serf_bucket_alloc_t *allocator) { http2_unpad_context_t *ctx; @@ -303,7 +305,7 @@ serf_bucket_http2_unpad_create(serf_buck ctx->padsize_read = FALSE; ctx->destroy_stream = destroy_stream; - return serf_bucket_create(&serf_bucket_type_http2_unpad, allocator, ctx); + return serf_bucket_create(&serf_bucket_type__http2_unpad, allocator, ctx); } static apr_status_t @@ -509,7 +511,7 @@ serf_http2_unpad_get_remaining(serf_buck /* ### need to implement */ #define serf_h2_dechunk_readline NULL -const serf_bucket_type_t serf_bucket_type_http2_unpad = { +const serf_bucket_type_t serf_bucket_type__http2_unpad = { "H2-UNPAD", serf_http2_unpad_read, serf_h2_dechunk_readline /* ### TODO */, @@ -554,23 +556,23 @@ typedef struct serf_http2_frame_context_ } serf_http2_frame_context_t; serf_bucket_t * -serf_bucket_http2_frame_create(serf_bucket_t *stream, - unsigned char frame_type, - unsigned char flags, - apr_int32_t *stream_id, - void (*stream_id_alloc)( - void *baton, - apr_int32_t *stream_id), - void *stream_id_baton, - apr_size_t max_payload_size, - apr_int32_t (*alloc_window)( - void *baton, - unsigned char frametype, - apr_int32_t stream_id, - apr_size_t requested, - int peek), - void *alloc_window_baton, - serf_bucket_alloc_t *alloc) +serf__bucket_http2_frame_create(serf_bucket_t *stream, + unsigned char frame_type, + unsigned char flags, + apr_int32_t *stream_id, + void (*stream_id_alloc)( + void *baton, + apr_int32_t *stream_id), + void *stream_id_baton, + apr_size_t max_payload_size, + apr_int32_t (*alloc_window)( + void *baton, + unsigned char frametype, + apr_int32_t stream_id, + apr_size_t requested, + int peek), + void *alloc_window_baton, + serf_bucket_alloc_t *alloc) { serf_http2_frame_context_t *ctx = serf_bucket_mem_alloc(alloc, sizeof(*ctx)); @@ -612,7 +614,7 @@ serf_bucket_http2_frame_create(serf_buck ctx->end_of_stream = ctx->end_of_headers = ctx->created_frame = FALSE; - return serf_bucket_create(&serf_bucket_type_http2_frame, alloc, ctx); + return serf_bucket_create(&serf_bucket_type__http2_frame, alloc, ctx); } @@ -770,7 +772,7 @@ serf_http2_frame_destroy(serf_bucket_t * /* ### need to implement */ #define serf_http2_frame_readline NULL -const serf_bucket_type_t serf_bucket_type_http2_frame = { +const serf_bucket_type_t serf_bucket_type__http2_frame = { "H2-FRAME", serf_http2_frame_read, serf_http2_frame_readline, Copied: serf/trunk/protocols/http2_buckets.h (from r1710678, serf/trunk/serf_bucket_types.h) URL: http://svn.apache.org/viewvc/serf/trunk/protocols/http2_buckets.h?p2=serf/trunk/protocols/http2_buckets.h&p1=serf/trunk/serf_bucket_types.h&r1=1710678&r2=1710686&rev=1710686&view=diff ============================================================================== --- serf/trunk/serf_bucket_types.h (original) +++ serf/trunk/protocols/http2_buckets.h Mon Oct 26 20:15:02 2015 @@ -18,17 +18,10 @@ * ==================================================================== */ -#ifndef SERF_BUCKET_TYPES_H -#define SERF_BUCKET_TYPES_H - -#include <apr_mmap.h> -#include <apr_hash.h> - -/* this header and serf.h refer to each other, so take a little extra care */ -#ifndef SERF_H -#include "serf.h" -#endif +#ifndef SERF_PROTOCOL_HTTP2_BUCKETS_H +#define SERF_PROTOCOL_HTTP2_BUCKETS_H +#include "serf_bucket_types.h" /** * @file serf_bucket_types.h @@ -42,728 +35,14 @@ extern "C" { /* ==================================================================== */ - -extern const serf_bucket_type_t serf_bucket_type_request; -#define SERF_BUCKET_IS_REQUEST(b) SERF_BUCKET_CHECK((b), request) - -serf_bucket_t *serf_bucket_request_create( - const char *method, - const char *URI, - serf_bucket_t *body, - serf_bucket_alloc_t *allocator); - -/* Send a Content-Length header with @a len. The @a body bucket should - contain precisely that much data. */ -void serf_bucket_request_set_CL( - serf_bucket_t *bucket, - apr_int64_t len); - -serf_bucket_t *serf_bucket_request_get_headers( - serf_bucket_t *request); - -/** Transform @a bucket in-place into a request bucket. - * - * It is callers responsibility to free resources held by the original - * bucket */ -void serf_bucket_request_become( - serf_bucket_t *bucket, - const char *method, - const char *uri, - serf_bucket_t *body); - -/** - * Sets the root url of the remote host. If this request contains a relative - * url, it will be prefixed with the root url to form an absolute url. - * @a bucket is the request bucket. @a root_url is the absolute url of the - * root of the remote host, without the closing '/'. - */ -void serf_bucket_request_set_root( - serf_bucket_t *bucket, - const char *root_url); - -/* ==================================================================== */ - - -extern const serf_bucket_type_t serf_bucket_type_response; -#define SERF_BUCKET_IS_RESPONSE(b) SERF_BUCKET_CHECK((b), response) - -serf_bucket_t *serf_bucket_response_create( - serf_bucket_t *stream, - serf_bucket_alloc_t *allocator); - -#define SERF_HTTP_VERSION(major, minor) ((major) * 1000 + (minor)) -#define SERF_HTTP_11 SERF_HTTP_VERSION(1, 1) -#define SERF_HTTP_10 SERF_HTTP_VERSION(1, 0) -#define SERF_HTTP_VERSION_MAJOR(shv) ((int)shv / 1000) -#define SERF_HTTP_VERSION_MINOR(shv) ((int)shv % 1000) - -typedef struct serf_status_line { - int version; - int code; - const char *reason; -} serf_status_line; - -/** - * Return the Status-Line information, if available. This function - * works like other bucket read functions: it may return APR_EAGAIN or - * APR_EOF to signal the state of the bucket for reading. A return - * value of APR_SUCCESS will always indicate that status line - * information was returned; for other return values the caller must - * check the version field in @a sline. A value of 0 means that the - * data is not (yet) present. - */ -apr_status_t serf_bucket_response_status( - serf_bucket_t *bkt, - serf_status_line *sline); - -/** - * Wait for the HTTP headers to be processed for a @a response. - * - * If the headers are available, APR_SUCCESS is returned. - * If the headers aren't available, APR_EAGAIN is returned. - */ -apr_status_t serf_bucket_response_wait_for_headers( - serf_bucket_t *response); - -/** - * Get the headers bucket for @a response. - */ -serf_bucket_t *serf_bucket_response_get_headers( - serf_bucket_t *response); - -/** - * Advise the response @a bucket that this was from a HEAD request and - * that it should not expect to see a response body. - */ -void serf_bucket_response_set_head( - serf_bucket_t *bucket); - -/* ==================================================================== */ - -extern const serf_bucket_type_t serf_bucket_type_response_body; -#define SERF_BUCKET_IS_RESPONSE_BODY(b) SERF_BUCKET_CHECK((b), response_body) - -serf_bucket_t *serf_bucket_response_body_create( - serf_bucket_t *stream, - apr_uint64_t limit, - serf_bucket_alloc_t *allocator); - -/* ==================================================================== */ - -extern const serf_bucket_type_t serf_bucket_type_bwtp_frame; -#define SERF_BUCKET_IS_BWTP_FRAME(b) SERF_BUCKET_CHECK((b), bwtp_frame) - -extern const serf_bucket_type_t serf_bucket_type_bwtp_incoming_frame; -#define SERF_BUCKET_IS_BWTP_INCOMING_FRAME(b) SERF_BUCKET_CHECK((b), bwtp_incoming_frame) - -int serf_bucket_bwtp_frame_get_channel( - serf_bucket_t *hdr); - -int serf_bucket_bwtp_frame_get_type( - serf_bucket_t *hdr); - -const char *serf_bucket_bwtp_frame_get_phrase( - serf_bucket_t *hdr); - -serf_bucket_t *serf_bucket_bwtp_frame_get_headers( - serf_bucket_t *hdr); - -serf_bucket_t *serf_bucket_bwtp_channel_open( - int channel, - const char *URI, - serf_bucket_alloc_t *allocator); - -serf_bucket_t *serf_bucket_bwtp_channel_close( - int channel, - serf_bucket_alloc_t *allocator); - -serf_bucket_t *serf_bucket_bwtp_header_create( - int channel, - const char *phrase, - serf_bucket_alloc_t *allocator); - -serf_bucket_t *serf_bucket_bwtp_message_create( - int channel, - serf_bucket_t *body, - serf_bucket_alloc_t *allocator); - -serf_bucket_t *serf_bucket_bwtp_incoming_frame_create( - serf_bucket_t *bkt, - serf_bucket_alloc_t *allocator); - -apr_status_t serf_bucket_bwtp_incoming_frame_wait_for_headers( - serf_bucket_t *bkt); - -/* ==================================================================== */ - - -extern const serf_bucket_type_t serf_bucket_type_aggregate; -#define SERF_BUCKET_IS_AGGREGATE(b) SERF_BUCKET_CHECK((b), aggregate) - -typedef apr_status_t (*serf_bucket_aggregate_eof_t)( - void *baton, - serf_bucket_t *aggregate_bucket); - -/** serf_bucket_aggregate_cleanup will instantly destroy all buckets in - the aggregate bucket that have been read completely. Whereas normally, - these buckets are destroyed on every read operation. */ -void serf_bucket_aggregate_cleanup( - serf_bucket_t *bucket, - serf_bucket_alloc_t *allocator); - -serf_bucket_t *serf_bucket_aggregate_create( - serf_bucket_alloc_t *allocator); - -/* Creates a stream bucket. - A stream bucket is like an aggregate bucket, but: - - it doesn't destroy its child buckets on cleanup - - one can always keep adding child buckets, the handler FN should return - APR_EOF when no more buckets will be added. - - Note: keep this factory function internal for now. If it turns out this - bucket type is useful outside serf, we should make it an actual separate - type. - */ -serf_bucket_t *serf__bucket_stream_create( - serf_bucket_alloc_t *allocator, - serf_bucket_aggregate_eof_t fn, - void *baton); - -/** Transform @a bucket in-place into an aggregate bucket. - * - * It is callers responsibility to free resources held by the original - * bucket */ -void serf_bucket_aggregate_become( - serf_bucket_t *bucket); - -void serf_bucket_aggregate_prepend( - serf_bucket_t *aggregate_bucket, - serf_bucket_t *prepend_bucket); - -void serf_bucket_aggregate_append( - serf_bucket_t *aggregate_bucket, - serf_bucket_t *append_bucket); - -void serf_bucket_aggregate_hold_open( - serf_bucket_t *aggregate_bucket, - serf_bucket_aggregate_eof_t fn, - void *baton); - -void serf_bucket_aggregate_prepend_iovec( - serf_bucket_t *aggregate_bucket, - struct iovec *vecs, - int vecs_count); - -void serf_bucket_aggregate_append_iovec( - serf_bucket_t *aggregate_bucket, - struct iovec *vecs, - int vecs_count); - -/* ==================================================================== */ - - -extern const serf_bucket_type_t serf_bucket_type_file; -#define SERF_BUCKET_IS_FILE(b) SERF_BUCKET_CHECK((b), file) - -serf_bucket_t *serf_bucket_file_create( - apr_file_t *file, - serf_bucket_alloc_t *allocator); - - -/* ==================================================================== */ - - -extern const serf_bucket_type_t serf_bucket_type_socket; -#define SERF_BUCKET_IS_SOCKET(b) SERF_BUCKET_CHECK((b), socket) - -serf_bucket_t *serf_bucket_socket_create( - apr_socket_t *skt, - serf_bucket_alloc_t *allocator); - -/** - * Call @a progress_func every time bytes are read from the socket, pass - * the number of bytes read. - * - * When using serf's bytes read & written progress indicator, pass - * @a serf_context_progress_delta for progress_func and the serf_context for - * progress_baton. - */ -void serf_bucket_socket_set_read_progress_cb( - serf_bucket_t *bucket, - const serf_progress_t progress_func, - void *progress_baton); - -/* ==================================================================== */ - - -extern const serf_bucket_type_t serf_bucket_type_simple; -#define SERF_BUCKET_IS_SIMPLE(b) SERF_BUCKET_CHECK((b), simple) - -typedef void (*serf_simple_freefunc_t)( - void *baton, - const char *data); - -serf_bucket_t *serf_bucket_simple_create( - const char *data, - apr_size_t len, - serf_simple_freefunc_t freefunc, - void *freefunc_baton, - serf_bucket_alloc_t *allocator); - -/** - * Equivalent to serf_bucket_simple_create, except that the bucket takes - * ownership of a private copy of the data. - */ -serf_bucket_t *serf_bucket_simple_copy_create( - const char *data, - apr_size_t len, - serf_bucket_alloc_t *allocator); - -/** - * Equivalent to serf_bucket_simple_create, except that the bucket assumes - * responsibility for freeing the data on this allocator without making - * a copy. It is assumed that data was created by a call from allocator. - */ -serf_bucket_t *serf_bucket_simple_own_create( - const char *data, - apr_size_t len, - serf_bucket_alloc_t *allocator); - -#define SERF_BUCKET_SIMPLE_STRING(s,a) \ - serf_bucket_simple_create(s, strlen(s), NULL, NULL, a); - -#define SERF_BUCKET_SIMPLE_STRING_LEN(s,l,a) \ - serf_bucket_simple_create(s, l, NULL, NULL, a); - -/* ==================================================================== */ - - -/* Note: apr_mmap_t is always defined, but if APR doesn't have mmaps, then - the caller can never create an apr_mmap_t to pass to this function. */ - -extern const serf_bucket_type_t serf_bucket_type_mmap; -#define SERF_BUCKET_IS_MMAP(b) SERF_BUCKET_CHECK((b), mmap) - -serf_bucket_t *serf_bucket_mmap_create( - apr_mmap_t *mmap, - serf_bucket_alloc_t *allocator); - - -/* ==================================================================== */ - - -extern const serf_bucket_type_t serf_bucket_type_headers; -#define SERF_BUCKET_IS_HEADERS(b) SERF_BUCKET_CHECK((b), headers) - -serf_bucket_t *serf_bucket_headers_create( - serf_bucket_alloc_t *allocator); - -/** - * Set, default: value copied. - * - * Set the specified @a header within the bucket, copying the @a value - * into space from this bucket's allocator. The header is NOT copied, - * so it should remain in scope at least as long as the bucket. - */ -void serf_bucket_headers_set( - serf_bucket_t *headers_bucket, - const char *header, - const char *value); - -/** - * Set, copies: header and value copied. - * - * Copy the specified @a header and @a value into the bucket, using space - * from this bucket's allocator. - */ -void serf_bucket_headers_setc( - serf_bucket_t *headers_bucket, - const char *header, - const char *value); - -/** - * Set, no copies. - * - * Set the specified @a header and @a value into the bucket, without - * copying either attribute. Both attributes should remain in scope at - * least as long as the bucket. - * - * @note In the case where a header already exists this will result - * in a reallocation and copy, @see serf_bucket_headers_setn. - */ -void serf_bucket_headers_setn( - serf_bucket_t *headers_bucket, - const char *header, - const char *value); - -/** - * Set, extended: fine grained copy control of header and value. - * - * Set the specified @a header, with length @a header_size with the - * @a value, and length @a value_size, into the bucket. The header will - * be copied if @a header_copy is set, and the value is copied if - * @a value_copy is set. If the values are not copied, then they should - * remain in scope at least as long as the bucket. - * - * If @a headers_bucket already contains a header with the same name - * as @a header, then append @a value to the existing value, - * separating with a comma (as per RFC 2616, section 4.2). In this - * case, the new value must be allocated and the header re-used, so - * behave as if @a value_copy were true and @a header_copy false. - */ -void serf_bucket_headers_setx( - serf_bucket_t *headers_bucket, - const char *header, - apr_size_t header_size, - int header_copy, - const char *value, - apr_size_t value_size, - int value_copy); - -const char *serf_bucket_headers_get( - serf_bucket_t *headers_bucket, - const char *header); - -/** - * @param baton opaque baton as passed to @see serf_bucket_headers_do - * @param key The header key from this iteration through the table - * @param value The header value from this iteration through the table - */ -typedef int (serf_bucket_headers_do_callback_fn_t)( - void *baton, - const char *key, - const char *value); - -/** - * Iterates over all headers of the message and invokes the callback - * function with header key and value. Stop iterating when no more - * headers are available or when the callback function returned a - * non-0 value. - * - * @param headers_bucket headers to iterate over - * @param func callback routine to invoke for every header in the bucket - * @param baton baton to pass on each invocation to func - */ -void serf_bucket_headers_do( - serf_bucket_t *headers_bucket, - serf_bucket_headers_do_callback_fn_t func, - void *baton); - - -/* ==================================================================== */ - - -extern const serf_bucket_type_t serf_bucket_type_chunk; -#define SERF_BUCKET_IS_CHUNK(b) SERF_BUCKET_CHECK((b), chunk) - -serf_bucket_t *serf_bucket_chunk_create( - serf_bucket_t *stream, - serf_bucket_alloc_t *allocator); - - -/* ==================================================================== */ - - -extern const serf_bucket_type_t serf_bucket_type_dechunk; -#define SERF_BUCKET_IS_DECHUNK(b) SERF_BUCKET_CHECK((b), dechunk) - -serf_bucket_t *serf_bucket_dechunk_create( - serf_bucket_t *stream, - serf_bucket_alloc_t *allocator); - - -/* ==================================================================== */ - - -extern const serf_bucket_type_t serf_bucket_type_deflate; -#define SERF_BUCKET_IS_DEFLATE(b) SERF_BUCKET_CHECK((b), deflate) - -#define SERF_DEFLATE_GZIP 0 -#define SERF_DEFLATE_DEFLATE 1 - -serf_bucket_t *serf_bucket_deflate_create( - serf_bucket_t *stream, - serf_bucket_alloc_t *allocator, - int format); - - -/* ==================================================================== */ - - -extern const serf_bucket_type_t serf_bucket_type_limit; -#define SERF_BUCKET_IS_LIMIT(b) SERF_BUCKET_CHECK((b), limit) - -serf_bucket_t *serf_bucket_limit_create( - serf_bucket_t *stream, - apr_uint64_t limit, - serf_bucket_alloc_t *allocator); - - -/* ==================================================================== */ -#define SERF_SSL_CERT_NOTYETVALID 0x0001 -#define SERF_SSL_CERT_EXPIRED 0x0002 -#define SERF_SSL_CERT_UNKNOWNCA 0x0004 -#define SERF_SSL_CERT_SELF_SIGNED 0x0008 -#define SERF_SSL_CERT_UNKNOWN_FAILURE 0x0010 -#define SERF_SSL_CERT_REVOKED 0x0020 -#define SERF_SSL_CERT_UNABLE_TO_GET_CRL 0x0040 -#define SERF_SSL_CERT_INVALID_HOST 0x0080 - -#define SERF_SSL_OCSP_RESPONDER_TRYLATER 0x0100 -#define SERF_SSL_OCSP_RESPONDER_ERROR 0x0200 -#define SERF_SSL_OCSP_RESPONDER_UNKNOWN_FAILURE 0x0400 - -extern const serf_bucket_type_t serf_bucket_type_ssl_encrypt; -#define SERF_BUCKET_IS_SSL_ENCRYPT(b) SERF_BUCKET_CHECK((b), ssl_encrypt) - -typedef struct serf_ssl_context_t serf_ssl_context_t; -typedef struct serf_ssl_certificate_t serf_ssl_certificate_t; - -typedef apr_status_t (*serf_ssl_need_client_cert_t)( - void *data, - const char **cert_path); - -typedef apr_status_t (*serf_ssl_need_cert_password_t)( - void *data, - const char *cert_path, - const char **password); - -/* Callback type for server certificate status info and OCSP responses. - Note that CERT can be NULL in case its called from the OCSP callback. */ -typedef apr_status_t (*serf_ssl_need_server_cert_t)( - void *data, - int failures, - const serf_ssl_certificate_t *cert); - -typedef apr_status_t (*serf_ssl_server_cert_chain_cb_t)( - void *data, - int failures, - int error_depth, - const serf_ssl_certificate_t * const * certs, - apr_size_t certs_len); - -void serf_ssl_client_cert_provider_set( - serf_ssl_context_t *context, - serf_ssl_need_client_cert_t callback, - void *data, - void *cache_pool); - -void serf_ssl_client_cert_password_set( - serf_ssl_context_t *context, - serf_ssl_need_cert_password_t callback, - void *data, - void *cache_pool); - -/** - * Set a callback to override the default SSL server certificate validation - * algorithm. - */ -void serf_ssl_server_cert_callback_set( - serf_ssl_context_t *context, - serf_ssl_need_server_cert_t callback, - void *data); - -/** - * Set callbacks to override the default SSL server certificate validation - * algorithm for the current certificate or the entire certificate chain. - */ -void serf_ssl_server_cert_chain_callback_set( - serf_ssl_context_t *context, - serf_ssl_need_server_cert_t cert_callback, - serf_ssl_server_cert_chain_cb_t cert_chain_callback, - void *data); - -/** - * Use the default root CA certificates as included with the OpenSSL library. - */ -apr_status_t serf_ssl_use_default_certificates( - serf_ssl_context_t *context); - -/** - * Allow SNI indicators to be sent to the server. - */ -apr_status_t serf_ssl_set_hostname( - serf_ssl_context_t *context, const char *hostname); - - -typedef apr_status_t (*serf_ssl_protocol_result_cb_t)( - void *data, - const char *protocol); - -/** - * Enables ALPN negotiation with the server. Setups that the supported protocols - * will be sent to the server, and enables handling the response via a callback. - * - * SUPPORTED_PROTOCOLS is a comma separated list of protocols. No whitespace - * should be added as the values are used literally. E.g. "h2,http/1.1,h2-16" - * - * Returns APR_ENOTIMPL when the ssl library doesn't implement ALPN. - * - * If successfull CALLBACK will be called as soon as the protocol is negotiated - * or directly after the secured stream is connected. - * - * @since New in 1.4. - */ -apr_status_t serf_ssl_negotiate_protocol( - serf_ssl_context_t *context, - const char *protocols, - serf_ssl_protocol_result_cb_t callback, - void *callback_data); - -/** - * Return the depth of the certificate. - */ -int serf_ssl_cert_depth( - const serf_ssl_certificate_t *cert); - -/** - * Extract the fields of the issuer in a table with keys (E, CN, OU, O, L, - * ST and C). The returned table will be allocated in @a pool. - */ -apr_hash_t *serf_ssl_cert_issuer( - const serf_ssl_certificate_t *cert, - apr_pool_t *pool); - -/** - * Extract the fields of the subject in a table with keys (E, CN, OU, O, L, - * ST and C). The returned table will be allocated in @a pool. - */ -apr_hash_t *serf_ssl_cert_subject( - const serf_ssl_certificate_t *cert, - apr_pool_t *pool); - -/** - * Extract the fields of the certificate in a table with keys (sha1, notBefore, - * notAfter, subjectAltName). The returned table will be allocated in @a pool. - */ -apr_hash_t *serf_ssl_cert_certificate( - const serf_ssl_certificate_t *cert, - apr_pool_t *pool); - -/** - * Export a certificate to base64-encoded, zero-terminated string. - * The returned string is allocated in @a pool. Returns NULL on failure. - */ -const char *serf_ssl_cert_export( - const serf_ssl_certificate_t *cert, - apr_pool_t *pool); - -/** - * Load a CA certificate file from a path @a file_path. If the file was loaded - * and parsed correctly, a certificate @a cert will be created and returned. - * This certificate object will be alloced in @a pool. - */ -apr_status_t serf_ssl_load_cert_file( - serf_ssl_certificate_t **cert, - const char *file_path, - apr_pool_t *pool); - -/** - * Adds the certificate @a cert to the list of trusted certificates in - * @a ssl_ctx that will be used for verification. - * See also @a serf_ssl_load_cert_file. - */ -apr_status_t serf_ssl_trust_cert( - serf_ssl_context_t *ssl_ctx, - serf_ssl_certificate_t *cert); - -/** - * Load a CRL .pem file from @a file_path and enable CRL checking. - */ -apr_status_t serf_ssl_add_crl_from_file(serf_ssl_context_t *ssl_ctx, - const char *file_path, - apr_pool_t *pool); - -/** - * Enable or disable CRL checking of all server certificates. - * @a enabled = 1 to enable CRL checking, 0 to disable CRL checking. - * Default = disabled. - */ -apr_status_t serf_ssl_check_crl(serf_ssl_context_t *ssl_ctx, - int enabled); - -/** - * Enable or disable certificate status request (OCSP stapling) checking of all - * server certificates. - * @a enabled = 1 to enable checking, 0 to disable checking. - * Default = disabled. - */ -apr_status_t -serf_ssl_check_cert_status_request(serf_ssl_context_t *ssl_ctx, int enabled); - -/** - * Enable or disable SSL compression on a SSL session. - * @a enabled = 1 to enable compression, 0 to disable compression. - * Default = disabled. - */ -apr_status_t serf_ssl_use_compression( - serf_ssl_context_t *ssl_ctx, - int enabled); - -serf_bucket_t *serf_bucket_ssl_encrypt_create( - serf_bucket_t *stream, - serf_ssl_context_t *ssl_context, - serf_bucket_alloc_t *allocator); - -serf_ssl_context_t *serf_bucket_ssl_encrypt_context_get( - serf_bucket_t *bucket); - -/* ==================================================================== */ - - -extern const serf_bucket_type_t serf_bucket_type_ssl_decrypt; -#define SERF_BUCKET_IS_SSL_DECRYPT(b) SERF_BUCKET_CHECK((b), ssl_decrypt) - -serf_bucket_t *serf_bucket_ssl_decrypt_create( - serf_bucket_t *stream, - serf_ssl_context_t *ssl_context, - serf_bucket_alloc_t *allocator); - -serf_ssl_context_t *serf_bucket_ssl_decrypt_context_get( - serf_bucket_t *bucket); - - -/* ==================================================================== */ - - -extern const serf_bucket_type_t serf_bucket_type_barrier; -#define SERF_BUCKET_IS_BARRIER(b) SERF_BUCKET_CHECK((b), barrier) - -serf_bucket_t *serf_bucket_barrier_create( - serf_bucket_t *stream, - serf_bucket_alloc_t *allocator); - - -/* ==================================================================== */ - -extern const serf_bucket_type_t serf_bucket_type_iovec; -#define SERF_BUCKET_IS_IOVEC(b) SERF_BUCKET_CHECK((b), iovec) - -serf_bucket_t *serf_bucket_iovec_create( - struct iovec vecs[], - int len, - serf_bucket_alloc_t *allocator); - -/* ==================================================================== */ - -extern const serf_bucket_type_t serf_bucket_type_copy; -#define SERF_BUCKET_IS_COPY(b) SERF_BUCKET_CHECK((b), copy) - -serf_bucket_t *serf_bucket_copy_create( - serf_bucket_t *wrapped, - apr_size_t min_size, - serf_bucket_alloc_t *allocator); - -/* ==================================================================== */ - -extern const serf_bucket_type_t serf_bucket_type_http2_unframe; -#define SERF_BUCKET_IS_HTTP2_UNFRAME(b) SERF_BUCKET_CHECK((b), http2_unframe) +extern const serf_bucket_type_t serf_bucket_type__http2_unframe; +#define SERF__BUCKET_IS_HTTP2_UNFRAME(b) SERF_BUCKET_CHECK((b), _http2_unframe) serf_bucket_t * -serf_bucket_http2_unframe_create(serf_bucket_t *stream, - int destroy_stream, - apr_size_t max_payload_size, - serf_bucket_alloc_t *allocator); +serf__bucket_http2_unframe_create(serf_bucket_t *stream, + int destroy_stream, + apr_size_t max_payload_size, + serf_bucket_alloc_t *allocator); /* Obtains the frame header state, reading from the bucket if necessary. If the header was read successfully (or was already read before calling) @@ -773,31 +52,31 @@ serf_bucket_http2_unframe_create(serf_bu returns APR_SUCCESS when the header was already read before calling this, function. Otherwise it will return the result of reading. */ apr_status_t -serf_bucket_http2_unframe_read_info(serf_bucket_t *bucket, - apr_int32_t *stream_id, - unsigned char *frame_type, - unsigned char *flags); +serf__bucket_http2_unframe_read_info(serf_bucket_t *bucket, + apr_int32_t *stream_id, + unsigned char *frame_type, + unsigned char *flags); /* ==================================================================== */ -extern const serf_bucket_type_t serf_bucket_type_http2_unpad; -#define SERF_BUCKET_IS_HTTP2_UNPAD(b) SERF_BUCKET_CHECK((b), http2_unpad) +extern const serf_bucket_type_t serf_bucket_type__http2_unpad; +#define SERF__BUCKET_IS_HTTP2_UNPAD(b) SERF_BUCKET_CHECK((b), _http2_unpad) serf_bucket_t * -serf_bucket_http2_unpad_create(serf_bucket_t *stream, - int destroy_stream, - serf_bucket_alloc_t *allocator); +serf__bucket_http2_unpad_create(serf_bucket_t *stream, + int destroy_stream, + serf_bucket_alloc_t *allocator); /* ==================================================================== */ -extern const serf_bucket_type_t serf_bucket_type_hpack; -#define SERF_BUCKET_IS_HPACK(b) SERF_BUCKET_CHECK((b), hpack) +extern const serf_bucket_type_t serf_bucket_type__hpack; +#define SERF_BUCKET_IS_HPACK(b) SERF_BUCKET_CHECK((b), _hpack) typedef struct serf_hpack_table_t serf_hpack_table_t; serf_bucket_t * -serf_bucket_hpack_create(serf_hpack_table_t *hpack_table, - serf_bucket_alloc_t *allocator); +serf__bucket_hpack_create(serf_hpack_table_t *hpack_table, + serf_bucket_alloc_t *allocator); /** * Set, copies: header and value copied. @@ -805,9 +84,9 @@ serf_bucket_hpack_create(serf_hpack_tabl * Copy the specified @a header and @a value into the bucket, using space * from this bucket's allocator. */ -void serf_bucket_hpack_setc(serf_bucket_t *hpack_bucket, - const char *key, - const char *value); +void serf__bucket_hpack_setc(serf_bucket_t *hpack_bucket, + const char *key, + const char *value); /** * Set, extended: fine grained copy control of key and value. @@ -824,16 +103,18 @@ void serf_bucket_hpack_setc(serf_bucket_ * case, the new value must be allocated and the header re-used, so * behave as if @a value_copy were true and @a header_copy false. */ -void serf_bucket_hpack_setx(serf_bucket_t *hpack_bucket, - const char *key, - apr_size_t key_size, - int header_copy, - const char *value, - apr_size_t value_size, - int value_copy); - -const char *serf_bucket_hpack_getc(serf_bucket_t *hpack_bucket, - const char *key); +void +serf__bucket_hpack_setx(serf_bucket_t *hpack_bucket, + const char *key, + apr_size_t key_size, + int header_copy, + const char *value, + apr_size_t value_size, + int value_copy); + +const char * +serf__bucket_hpack_getc(serf_bucket_t *hpack_bucket, + const char *key); /** * @param baton opaque baton as passed to @see serf_bucket_hpack_do @@ -856,17 +137,18 @@ typedef int (serf_bucket_hpack_do_callba * @param func callback routine to invoke for every header in the bucket * @param baton baton to pass on each invocation to func */ -void serf_bucket_hpack_do(serf_bucket_t *hpack_bucket, - serf_bucket_hpack_do_callback_fn_t func, - void *baton); +void +serf__bucket_hpack_do(serf_bucket_t *hpack_bucket, + serf_bucket_hpack_do_callback_fn_t func, + void *baton); serf_hpack_table_t * -serf_hpack_table_create(int for_http2, - apr_size_t default_max_table_size, - apr_pool_t *result_pool); +serf__hpack_table_create(int for_http2, + apr_size_t default_max_table_size, + apr_pool_t *result_pool); /* ==================================================================== */ -extern const serf_bucket_type_t serf_bucket_type_hpack_decode; +extern const serf_bucket_type_t serf_bucket_type__hpack_decode; #define SERF_BUCKET_IS_HPACK_DECODE(b) SERF_BUCKET_CHECK((b), hpack_decode) /* If ITEM_CALLBACK is not null calls it for every item while reading, and @@ -877,52 +159,50 @@ extern const serf_bucket_type_t serf_buc the result as the start of the result for a response_bucket. */ serf_bucket_t * -serf_bucket_hpack_decode_create(serf_bucket_t *stream, - apr_status_t(*item_callback)( +serf__bucket_hpack_decode_create(serf_bucket_t *stream, + apr_status_t(*item_callback)( void *baton, const char *key, apr_size_t key_size, const char *value, apr_size_t value_size), - void *item_baton, - apr_size_t max_entry_size, - serf_hpack_table_t *hpack_table, - serf_bucket_alloc_t *alloc); + void *item_baton, + apr_size_t max_entry_size, + serf_hpack_table_t *hpack_table, + serf_bucket_alloc_t *alloc); /* ==================================================================== */ -extern const serf_bucket_type_t serf_bucket_type_http2_frame; +extern const serf_bucket_type_t serf_bucket_type__http2_frame; -#define SERF_BUCKET_IS_HTTP2_FRAME(b) SERF_BUCKET_CHECK((b), http2_frame) +#define SERF__BUCKET_IS_HTTP2_FRAME(b) SERF_BUCKET_CHECK((b), _http2_frame) serf_bucket_t * -serf_bucket_http2_frame_create(serf_bucket_t *stream, - unsigned char frame_type, - unsigned char flags, - apr_int32_t *stream_id, - void(*stream_id_alloc)( - void *baton, - apr_int32_t *stream_id), - void *stream_id_baton, - apr_size_t max_payload_size, - apr_int32_t(*alloc_window)( - void *baton, - unsigned char frametype, - apr_int32_t stream_id, - apr_size_t requested, - int peek), - void *alloc_window_baton, - serf_bucket_alloc_t *alloc); +serf__bucket_http2_frame_create(serf_bucket_t *stream, + unsigned char frame_type, + unsigned char flags, + apr_int32_t *stream_id, + void(*stream_id_alloc)( + void *baton, + apr_int32_t *stream_id), + void *stream_id_baton, + apr_size_t max_payload_size, + apr_int32_t(*alloc_window)( + void *baton, + unsigned char frametype, + apr_int32_t stream_id, + apr_size_t requested, + int peek), + void *alloc_window_baton, + serf_bucket_alloc_t *alloc); int -serf_bucket_http2_frame_within_frame(serf_bucket_t *bucket); +serf__bucket_http2_frame_within_frame(serf_bucket_t *bucket); /* ==================================================================== */ -/* ### do we need a PIPE bucket type? they are simple apr_file_t objects */ - - #ifdef __cplusplus } #endif -#endif /* !SERF_BUCKET_TYPES_H */ +#endif /* !SERF_PROTOCOL_HTTP2_BUCKETS_H */ + Modified: serf/trunk/serf_bucket_types.h URL: http://svn.apache.org/viewvc/serf/trunk/serf_bucket_types.h?rev=1710686&r1=1710685&r2=1710686&view=diff ============================================================================== --- serf/trunk/serf_bucket_types.h (original) +++ serf/trunk/serf_bucket_types.h Mon Oct 26 20:15:02 2015 @@ -756,168 +756,6 @@ serf_bucket_t *serf_bucket_copy_create( /* ==================================================================== */ -extern const serf_bucket_type_t serf_bucket_type_http2_unframe; -#define SERF_BUCKET_IS_HTTP2_UNFRAME(b) SERF_BUCKET_CHECK((b), http2_unframe) - -serf_bucket_t * -serf_bucket_http2_unframe_create(serf_bucket_t *stream, - int destroy_stream, - apr_size_t max_payload_size, - serf_bucket_alloc_t *allocator); - -/* Obtains the frame header state, reading from the bucket if necessary. - If the header was read successfully (or was already read before calling) - the *stream_id, * frame_type and *flags values (when not pointing to NULL) - will be set to the requested values. - - returns APR_SUCCESS when the header was already read before calling this, - function. Otherwise it will return the result of reading. */ -apr_status_t -serf_bucket_http2_unframe_read_info(serf_bucket_t *bucket, - apr_int32_t *stream_id, - unsigned char *frame_type, - unsigned char *flags); - -/* ==================================================================== */ - -extern const serf_bucket_type_t serf_bucket_type_http2_unpad; -#define SERF_BUCKET_IS_HTTP2_UNPAD(b) SERF_BUCKET_CHECK((b), http2_unpad) - -serf_bucket_t * -serf_bucket_http2_unpad_create(serf_bucket_t *stream, - int destroy_stream, - serf_bucket_alloc_t *allocator); - -/* ==================================================================== */ - -extern const serf_bucket_type_t serf_bucket_type_hpack; -#define SERF_BUCKET_IS_HPACK(b) SERF_BUCKET_CHECK((b), hpack) - -typedef struct serf_hpack_table_t serf_hpack_table_t; - -serf_bucket_t * -serf_bucket_hpack_create(serf_hpack_table_t *hpack_table, - serf_bucket_alloc_t *allocator); - -/** - * Set, copies: header and value copied. - * - * Copy the specified @a header and @a value into the bucket, using space - * from this bucket's allocator. - */ -void serf_bucket_hpack_setc(serf_bucket_t *hpack_bucket, - const char *key, - const char *value); - -/** - * Set, extended: fine grained copy control of key and value. - * - * Set the specified @a key, with length @a key_size with the - * @a value, and length @a value_size, into the bucket. The header will - * be copied if @a header_copy is set, and the value is copied if - * @a value_copy is set. If the values are not copied, then they should - * remain in scope at least as long as the bucket. - * - * If @a headers_bucket already contains a header with the same name - * as @a header, then append @a value to the existing value, - * separating with a comma (as per RFC 2616, section 4.2). In this - * case, the new value must be allocated and the header re-used, so - * behave as if @a value_copy were true and @a header_copy false. - */ -void serf_bucket_hpack_setx(serf_bucket_t *hpack_bucket, - const char *key, - apr_size_t key_size, - int header_copy, - const char *value, - apr_size_t value_size, - int value_copy); - -const char *serf_bucket_hpack_getc(serf_bucket_t *hpack_bucket, - const char *key); - -/** - * @param baton opaque baton as passed to @see serf_bucket_hpack_do - * @param key The header key from this iteration through the table - * @param value The header value from this iteration through the table - */ -typedef int (serf_bucket_hpack_do_callback_fn_t)(void *baton, - const char *key, - apr_size_t keylen, - const char *value, - apr_size_t value_len); - -/** - * Iterates over all headers of the message and invokes the callback - * function with header key and value. Stop iterating when no more - * headers are available or when the callback function returned a - * non-0 value. - * - * @param headers_bucket headers to iterate over - * @param func callback routine to invoke for every header in the bucket - * @param baton baton to pass on each invocation to func - */ -void serf_bucket_hpack_do(serf_bucket_t *hpack_bucket, - serf_bucket_hpack_do_callback_fn_t func, - void *baton); - -serf_hpack_table_t * -serf_hpack_table_create(int for_http2, - apr_size_t default_max_table_size, - apr_pool_t *result_pool); - -/* ==================================================================== */ -extern const serf_bucket_type_t serf_bucket_type_hpack_decode; -#define SERF_BUCKET_IS_HPACK_DECODE(b) SERF_BUCKET_CHECK((b), hpack_decode) - -/* If ITEM_CALLBACK is not null calls it for every item while reading, and - the bucket will just return no data and APR_EAGAIN until done. - - If ITEM_CALLBACK is NULL, the bucket will read as a HTTP/1 like header block, - starting with a status line and ending with "\r\n\r\n", which allows using - the result as the start of the result for a response_bucket. - */ -serf_bucket_t * -serf_bucket_hpack_decode_create(serf_bucket_t *stream, - apr_status_t(*item_callback)( - void *baton, - const char *key, - apr_size_t key_size, - const char *value, - apr_size_t value_size), - void *item_baton, - apr_size_t max_entry_size, - serf_hpack_table_t *hpack_table, - serf_bucket_alloc_t *alloc); - -/* ==================================================================== */ -extern const serf_bucket_type_t serf_bucket_type_http2_frame; - -#define SERF_BUCKET_IS_HTTP2_FRAME(b) SERF_BUCKET_CHECK((b), http2_frame) - -serf_bucket_t * -serf_bucket_http2_frame_create(serf_bucket_t *stream, - unsigned char frame_type, - unsigned char flags, - apr_int32_t *stream_id, - void(*stream_id_alloc)( - void *baton, - apr_int32_t *stream_id), - void *stream_id_baton, - apr_size_t max_payload_size, - apr_int32_t(*alloc_window)( - void *baton, - unsigned char frametype, - apr_int32_t stream_id, - apr_size_t requested, - int peek), - void *alloc_window_baton, - serf_bucket_alloc_t *alloc); - -int -serf_bucket_http2_frame_within_frame(serf_bucket_t *bucket); - -/* ==================================================================== */ - /* ### do we need a PIPE bucket type? they are simple apr_file_t objects */ Modified: serf/trunk/serf_private.h URL: http://svn.apache.org/viewvc/serf/trunk/serf_private.h?rev=1710686&r1=1710685&r2=1710686&view=diff ============================================================================== --- serf/trunk/serf_private.h (original) +++ serf/trunk/serf_private.h Mon Oct 26 20:15:02 2015 @@ -543,6 +543,8 @@ serf_bucket_t *serf__bucket_log_wrapper_ /* From http2_protocol.c: Initializes http2 state on connection */ void serf__http2_protocol_init(serf_connection_t *conn); +typedef struct serf_hpack_table_t serf_hpack_table_t; + /* From http2_hpack_buckets.c */ apr_status_t serf__hpack_huffman_decode(const unsigned char *encoded, apr_size_t encoded_len, Modified: serf/trunk/test/test_buckets.c URL: http://svn.apache.org/viewvc/serf/trunk/test/test_buckets.c?rev=1710686&r1=1710685&r2=1710686&view=diff ============================================================================== --- serf/trunk/test/test_buckets.c (original) +++ serf/trunk/test/test_buckets.c Mon Oct 26 20:15:02 2015 @@ -33,6 +33,8 @@ #include "serf_private.h" #include "serf_bucket_util.h" +#include "protocols/http2_buckets.h" + static apr_status_t read_all(serf_bucket_t *bkt, char *buf, apr_size_t buf_len, @@ -1779,10 +1781,10 @@ static void test_http2_unframe_buckets(C raw = serf_bucket_simple_create(raw_frame1, sizeof(raw_frame1), NULL, NULL, alloc); - unframe = serf_bucket_http2_unframe_create(raw, TRUE, SERF_READ_ALL_AVAIL, - alloc); + unframe = serf__bucket_http2_unframe_create(raw, TRUE, SERF_READ_ALL_AVAIL, + alloc); - CuAssertTrue(tc, SERF_BUCKET_IS_HTTP2_UNFRAME(unframe)); + CuAssertTrue(tc, SERF__BUCKET_IS_HTTP2_UNFRAME(unframe)); status = read_all(unframe, result1, sizeof(result1), &read_len); CuAssertIntEquals(tc, APR_EOF, status); @@ -1796,10 +1798,10 @@ static void test_http2_unframe_buckets(C unsigned char frame_type, flags; CuAssertIntEquals(tc, 0, - serf_bucket_http2_unframe_read_info(unframe, - &stream_id, - &frame_type, - &flags)); + serf__bucket_http2_unframe_read_info(unframe, + &stream_id, + &frame_type, + &flags)); CuAssertIntEquals(tc, 0, stream_id); CuAssertIntEquals(tc, 4, frame_type); CuAssertIntEquals(tc, 0, flags); @@ -1808,8 +1810,8 @@ static void test_http2_unframe_buckets(C raw = serf_bucket_simple_create(raw_frame2, sizeof(raw_frame2), NULL, NULL, alloc); - unframe = serf_bucket_http2_unframe_create(raw, TRUE, SERF_READ_ALL_AVAIL, - alloc); + unframe = serf__bucket_http2_unframe_create(raw, TRUE, SERF_READ_ALL_AVAIL, + alloc); status = read_all(unframe, result2, sizeof(result2), &read_len); CuAssertIntEquals(tc, APR_EOF, status); @@ -1823,10 +1825,10 @@ static void test_http2_unframe_buckets(C unsigned char frame_type, flags; CuAssertIntEquals(tc, 0, - serf_bucket_http2_unframe_read_info(unframe, - &stream_id, - &frame_type, - &flags)); + serf__bucket_http2_unframe_read_info(unframe, + &stream_id, + &frame_type, + &flags)); CuAssertIntEquals(tc, 0x03040506, stream_id); CuAssertIntEquals(tc, 0x01, frame_type); CuAssertIntEquals(tc, 0x02, flags); @@ -1836,7 +1838,7 @@ static void test_http2_unframe_buckets(C raw = serf_bucket_simple_create(raw_frame2, sizeof(raw_frame2), NULL, NULL, alloc); - unframe = serf_bucket_http2_unframe_create(raw, TRUE, 5, alloc); + unframe = serf__bucket_http2_unframe_create(raw, TRUE, 5, alloc); status = read_all(unframe, result2, sizeof(result2), &read_len); CuAssertIntEquals(tc, SERF_ERROR_HTTP2_FRAME_SIZE_ERROR, status); @@ -1872,15 +1874,15 @@ static void test_http2_unpad_buckets(CuT raw = serf_bucket_simple_create(raw_frame, sizeof(raw_frame)-1, NULL, NULL, alloc); - unframe = serf_bucket_http2_unframe_create(raw, FALSE, SERF_READ_ALL_AVAIL, - alloc); + unframe = serf__bucket_http2_unframe_create(raw, FALSE, SERF_READ_ALL_AVAIL, + alloc); { apr_int32_t streamid; unsigned char frame_type, flags; - status = serf_bucket_http2_unframe_read_info(unframe, &streamid, - &frame_type, &flags); + status = serf__bucket_http2_unframe_read_info(unframe, &streamid, + &frame_type, &flags); CuAssertIntEquals(tc, APR_SUCCESS, status); CuAssertIntEquals(tc, 7, streamid); @@ -1888,9 +1890,9 @@ static void test_http2_unpad_buckets(CuT CuAssertIntEquals(tc, 8, flags); } - unpad = serf_bucket_http2_unpad_create(unframe, TRUE, alloc); + unpad = serf__bucket_http2_unpad_create(unframe, TRUE, alloc); - CuAssertTrue(tc, SERF_BUCKET_IS_HTTP2_UNPAD(unpad)); + CuAssertTrue(tc, SERF__BUCKET_IS_HTTP2_UNPAD(unpad)); status = read_all(unpad, result1, sizeof(result1), &read_len); CuAssertIntEquals(tc, APR_EOF, status); @@ -1899,11 +1901,11 @@ static void test_http2_unpad_buckets(CuT read_and_check_bucket(tc, raw, "Extra"); raw = serf_bucket_simple_create("\0a", 2, NULL, NULL, alloc); - unpad = serf_bucket_http2_unpad_create(raw, TRUE, alloc); + unpad = serf__bucket_http2_unpad_create(raw, TRUE, alloc); read_and_check_bucket(tc, unpad, "a"); raw = serf_bucket_simple_create("\5a", 2, NULL, NULL, alloc); - unpad = serf_bucket_http2_unpad_create(raw, TRUE, alloc); + unpad = serf__bucket_http2_unpad_create(raw, TRUE, alloc); { const char *data; @@ -2135,14 +2137,14 @@ static void test_hpack_header_encode(CuT alloc = serf_bucket_allocator_create(tb->pool, NULL, NULL); - hpack = serf_bucket_hpack_create(NULL, alloc); + hpack = serf__bucket_hpack_create(NULL, alloc); CuAssertTrue(tc, SERF_BUCKET_IS_HPACK(hpack)); - serf_bucket_hpack_setc(hpack, ":method", "PUT"); - serf_bucket_hpack_setc(hpack, ":scheme", "https"); - serf_bucket_hpack_setc(hpack, ":path", "/"); - serf_bucket_hpack_setc(hpack, ":authority", "localhost"); + serf__bucket_hpack_setc(hpack, ":method", "PUT"); + serf__bucket_hpack_setc(hpack, ":scheme", "https"); + serf__bucket_hpack_setc(hpack, ":path", "/"); + serf__bucket_hpack_setc(hpack, ":authority", "localhost"); CuAssertIntEquals(tc, APR_EOF, read_all(hpack, resultbuffer, sizeof(resultbuffer), &sz)); @@ -2166,10 +2168,10 @@ static void test_http2_frame_bucket_basi alloc = serf_bucket_allocator_create(tb->pool, NULL, NULL); body_in = SERF_BUCKET_SIMPLE_STRING("This is no config!", alloc); - frame_in = serf_bucket_http2_frame_create(body_in, 99, 7, &exp_streamid, - NULL, NULL, - 16384, NULL, NULL, alloc); - frame_out = serf_bucket_http2_unframe_create(frame_in, FALSE, 16384, alloc); + frame_in = serf__bucket_http2_frame_create(body_in, 99, 7, &exp_streamid, + NULL, NULL, + 16384, NULL, NULL, alloc); + frame_out = serf__bucket_http2_unframe_create(frame_in, FALSE, 16384, alloc); read_and_check_bucket(tc, frame_out, "This is no config!"); @@ -2181,8 +2183,8 @@ static void test_http2_frame_bucket_basi apr_size_t sz; CuAssertIntEquals(tc, 0, - serf_bucket_http2_unframe_read_info(frame_out, &streamid, - &frametype, &flags)); + serf__bucket_http2_unframe_read_info(frame_out, &streamid, + &frametype, &flags)); CuAssertIntEquals(tc, 0x01020304, streamid); CuAssertIntEquals(tc, 99, frametype); CuAssertIntEquals(tc, 7, flags);