Author: rhuijben
Date: Mon Oct 26 17:38:29 2015
New Revision: 1710661

URL: http://svn.apache.org/viewvc?rev=1710661&view=rev
Log:
Make the http2 frame bucket a bit easier to use by extending the kind
of arguments that can be passed to the create function.

* buckets/http2_frame_buckets.c
  (serf_h2_dechunk_readline): Rename to...
  (serf_http2_unframe_readline): ... this.
  (serf_bucket_type_http2_unframe): Update usage.
  (serf_bucket_http2_frame_create): Handle no streamid handlers as stream 0.
  (http2_prepare_frame,
   serf_http2_frame_destroy): Allow a NULL stream.

Modified:
    serf/trunk/buckets/http2_frame_buckets.c

Modified: serf/trunk/buckets/http2_frame_buckets.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/buckets/http2_frame_buckets.c?rev=1710661&r1=1710660&r2=1710661&view=diff
==============================================================================
--- serf/trunk/buckets/http2_frame_buckets.c (original)
+++ serf/trunk/buckets/http2_frame_buckets.c Mon Oct 26 17:38:29 2015
@@ -262,12 +262,12 @@ serf_http2_unframe_get_remaining(serf_bu
 }
 
 /* ### need to implement */
-#define serf_h2_dechunk_readline NULL
+#define serf_http2_unframe_readline NULL
 
 const serf_bucket_type_t serf_bucket_type_http2_unframe = {
   "H2-UNFRAME",
   serf_http2_unframe_read,
-  serf_h2_dechunk_readline /* ### TODO */,
+  serf_http2_unframe_readline /* ### TODO */,
   serf_http2_unframe_read_iovec,
   serf_default_read_for_sendfile,
   serf_buckets_are_v2,
@@ -578,10 +578,27 @@ serf_bucket_http2_frame_create(serf_buck
   if (max_payload_size > 0xFFFFFF)
     max_payload_size = 0xFFFFFF;
 
-  ctx->stream_id = (stream_id && *stream_id >= 0) ? *stream_id : -1;
-  ctx->p_stream_id = stream_id ? stream_id : &ctx->stream_id;
-  ctx->stream_id_alloc = stream_id_alloc;
-  ctx->stream_id_baton = stream_id_baton;
+  if (!stream_id_alloc || (stream_id && *stream_id >= 0))
+    {
+      /* Avoid all alloc handling; we know the final id */
+      ctx->stream_id = stream_id ? *stream_id : 0;
+      ctx->p_stream_id = &ctx->stream_id;
+      ctx->stream_id_alloc = NULL;
+      ctx->stream_id_baton = NULL;
+    }
+  else
+    {
+      /* Delay creating the id until we really need it.
+
+         Using a higher stream number before a lower version in communication
+         closes the lower number directly (as 'unused') */
+
+      ctx->stream_id = -1;
+      ctx->p_stream_id = stream_id;
+      ctx->stream_id_alloc = stream_id_alloc;
+      ctx->stream_id_baton = stream_id_baton;
+    }
+
   ctx->current_window = 0;
   ctx->alloc_window = alloc_window;
   ctx->alloc_window_baton = alloc_window_baton;
@@ -617,12 +634,20 @@ http2_prepare_frame(serf_bucket_t *bucke
 
   ctx->created_frame = TRUE;
 
-  ctx->stream_status = serf_bucket_read_iovec(ctx->stream,
-                                              ctx->max_payload_size,
-                                              512, vecs, &vecs_used);
+  if (ctx->stream)
+    {
+      ctx->stream_status = serf_bucket_read_iovec(ctx->stream,
+                                                  ctx->max_payload_size,
+                                                  512, vecs, &vecs_used);
 
-  if (SERF_BUCKET_READ_ERROR(ctx->stream_status))
-    return ctx->stream_status;
+      if (SERF_BUCKET_READ_ERROR(ctx->stream_status))
+        return ctx->stream_status;
+    }
+  else
+    {
+      vecs_used = 0;
+      ctx->stream_status = APR_EOF;
+    }
 
   /* For this first version assume that everything fits in a single frame */
   if (! APR_STATUS_IS_EOF(ctx->stream_status))
@@ -727,7 +752,9 @@ serf_http2_frame_destroy(serf_bucket_t *
 {
   serf_http2_frame_context_t *ctx = bucket->data;
 
-  serf_bucket_destroy(ctx->stream);
+  if (ctx->stream)
+    serf_bucket_destroy(ctx->stream);
+
   serf_bucket_destroy(ctx->chunk);
 
   serf_default_destroy_and_data(bucket);


Reply via email to