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);
-            }
         }
     }
 


Reply via email to