Author: rhuijben
Date: Tue Nov 24 12:51:08 2015
New Revision: 1716124
URL: http://svn.apache.org/viewvc?rev=1716124&view=rev
Log:
Simplify the http/1.1 style header creation code in the hpack buckets a bit
by using the normal headers bucket.
This has the nice side effect that a caller can try reading a headers bucket
to avoid the entire serialization+unserialization step.
* buckets/hpack_buckets.c
(serf_hpack_decode_ctx_t): Replace bool with header bucket.
(serf__bucket_hpack_decode_create): Explicitly initialize.
(write_request_header): Create headers.
(handle_read_entry_and_clear): Create/update headers.
(hpack_read_bytes): Remove now unneeded specific case.
Modified:
serf/trunk/buckets/hpack_buckets.c
Modified: serf/trunk/buckets/hpack_buckets.c
URL:
http://svn.apache.org/viewvc/serf/trunk/buckets/hpack_buckets.c?rev=1716124&r1=1716123&r2=1716124&view=diff
==============================================================================
--- serf/trunk/buckets/hpack_buckets.c (original)
+++ serf/trunk/buckets/hpack_buckets.c Tue Nov 24 12:51:08 2015
@@ -1152,9 +1152,9 @@ typedef struct serf_hpack_decode_ctx_t
/* When producing HTTP/1.1 style output */
serf_bucket_t *agg;
+ serf_bucket_t *headers; /* When not NULL added in agg */
serf_config_t *config;
- bool wrote_header;
bool is_request;
bool hit_eof;
@@ -1205,6 +1205,7 @@ serf__bucket_hpack_decode_create(serf_bu
ctx->item_callback = NULL;
ctx->item_baton = NULL;
ctx->agg = serf_bucket_aggregate_create(alloc);
+ ctx->headers = NULL;
}
return serf_bucket_create(&serf_bucket_type__hpack_decode, alloc, ctx);
@@ -1335,8 +1336,6 @@ write_request_header(serf_hpack_decode_c
serf_bucket_t *b;
serf_bucket_alloc_t *alloc = ctx->agg->allocator;
- ctx->wrote_header = TRUE;
-
if (ctx->method)
b = serf_bucket_simple_own_create(ctx->method, strlen(ctx->method),
alloc);
@@ -1372,6 +1371,9 @@ write_request_header(serf_hpack_decode_c
}
/* Now owned by bucket */
ctx->method = ctx->path = ctx->authority = NULL;
+
+ ctx->headers = serf_bucket_headers_create(ctx->agg->allocator);
+ serf_bucket_aggregate_append(ctx->agg, ctx->headers);
}
static apr_status_t
@@ -1398,14 +1400,12 @@ handle_read_entry_and_clear(serf_hpack_d
if (status)
return status;
}
- else if (!ctx->wrote_header)
+ else if (!ctx->headers)
{
serf_bucket_t *b;
if (ctx->key_size == 7 && !strcmp(ctx->key, ":status"))
{
- ctx->wrote_header = TRUE;
-
b = SERF_BUCKET_SIMPLE_STRING("HTTP/2.0 ", alloc);
serf_bucket_aggregate_append(ctx->agg, b);
@@ -1414,6 +1414,9 @@ handle_read_entry_and_clear(serf_hpack_d
b = SERF_BUCKET_SIMPLE_STRING(" <http2>\r\n", alloc);
serf_bucket_aggregate_append(ctx->agg, b);
+
+ ctx->headers = serf_bucket_headers_create(alloc);
+ serf_bucket_aggregate_append(ctx->agg, ctx->headers);
}
else if (ctx->key_size == 7 && !strcmp(ctx->key, ":method"))
{
@@ -1446,8 +1449,6 @@ handle_read_entry_and_clear(serf_hpack_d
else
{
/* Write some header with some status code first */
- ctx->wrote_header = TRUE;
-
if (ctx->is_request)
write_request_header(ctx);
else
@@ -1456,38 +1457,17 @@ handle_read_entry_and_clear(serf_hpack_d
"HTTP/2.0 505 Missing ':status' header\r\n",
alloc);
serf_bucket_aggregate_append(ctx->agg, b);
- }
-
- /* And now the actual header */
- b = serf_bucket_simple_copy_create(ctx->key, ctx->key_size, alloc);
- serf_bucket_aggregate_append(ctx->agg, b);
-
- b = SERF_BUCKET_SIMPLE_STRING(": ", alloc);
- serf_bucket_aggregate_append(ctx->agg, b);
- b = serf_bucket_simple_copy_create(ctx->val, ctx->val_size, alloc);
- serf_bucket_aggregate_append(ctx->agg, b);
+ ctx->headers = serf_bucket_headers_create(alloc);
+ serf_bucket_aggregate_append(ctx->agg, ctx->headers);
+ }
- b = SERF_BUCKET_SIMPLE_STRING("\r\n", alloc);
- serf_bucket_aggregate_append(ctx->agg, b);
+ serf_bucket_headers_setc(ctx->headers, ctx->key, ctx->val);
}
}
else if (ctx->key_size && ctx->key[0] != ':')
{
- serf_bucket_t *b;
-
- /* Write header */
- b = serf_bucket_simple_copy_create(ctx->key, ctx->key_size, alloc);
- serf_bucket_aggregate_append(ctx->agg, b);
-
- b = SERF_BUCKET_SIMPLE_STRING(": ", alloc);
- serf_bucket_aggregate_append(ctx->agg, b);
-
- b = serf_bucket_simple_copy_create(ctx->val, ctx->val_size, alloc);
- serf_bucket_aggregate_append(ctx->agg, b);
-
- b = SERF_BUCKET_SIMPLE_STRING("\r\n", alloc);
- serf_bucket_aggregate_append(ctx->agg, b);
+ serf_bucket_headers_setc(ctx->headers, ctx->key, ctx->val);
}
if (ctx->reuse_item)
@@ -1915,13 +1895,6 @@ hpack_process(serf_bucket_t *bucket)
hpack_shrink_table(&tbl->rl_first,
&tbl->rl_last, &tbl->rl_size,
tbl->rl_max_table_size, tbl->alloc);
-
- if (!ctx->item_callback)
- {
- /* Write the final "\r\n" for http/1.1 compatibility */
- b = SERF_BUCKET_SIMPLE_STRING("\r\n", bucket->allocator);
- serf_bucket_aggregate_append(ctx->agg, b);
- }
}
}