From 4c930e9d13738ac0faaaed3aa5b1c34509b04019 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5rten=20Nordheim?= Date: Fri, 26 Nov 2021 13:15:46 +0100 Subject: [PATCH] QNAM: Disable h2c by default And since it's relatively unlikely to be used, just leave it behind a environment variable for now. [ChangeLog][QtNetwork][Potentially Source-Incompatible] Support for clear-text http/2 was disabled due to incompatibility with certain servers. If you were relying on this feature you must re-enable it by setting the QT_NETWORK_ALLOW_H2C environment variable. For a later version of Qt it will get a dedicated attribute. Pick-to: 6.2 Task-number: QTBUG-98642 Change-Id: Id3e360726e285b3128e3e3f4bce9440404c9ad6e Reviewed-by: Qt CI Bot Reviewed-by: Maximilian Goldstein Reviewed-by: Timur Pocheptsov --- src/network/access/qhttpnetworkrequest.cpp | 10 ++++++++++ src/network/access/qhttpnetworkrequest_p.h | 3 +++ src/network/access/qhttpthreaddelegate.cpp | 6 ++++++ tests/auto/network/access/http2/tst_http2.cpp | 1 + 4 files changed, 20 insertions(+) diff --git a/src/network/access/qhttpnetworkrequest.cpp b/src/network/access/qhttpnetworkrequest.cpp index f370445059..f419ee2673 100644 --- a/src/network/access/qhttpnetworkrequest.cpp +++ b/src/network/access/qhttpnetworkrequest.cpp @@ -365,6 +365,16 @@ void QHttpNetworkRequest::setHTTP2Direct(bool b) d->http2Direct = b; } +bool QHttpNetworkRequest::isH2cAllowed() const +{ + return qEnvironmentVariableIsSet("QT_NETWORK_H2C_ALLOWED"); +} + +void QHttpNetworkRequest::setH2cAllowed(bool b) +{ + Q_UNUSED(b); +} + bool QHttpNetworkRequest::withCredentials() const { return d->withCredentials; diff --git a/src/network/access/qhttpnetworkrequest_p.h b/src/network/access/qhttpnetworkrequest_p.h index 50fdd64290..f4c1d7fb8c 100644 --- a/src/network/access/qhttpnetworkrequest_p.h +++ b/src/network/access/qhttpnetworkrequest_p.h @@ -125,6 +125,9 @@ public: bool isHTTP2Direct() const; void setHTTP2Direct(bool b); + bool isH2cAllowed() const; + void setH2cAllowed(bool b); + bool withCredentials() const; void setWithCredentials(bool b); diff --git a/src/network/access/qhttpthreaddelegate.cpp b/src/network/access/qhttpthreaddelegate.cpp index 50a14b6258..243492d466 100644 --- a/src/network/access/qhttpthreaddelegate.cpp +++ b/src/network/access/qhttpthreaddelegate.cpp @@ -290,6 +290,12 @@ void QHttpThreadDelegate::startRequest() connectionType = QHttpNetworkConnection::ConnectionTypeHTTP2Direct; } + // Use HTTP/1.1 if h2c is not allowed and we would otherwise choose to use it + if (!ssl && connectionType == QHttpNetworkConnection::ConnectionTypeHTTP2 + && !httpRequest.isH2cAllowed()) { + connectionType = QHttpNetworkConnection::ConnectionTypeHTTP; + } + #if QT_CONFIG(ssl) // See qnetworkreplyhttpimpl, delegate's initialization code. Q_ASSERT(!ssl || incomingSslConfiguration.data()); diff --git a/tests/auto/network/access/http2/tst_http2.cpp b/tests/auto/network/access/http2/tst_http2.cpp index 432b35e5c6..4a6e34eb7b 100644 --- a/tests/auto/network/access/http2/tst_http2.cpp +++ b/tests/auto/network/access/http2/tst_http2.cpp @@ -223,6 +223,7 @@ tst_Http2::~tst_Http2() void tst_Http2::init() { manager.reset(new QNetworkAccessManager); + qputenv("QT_NETWORK_H2C_ALLOWED", "1"); } void tst_Http2::singleRequest_data()