summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kamm <mail@ckamm.de>2019-02-22 10:53:48 +0100
committerTimur Pocheptsov <timur.pocheptsov@qt.io>2019-05-03 03:57:05 +0000
commit6c0ced4b7a77b089b434ab5eb9f430717f26d687 (patch)
tree80df284b500babb3881b84b0fd6717cfd5408d7b
parent047633a9457891a5b1132c6be7b6b5b17729133c (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>
-rw-r--r--src/network/access/qhttp2protocolhandler.cpp9
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()) {