From 1c463000ed7427ef6b311b5ae30b91b0570754d1 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Thu, 5 Apr 2018 13:05:05 +0200 Subject: [PATCH] HTTP/2 - treat HEADERS frames as valid for streams in 'open' state MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, I erroneously expected HEADERS frame only on a stream, which is in half-closed (local) or reserved (remote) state. But 'open' state is also valid (RFC7540, 6.2). For example, we start uploading some data, we have sent HEADERS frame and now are sending DATA frames, without END_STREAM flag set yet; this stream is in 'open' state. If a server wants to reply with some error status code or redirect - it does not have to wait for our END_STREAM flag, reading all this data that will be discarded anyway. Task-number: QTBUG-67469 Change-Id: I53e3a5e9b2ab7f7917ae083ba44e862a227db238 Reviewed-by: MÃ¥rten Nordheim Reviewed-by: Edward Welbourne --- src/network/access/qhttp2protocolhandler.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/network/access/qhttp2protocolhandler.cpp b/src/network/access/qhttp2protocolhandler.cpp index 0cdcee6b59..5420e713b5 100644 --- a/src/network/access/qhttp2protocolhandler.cpp +++ b/src/network/access/qhttp2protocolhandler.cpp @@ -917,10 +917,11 @@ void QHttp2ProtocolHandler::handleContinuedHEADERS() if (activeStreams.contains(streamID)) { Stream &stream = activeStreams[streamID]; if (stream.state != Stream::halfClosedLocal - && stream.state != Stream::remoteReserved) { + && stream.state != Stream::remoteReserved + && stream.state != Stream::open) { // We can receive HEADERS on streams initiated by our requests - // (these streams are in halfClosedLocal state) or remote-reserved - // streams from a server's PUSH_PROMISE. + // (these streams are in halfClosedLocal or open state) or + // remote-reserved streams from a server's PUSH_PROMISE. finishStreamWithError(stream, QNetworkReply::ProtocolFailure, QLatin1String("HEADERS on invalid stream")); sendRST_STREAM(streamID, CANCEL);