]> granicus.if.org Git - curl/commitdiff
http2: Ensure that http2_handle_stream_close is called
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>
Thu, 7 Jan 2016 13:10:09 +0000 (22:10 +0900)
committerJay Satiro <raysatiro@yahoo.com>
Fri, 8 Jan 2016 22:16:47 +0000 (17:16 -0500)
Previously, when HTTP/2 is enabled and used, and stream has content
length known, Curl_read was not called when there was no bytes left to
read. Because of this, we could not make sure that
http2_handle_stream_close was called for every stream. Since we use
http2_handle_stream_close to emit trailer fields, they were
effectively ignored. This commit changes the code so that Curl_read is
called even if no bytes left to read, to ensure that
http2_handle_stream_close is called for every stream.

Discussed in https://github.com/bagder/curl/pull/564

lib/transfer.c

index 91777d6f5cd2e604d7c98068fc4f2a15f7065444..d6e1f4dc1cdee75ee9f224761a06aaec5acd3900 100644 (file)
@@ -410,7 +410,18 @@ static CURLcode readwrite_data(struct SessionHandle *data,
       data->set.buffer_size : BUFSIZE;
     size_t bytestoread = buffersize;
 
-    if(k->size != -1 && !k->header) {
+    if(
+#if defined(USE_NGHTTP2)
+       /* For HTTP/2, read data without caring about the content
+          length. This is safe because body in HTTP/2 is always
+          segmented thanks to its framing layer. Meanwhile, we have to
+          call Curl_read to ensure that http2_handle_stream_close is
+          called when we read all incoming bytes for a particular
+          stream. */
+       !((conn->handler->protocol & PROTO_FAMILY_HTTP) &&
+         conn->httpversion == 20) &&
+#endif
+       k->size != -1 && !k->header) {
       /* make sure we don't read "too much" if we can help it since we
          might be pipelining and then someone else might want to read what
          follows! */