]> granicus.if.org Git - curl/commitdiff
http2: if there is paused data, do not clear the drain field
authorDaniel Stenberg <daniel@haxx.se>
Mon, 11 May 2015 13:54:50 +0000 (15:54 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 18 May 2015 07:33:47 +0000 (09:33 +0200)
lib/http2.c

index c2e90613a730f36415d3da50cead638aabf40b12..ad1826d5502b46a9a33d341b41c088903717eec2 100644 (file)
@@ -388,7 +388,9 @@ static int on_data_chunk_recv(nghttp2_session *session, uint8_t flags,
   if(nread < len) {
     stream->pausedata = data + nread;
     stream->pauselen = len - nread;
-    DEBUGF(infof(data_s, "NGHTTP2_ERR_PAUSE - out of buffer\n"));
+    DEBUGF(infof(data_s, "NGHTTP2_ERR_PAUSE - %zu bytes out of buffer"
+                 ", stream %x\n",
+                 len - nread, stream_id));
     conn->proto.httpc.pause_stream_id = stream_id;
     return NGHTTP2_ERR_PAUSE;
   }
@@ -853,7 +855,7 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
   infof(data, "http2_recv: %d bytes buffer at %p (stream %x)\n",
         len, mem, stream->stream_id);
 
-  if(data->state.drain) {
+  if((data->state.drain) && stream->memlen) {
     DEBUGF(infof(data, "http2_recv: DRAIN %zu bytes stream %x!! (%p => %p)\n",
                  stream->memlen, stream->stream_id,
                  stream->mem, mem));
@@ -881,8 +883,8 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
       stream->pausedata = NULL;
       stream->pauselen = 0;
     }
-    infof(data, "http2_recv: returns %zd bytes from stream->data\n",
-          nread);
+    infof(data, "http2_recv: returns unpaused %zd bytes on stream %x\n",
+          nread, stream->stream_id);
     return nread;
   }
   else if(httpc->pause_stream_id) {
@@ -967,12 +969,19 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
   }
   if(stream->memlen) {
     ssize_t retlen = stream->memlen;
-    infof(data, "http2_recv: returns %zd for stream %x (%zu/%zu)\n",
-          retlen, stream->stream_id,
-          len, stream->len);
-    data->state.drain = 0; /* this stream is hereby drained */
+    infof(data, "http2_recv: returns %zd for stream %x\n",
+          retlen, stream->stream_id);
     stream->memlen = 0;
 
+    if(httpc->pause_stream_id == stream->stream_id) {
+      /* data for this stream is returned now, but this stream caused a pause
+         already so we need it called again asap */
+      DEBUGF(infof(data, "Data returned for PAUSED stream %x\n",
+                   stream->stream_id));
+    }
+    else
+      data->state.drain = 0; /* this stream is hereby drained */
+
     return retlen;
   }
   /* If stream is closed, return 0 to signal the http routine to close