diff options
author | Christian Kamm <mail@ckamm.de> | 2019-02-22 10:53:48 +0100 |
---|---|---|
committer | Timur Pocheptsov <timur.pocheptsov@qt.io> | 2019-05-03 03:57:05 +0000 |
commit | 6c0ced4b7a77b089b434ab5eb9f430717f26d687 (patch) | |
tree | 80df284b500babb3881b84b0fd6717cfd5408d7b /src | |
parent | 047633a9457891a5b1132c6be7b6b5b17729133c (diff) |
HTTP2: Fix handling of GOAWAY frames
Previously there were two issues:
- A QNetworkReply could be aborted but be in NoError state.
(GOAWAY frame with 0 as error)
- Streams in a connection would be aborted prematurely when a GOAWAY
frame with a lastStreamId of 2^31-1 was received.
Fixes: QTBUG-73947
Change-Id: Iddee9385c1db3cc4bb80e07efac7220fff787bf3
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/network/access/qhttp2protocolhandler.cpp | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/network/access/qhttp2protocolhandler.cpp b/src/network/access/qhttp2protocolhandler.cpp index 35aee6e3e1..87a70d8a55 100644 --- a/src/network/access/qhttp2protocolhandler.cpp +++ b/src/network/access/qhttp2protocolhandler.cpp @@ -818,7 +818,6 @@ void QHttp2ProtocolHandler::handleGOAWAY() // and a NO_ERROR code." if (lastStreamID != Http2::lastValidStreamID || errorCode != HTTP2_NO_ERROR) return connectionError(PROTOCOL_ERROR, "GOAWAY invalid stream/error code"); - lastStreamID = 1; } else { lastStreamID += 2; } @@ -836,6 +835,14 @@ void QHttp2ProtocolHandler::handleGOAWAY() QString message; qt_error(errorCode, error, message); + // Even if the GOAWAY frame contains NO_ERROR we must send an error + // when terminating streams to ensure users can distinguish from a + // successful completion. + if (errorCode == HTTP2_NO_ERROR) { + error = QNetworkReply::ContentReSendError; + message = QLatin1String("Server stopped accepting new streams before this stream was established"); + } + for (quint32 id = lastStreamID; id < nextID; id += 2) { const auto it = activeStreams.find(id); if (it != activeStreams.end()) { |