]> granicus.if.org Git - curl/commitdiff
http2: Fix assertion error on redirect with CL=0
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>
Fri, 3 Mar 2017 12:44:01 +0000 (21:44 +0900)
committerDaniel Stenberg <daniel@haxx.se>
Tue, 7 Mar 2017 22:12:41 +0000 (23:12 +0100)
This fixes assertion error which occurs when redirect is done with 0
length body via HTTP/2, and the easy handle is reused, but new
connection is established due to hostname change:

    curl: http2.c:1572: ssize_t http2_recv(struct connectdata *,
      int, char *, size_t, CURLcode *):
    Assertion `httpc->drain_total >= data->state.drain' failed.

To fix this bug, ensure that http2_handle_stream is called.

Fixes #1286
Closes #1302

lib/http.c

index 8db86cd84df94de218ad35e87a760f3ac00a51e9..fbb0376a36d0aa2e7348e6115077d27d4e0a1938 100644 (file)
@@ -3240,9 +3240,17 @@ CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
           k->maxdownload = k->size;
         }
 
-        /* If max download size is *zero* (nothing) we already
-           have nothing and can safely return ok now! */
-        if(0 == k->maxdownload)
+        /* If max download size is *zero* (nothing) we already have
+           nothing and can safely return ok now!  But for HTTP/2, we'd
+           like to call http2_handle_stream_close to properly close a
+           stream.  In order to do this, we keep reading until we
+           close the stream. */
+        if(0 == k->maxdownload
+#if defined(USE_NGHTTP2)
+           && !((conn->handler->protocol & PROTO_FAMILY_HTTP) &&
+                conn->httpversion == 20)
+#endif
+           )
           *stop_reading = TRUE;
 
         if(*stop_reading) {