diff options
-rw-r--r-- | src/network/access/http2/http2protocol_p.h | 3 | ||||
-rw-r--r-- | src/network/access/qhttp2configuration.cpp | 2 | ||||
-rw-r--r-- | src/network/access/qnetworkrequest.cpp | 9 | ||||
-rw-r--r-- | tests/auto/network/access/http2/tst_http2.cpp | 7 |
4 files changed, 14 insertions, 7 deletions
diff --git a/src/network/access/http2/http2protocol_p.h b/src/network/access/http2/http2protocol_p.h index d19208895a4..e5068ad81a3 100644 --- a/src/network/access/http2/http2protocol_p.h +++ b/src/network/access/http2/http2protocol_p.h @@ -112,7 +112,8 @@ const quint32 lastValidStreamID((quint32(1) << 31) - 1); // HTTP/2, 5.1.1 // HTTP/2 servers are not afraid to immediately set it to the possible max, // we do the same and split this window size between our concurrent streams. const qint32 maxSessionReceiveWindowSize((quint32(1) << 31) - 1); -const qint32 qtDefaultStreamReceiveWindowSize = maxSessionReceiveWindowSize / maxConcurrentStreams; +// Presumably, we never use up to 100 streams so let it be 10 simultaneous: +const qint32 qtDefaultStreamReceiveWindowSize = maxSessionReceiveWindowSize / 10; struct Frame configurationToSettingsFrame(const QHttp2Configuration &configuration); QByteArray settingsFrameToBase64(const Frame &settingsFrame); diff --git a/src/network/access/qhttp2configuration.cpp b/src/network/access/qhttp2configuration.cpp index f0dcb95facc..b718ddc7559 100644 --- a/src/network/access/qhttp2configuration.cpp +++ b/src/network/access/qhttp2configuration.cpp @@ -217,7 +217,7 @@ bool QHttp2Configuration::setStreamReceiveWindowSize(unsigned size) /*! Returns the window size for stream-level flow control. The default value QNetworkAccessManager will be using is - 65535 octets (see \l {https://httpwg.org/specs/rfc7540.html#SettingValues}{RFC 7540}). + 214748364 octets (see \l {https://httpwg.org/specs/rfc7540.html#SettingValues}{RFC 7540}). */ unsigned QHttp2Configuration::streamReceiveWindowSize() const { diff --git a/src/network/access/qnetworkrequest.cpp b/src/network/access/qnetworkrequest.cpp index 07eaf2f484e..9edbd1ff105 100644 --- a/src/network/access/qnetworkrequest.cpp +++ b/src/network/access/qnetworkrequest.cpp @@ -481,10 +481,9 @@ QNetworkRequest::QNetworkRequest() // Initial values proposed by RFC 7540 are quite draconian, but we // know about servers configured with this value as maximum possible, // rejecting our SETTINGS frame and sending us a GOAWAY frame with the - // flow control error set. Unless an application sets its own parameters, - // we don't send SETTINGS_INITIAL_WINDOW_SIZE, but increase - // (via WINDOW_UPDATE) the session window size. These are our 'defaults': - d->h2Configuration.setStreamReceiveWindowSize(Http2::defaultSessionWindowSize); + // flow control error set. If this causes a problem - the app should + // set a proper configuration. We'll use our defaults, as documented. + d->h2Configuration.setStreamReceiveWindowSize(Http2::qtDefaultStreamReceiveWindowSize); d->h2Configuration.setSessionReceiveWindowSize(Http2::maxSessionReceiveWindowSize); d->h2Configuration.setServerPushEnabled(false); #endif // QT_CONFIG(http) @@ -859,7 +858,7 @@ void QNetworkRequest::setPeerVerifyName(const QString &peerName) \list \li Window size for connection-level flowcontrol is 2147483647 octets - \li Window size for stream-level flowcontrol is 21474836 octets + \li Window size for stream-level flowcontrol is 214748364 octets \li Max frame size is 16384 \endlist diff --git a/tests/auto/network/access/http2/tst_http2.cpp b/tests/auto/network/access/http2/tst_http2.cpp index bb2437c7f52..5525fd76300 100644 --- a/tests/auto/network/access/http2/tst_http2.cpp +++ b/tests/auto/network/access/http2/tst_http2.cpp @@ -69,6 +69,7 @@ public slots: void init(); private slots: // Tests: + void defaultQnamHttp2Configuration(); void singleRequest_data(); void singleRequest(); void multipleRequests(); @@ -208,6 +209,12 @@ void tst_Http2::init() manager.reset(new QNetworkAccessManager); } +void tst_Http2::defaultQnamHttp2Configuration() +{ + // The configuration we also implicitly use in QNAM. + QCOMPARE(qt_defaultH2Configuration(), QNetworkRequest().http2Configuration()); +} + void tst_Http2::singleRequest_data() { QTest::addColumn<QNetworkRequest::Attribute>("h2Attribute"); |