Author: rhuijben
Date: Sun Nov 29 00:24:31 2015
New Revision: 1717016

URL: http://svn.apache.org/viewvc?rev=1717016&view=rev
Log:
* buckets/split_buckets.c
  (serf_split_destroy): Clear some values.

* protocols/http2_protocol.c
  (http2_write_data): Clear some state.
  (serf_http2__ensure_writable): Fix edge case to avoid endless loop.

* protocols/http2_stream.c
  (serf_http2__stream_pre_cleanup): Properly clear data_tail.
  (serf_http2__stream_cleanup): Really stop destroying data_tail.
  (stream_send_data): Mark stream closed when done. Ensure write again in
    all cases where we have to write again.

Modified:
    serf/trunk/buckets/split_buckets.c
    serf/trunk/protocols/http2_protocol.c
    serf/trunk/protocols/http2_stream.c

Modified: serf/trunk/buckets/split_buckets.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/buckets/split_buckets.c?rev=1717016&r1=1717015&r2=1717016&view=diff
==============================================================================
--- serf/trunk/buckets/split_buckets.c (original)
+++ serf/trunk/buckets/split_buckets.c Sun Nov 29 00:24:31 2015
@@ -374,6 +374,9 @@ static void serf_split_destroy(serf_buck
             sctx->next->prev = sctx->prev;
         else
             ctx->tail = sctx->prev;
+
+        sctx->ctx = NULL;
+        sctx->prev = sctx->next = NULL;
     }
 
     serf_default_destroy_and_data(bucket);

Modified: serf/trunk/protocols/http2_protocol.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/protocols/http2_protocol.c?rev=1717016&r1=1717015&r2=1717016&view=diff
==============================================================================
--- serf/trunk/protocols/http2_protocol.c (original)
+++ serf/trunk/protocols/http2_protocol.c Sun Nov 29 00:24:31 2015
@@ -1613,7 +1613,7 @@ static apr_status_t http2_write_data(ser
 {
     serf_http2_stream_t *stream = h2->cur_writable;
 
-    while (TRUE)
+    while (h2->lr_window > 0)
     {
         apr_status_t status;
 
@@ -1637,7 +1637,8 @@ static apr_status_t http2_write_data(ser
             else
                 h2->last_writable = stream->prev_writable;
 
-            stream = stream->next_writable;
+            stream->prev_writable = stream->next_writable = NULL;
+            stream = NULL;
             continue;
         }
 
@@ -2052,8 +2053,8 @@ void serf_http2__ensure_writable(serf_ht
 
     stream->prev_writable = h2->last_writable;
     h2->last_writable = stream;
-    if (h2->first_writable)
-        h2->last_writable->next_writable = stream;
+    if (stream->prev_writable)
+        stream->prev_writable->next_writable = stream;
     else
         h2->first_writable = stream;
 }

Modified: serf/trunk/protocols/http2_stream.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/protocols/http2_stream.c?rev=1717016&r1=1717015&r2=1717016&view=diff
==============================================================================
--- serf/trunk/protocols/http2_stream.c (original)
+++ serf/trunk/protocols/http2_stream.c Sun Nov 29 00:24:31 2015
@@ -87,8 +87,10 @@ void
 serf_http2__stream_pre_cleanup(serf_http2_stream_t *stream)
 {
     if (stream->data) {
-        if (stream->data->data_tail)
+        if (stream->data->data_tail) {
             serf_bucket_destroy(stream->data->data_tail);
+            stream->data->data_tail = NULL;
+        }
     }
 }
 
@@ -99,9 +101,6 @@ serf_http2__stream_cleanup(serf_http2_st
         if (stream->data->response_agg)
             serf_bucket_destroy(stream->data->response_agg);
 
-        if (stream->data->data_tail)
-            serf_bucket_destroy(stream->data->data_tail);
-
         serf_bucket_mem_free(stream->alloc, stream->data);
         stream->data = NULL;
     }
@@ -267,6 +266,10 @@ static apr_status_t stream_send_data(ser
     if (prefix_len == 0) {
         /* No window left */
         stream->data->data_tail = data;
+
+        /* Write more later */
+        serf_http2__ensure_writable(stream);
+
         return APR_SUCCESS;
     }
 
@@ -284,10 +287,18 @@ static apr_status_t stream_send_data(ser
                                          data_write_started,
                                          data_write_done, NULL, stream->alloc);
         end_stream = false;
+
+        serf_http2__ensure_writable(stream);
     }
-    else
+    else {
         end_stream = true;
 
+        if (stream->status == H2S_OPEN)
+            stream->status = H2S_HALFCLOSED_LOCAL;
+        else
+            stream->status = H2S_CLOSED;
+    }
+
     next = serf__bucket_http2_frame_create(data, HTTP2_FRAME_TYPE_DATA,
                                            end_stream ? HTTP2_FLAG_END_STREAM
                                                       : 0,
@@ -298,11 +309,6 @@ static apr_status_t stream_send_data(ser
 
     status = serf_http2__enqueue_frame(stream->h2, next, TRUE);
 
-    if (!end_stream) {
-        /* Write more later */
-        serf_http2__ensure_writable(stream);
-    }
-
     return status;
 }
 


Reply via email to