http2: set drain on stream end

Ensure that on_frame_recv() stream end will trigger a read if there is
pending data. Without this it could happen that the pending data is
never consumed.

This combined with https://github.com/curl/curl/pull/10529 should fix
https://github.com/curl/curl/issues/10525

Ref: https://github.com/curl/curl/issues/10525
Closes #10530
This commit is contained in:
Harry Sintonen 2023-02-16 06:26:26 +02:00 committed by Daniel Stenberg
parent 3103de2053
commit 87ed650d04
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2

View File

@ -868,6 +868,14 @@ static int on_frame_recv(nghttp2_session *session, const nghttp2_frame *frame,
return NGHTTP2_ERR_CALLBACK_FAILURE; return NGHTTP2_ERR_CALLBACK_FAILURE;
} }
} }
if(frame->hd.flags & NGHTTP2_FLAG_END_STREAM) {
/* Stream has ended. If there is pending data, ensure that read
will occur to consume it. */
if(!data->state.drain && stream->memlen) {
drain_this(cf, data_s);
Curl_expire(data, 0, EXPIRE_RUN_NOW);
}
}
break; break;
case NGHTTP2_HEADERS: case NGHTTP2_HEADERS:
DEBUGF(LOG_CF(data_s, cf, "[h2sid=%u] recv frame HEADERS", stream_id)); DEBUGF(LOG_CF(data_s, cf, "[h2sid=%u] recv frame HEADERS", stream_id));