http2: Ensure that http2_handle_stream_close is called

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
This commit is contained in:
Tatsuhiro Tsujikawa 2016-01-07 22:10:09 +09:00 committed by Jay Satiro
parent 325686ef9e
commit b019af41e7
1 changed files with 12 additions and 1 deletions

View File

@ -410,7 +410,18 @@ static CURLcode readwrite_data(struct SessionHandle *data,
data->set.buffer_size : BUFSIZE; data->set.buffer_size : BUFSIZE;
size_t bytestoread = buffersize; 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 /* 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 might be pipelining and then someone else might want to read what
follows! */ follows! */