Skip to content

Commit

Permalink
http2: Ensure that http2_handle_stream_close is called
Browse files Browse the repository at this point in the history
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 curl#564
  • Loading branch information
tatsuhiro-t committed Jan 8, 2016
1 parent 984d1e9 commit cf11823
Showing 1 changed file with 12 additions and 1 deletion.
13 changes: 12 additions & 1 deletion lib/transfer.c
Expand Up @@ -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! */
Expand Down

0 comments on commit cf11823

Please sign in to comment.