diff options
Diffstat (limited to 'src/network/access')
37 files changed, 210 insertions, 169 deletions
diff --git a/src/network/access/http2/hpack.cpp b/src/network/access/http2/hpack.cpp index 95e6f9051b..2d324d5092 100644 --- a/src/network/access/http2/hpack.cpp +++ b/src/network/access/http2/hpack.cpp @@ -67,18 +67,6 @@ HeaderSize header_size(const HttpHeader &header) struct BitPattern { - BitPattern() - : value(), - bitLength() - { - } - - BitPattern(uchar v, uchar len) - : value(v), - bitLength(len) - { - } - uchar value; uchar bitLength; }; @@ -102,11 +90,11 @@ using StreamError = BitIStream::Error; // It's always 1 or 0 actually, but the number of bits to extract // from the input stream - differs. -const BitPattern Indexed(1, 1); -const BitPattern LiteralIncrementalIndexing(1, 2); -const BitPattern LiteralNoIndexing(0, 4); -const BitPattern LiteralNeverIndexing(1, 4); -const BitPattern SizeUpdate(1, 3); +const BitPattern Indexed = {1, 1}; +const BitPattern LiteralIncrementalIndexing = {1, 2}; +const BitPattern LiteralNoIndexing = {0, 4}; +const BitPattern LiteralNeverIndexing = {1, 4}; +const BitPattern SizeUpdate = {1, 3}; bool is_literal_field(const BitPattern &pattern) { diff --git a/src/network/access/http2/huffman_p.h b/src/network/access/http2/huffman_p.h index 7195661664..c5324d42b1 100644 --- a/src/network/access/http2/huffman_p.h +++ b/src/network/access/http2/huffman_p.h @@ -62,19 +62,6 @@ namespace HPack struct CodeEntry { - CodeEntry() : byteValue(), - huffmanCode(), - bitLength() - { - } - - CodeEntry(quint32 val, quint32 code, quint32 len) - : byteValue(val), - huffmanCode(code), - bitLength(len) - { - } - quint32 byteValue; quint32 huffmanCode; quint32 bitLength; diff --git a/src/network/access/qabstractnetworkcache.h b/src/network/access/qabstractnetworkcache.h index 33b0bc4ce3..678bae2d6e 100644 --- a/src/network/access/qabstractnetworkcache.h +++ b/src/network/access/qabstractnetworkcache.h @@ -131,7 +131,7 @@ public Q_SLOTS: virtual void clear() = 0; protected: - explicit QAbstractNetworkCache(QObject *parent = Q_NULLPTR); + explicit QAbstractNetworkCache(QObject *parent = nullptr); QAbstractNetworkCache(QAbstractNetworkCachePrivate &dd, QObject *parent); private: diff --git a/src/network/access/qhsts.cpp b/src/network/access/qhsts.cpp index 6a731afc2f..43a8a3663e 100644 --- a/src/network/access/qhsts.cpp +++ b/src/network/access/qhsts.cpp @@ -136,7 +136,7 @@ void QHstsCache::updateKnownHost(const QString &host, const QDateTime &expires, return; } - knownHosts.insert(pos, hostName, newPolicy); + knownHosts.insert(pos, {hostName, newPolicy}); if (hstsStore) hstsStore->addToObserved(newPolicy); return; @@ -144,8 +144,8 @@ void QHstsCache::updateKnownHost(const QString &host, const QDateTime &expires, if (newPolicy.isExpired()) knownHosts.erase(pos); - else if (*pos != newPolicy) - *pos = std::move(newPolicy); + else if (pos->second != newPolicy) + pos->second = std::move(newPolicy); else return; @@ -185,13 +185,13 @@ bool QHstsCache::isKnownHost(const QUrl &url) const while (nameToTest.fragment.size()) { auto const pos = knownHosts.find(nameToTest); if (pos != knownHosts.end()) { - if (pos.value().isExpired()) { + if (pos->second.isExpired()) { knownHosts.erase(pos); if (hstsStore) { // Inform our store that this policy has expired. - hstsStore->addToObserved(pos.value()); + hstsStore->addToObserved(pos->second); } - } else if (!superDomainMatch || pos.value().includesSubDomains()) { + } else if (!superDomainMatch || pos->second.includesSubDomains()) { return true; } } @@ -215,9 +215,9 @@ void QHstsCache::clear() QVector<QHstsPolicy> QHstsCache::policies() const { QVector<QHstsPolicy> values; - values.reserve(knownHosts.size()); + values.reserve(int(knownHosts.size())); for (const auto &host : knownHosts) - values << host; + values << host.second; return values; } diff --git a/src/network/access/qhsts_p.h b/src/network/access/qhsts_p.h index 2feb73b446..bc8708341d 100644 --- a/src/network/access/qhsts_p.h +++ b/src/network/access/qhsts_p.h @@ -61,7 +61,8 @@ #include <QtCore/qglobal.h> #include <QtCore/qpair.h> #include <QtCore/qurl.h> -#include <QtCore/qmap.h> + +#include <map> QT_BEGIN_NAMESPACE @@ -117,7 +118,7 @@ private: QStringRef fragment; }; - mutable QMap<HostName, QHstsPolicy> knownHosts; + mutable std::map<HostName, QHstsPolicy> knownHosts; QHstsStore *hstsStore = nullptr; }; diff --git a/src/network/access/qhttp2protocolhandler.cpp b/src/network/access/qhttp2protocolhandler.cpp index 4b330c491a..c261a8042f 100644 --- a/src/network/access/qhttp2protocolhandler.cpp +++ b/src/network/access/qhttp2protocolhandler.cpp @@ -88,7 +88,8 @@ HPack::HttpHeader build_headers(const QHttpNetworkRequest &request, quint32 maxH if (size.second > maxHeaderListSize) return HttpHeader(); // Bad, we cannot send this request ... - for (const auto &field : request.header()) { + const auto requestHeader = request.header(); + for (const auto &field : requestHeader) { const HeaderSize delta = entry_size(field.first, field.second); if (!delta.first) // Overflow??? break; diff --git a/src/network/access/qhttpmultipart.h b/src/network/access/qhttpmultipart.h index 6d4531b099..9e95e82a77 100644 --- a/src/network/access/qhttpmultipart.h +++ b/src/network/access/qhttpmultipart.h @@ -98,8 +98,8 @@ public: AlternativeType }; - explicit QHttpMultiPart(QObject *parent = Q_NULLPTR); - explicit QHttpMultiPart(ContentType contentType, QObject *parent = Q_NULLPTR); + explicit QHttpMultiPart(QObject *parent = nullptr); + explicit QHttpMultiPart(ContentType contentType, QObject *parent = nullptr); ~QHttpMultiPart(); void append(const QHttpPart &httpPart); diff --git a/src/network/access/qhttpmultipart_p.h b/src/network/access/qhttpmultipart_p.h index a03df9cb13..342ec775b4 100644 --- a/src/network/access/qhttpmultipart_p.h +++ b/src/network/access/qhttpmultipart_p.h @@ -124,30 +124,30 @@ public: ~QHttpMultiPartIODevice() { } - virtual bool atEnd() const Q_DECL_OVERRIDE { + virtual bool atEnd() const override { return readPointer == size(); } - virtual qint64 bytesAvailable() const Q_DECL_OVERRIDE { + virtual qint64 bytesAvailable() const override { return size() - readPointer; } - virtual void close() Q_DECL_OVERRIDE { + virtual void close() override { readPointer = 0; partOffsets.clear(); deviceSize = -1; QIODevice::close(); } - virtual qint64 bytesToWrite() const Q_DECL_OVERRIDE { + virtual qint64 bytesToWrite() const override { return 0; } - virtual qint64 size() const Q_DECL_OVERRIDE; - virtual bool isSequential() const Q_DECL_OVERRIDE; - virtual bool reset() Q_DECL_OVERRIDE; - virtual qint64 readData(char *data, qint64 maxSize) Q_DECL_OVERRIDE; - virtual qint64 writeData(const char *data, qint64 maxSize) Q_DECL_OVERRIDE; + virtual qint64 size() const override; + virtual bool isSequential() const override; + virtual bool reset() override; + virtual qint64 readData(char *data, qint64 maxSize) override; + virtual qint64 writeData(const char *data, qint64 maxSize) override; QHttpMultiPartPrivate *multiPart; qint64 readPointer; diff --git a/src/network/access/qhttpnetworkconnection.cpp b/src/network/access/qhttpnetworkconnection.cpp index e6a15ccfc4..459296bef4 100644 --- a/src/network/access/qhttpnetworkconnection.cpp +++ b/src/network/access/qhttpnetworkconnection.cpp @@ -83,10 +83,11 @@ QHttpNetworkConnectionPrivate::QHttpNetworkConnectionPrivate(const QString &host networkLayerState(Unknown), hostName(hostName), port(port), encrypt(encrypt), delayIpv4(true) , activeChannelCount(type == QHttpNetworkConnection::ConnectionTypeHTTP2 + || type == QHttpNetworkConnection::ConnectionTypeHTTP2Direct #ifndef QT_NO_SSL - || type == QHttpNetworkConnection::ConnectionTypeSPDY + || type == QHttpNetworkConnection::ConnectionTypeSPDY #endif - ? 1 : defaultHttpChannelCount) + ? 1 : defaultHttpChannelCount) , channelCount(defaultHttpChannelCount) #ifndef QT_NO_NETWORKPROXY , networkProxy(QNetworkProxy::NoProxy) @@ -122,7 +123,7 @@ QHttpNetworkConnectionPrivate::~QHttpNetworkConnectionPrivate() { for (int i = 0; i < channelCount; ++i) { if (channels[i].socket) { - QObject::disconnect(channels[i].socket, Q_NULLPTR, &channels[i], Q_NULLPTR); + QObject::disconnect(channels[i].socket, nullptr, &channels[i], nullptr); channels[i].socket->close(); delete channels[i].socket; } @@ -1065,6 +1066,7 @@ void QHttpNetworkConnectionPrivate::_q_startNextRequest() } break; } + case QHttpNetworkConnection::ConnectionTypeHTTP2Direct: case QHttpNetworkConnection::ConnectionTypeHTTP2: case QHttpNetworkConnection::ConnectionTypeSPDY: { if (channels[0].spdyRequestsToSend.isEmpty() && channels[0].switchedToHttp2) diff --git a/src/network/access/qhttpnetworkconnection_p.h b/src/network/access/qhttpnetworkconnection_p.h index d3450417aa..96a7b2e122 100644 --- a/src/network/access/qhttpnetworkconnection_p.h +++ b/src/network/access/qhttpnetworkconnection_p.h @@ -94,7 +94,8 @@ public: enum ConnectionType { ConnectionTypeHTTP, ConnectionTypeSPDY, - ConnectionTypeHTTP2 + ConnectionTypeHTTP2, + ConnectionTypeHTTP2Direct }; #ifndef QT_NO_BEARERMANAGEMENT diff --git a/src/network/access/qhttpnetworkconnectionchannel.cpp b/src/network/access/qhttpnetworkconnectionchannel.cpp index 094a48a603..e6d9c07cef 100644 --- a/src/network/access/qhttpnetworkconnectionchannel.cpp +++ b/src/network/access/qhttpnetworkconnectionchannel.cpp @@ -438,6 +438,10 @@ void QHttpNetworkConnectionChannel::allDone() return; } + // For clear text HTTP/2 we tried to upgrade from HTTP/1.1 to HTTP/2; for + // ConnectionTypeHTTP2Direct we can never be here in case of failure + // (after an attempt to read HTTP/1.1 as HTTP/2 frames) or we have a normal + // HTTP/2 response and thus can skip this test: if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2 && !ssl && !switchedToHttp2) { if (Http2::is_protocol_upgraded(*reply)) { @@ -891,6 +895,14 @@ void QHttpNetworkConnectionChannel::_q_connected() connection->setSslContext(socketSslContext); } #endif + } else if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2Direct) { + state = QHttpNetworkConnectionChannel::IdleState; + protocolHandler.reset(new QHttp2ProtocolHandler(this)); + if (spdyRequestsToSend.count() > 0) { + // In case our peer has sent us its settings (window size, max concurrent streams etc.) + // let's give _q_receiveReply a chance to read them first ('invokeMethod', QueuedConnection). + QMetaObject::invokeMethod(connection, "_q_startNextRequest", Qt::QueuedConnection); + } } else { state = QHttpNetworkConnectionChannel::IdleState; const bool tryProtocolUpgrade = connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2; @@ -1125,7 +1137,10 @@ void QHttpNetworkConnectionChannel::_q_encrypted() QSslSocket *sslSocket = qobject_cast<QSslSocket *>(socket); Q_ASSERT(sslSocket); - if (!protocolHandler) { + if (!protocolHandler && connection->connectionType() != QHttpNetworkConnection::ConnectionTypeHTTP2Direct) { + // ConnectionTypeHTTP2Direct does not rely on ALPN/NPN to negotiate HTTP/2, + // after establishing a secure connection we immediately start sending + // HTTP/2 frames. switch (sslSocket->sslConfiguration().nextProtocolNegotiationStatus()) { case QSslConfiguration::NextProtocolNegotiationNegotiated: case QSslConfiguration::NextProtocolNegotiationUnsupported: { @@ -1191,7 +1206,8 @@ void QHttpNetworkConnectionChannel::_q_encrypted() emitFinishedWithError(QNetworkReply::SslHandshakeFailedError, "detected unknown Next Protocol Negotiation protocol"); } - } else if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2) { + } else if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2 + || connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2Direct) { // We have to reset QHttp2ProtocolHandler's state machine, it's a new // connection and the handler's state is unique per connection. protocolHandler.reset(new QHttp2ProtocolHandler(this)); @@ -1203,10 +1219,12 @@ void QHttpNetworkConnectionChannel::_q_encrypted() pendingEncrypt = false; if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeSPDY || - connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2) { + connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2 || + connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2Direct) { // we call setSpdyWasUsed(true) on the replies in the SPDY handler when the request is sent if (spdyRequestsToSend.count() > 0) { - // wait for data from the server first (e.g. initial window, max concurrent requests) + // In case our peer has sent us its settings (window size, max concurrent streams etc.) + // let's give _q_receiveReply a chance to read them first ('invokeMethod', QueuedConnection). QMetaObject::invokeMethod(connection, "_q_startNextRequest", Qt::QueuedConnection); } } else { // HTTP diff --git a/src/network/access/qhttpnetworkreply_p.h b/src/network/access/qhttpnetworkreply_p.h index faab03f056..d2248740b8 100644 --- a/src/network/access/qhttpnetworkreply_p.h +++ b/src/network/access/qhttpnetworkreply_p.h @@ -92,18 +92,18 @@ public: explicit QHttpNetworkReply(const QUrl &url = QUrl(), QObject *parent = 0); virtual ~QHttpNetworkReply(); - QUrl url() const Q_DECL_OVERRIDE; - void setUrl(const QUrl &url) Q_DECL_OVERRIDE; + QUrl url() const override; + void setUrl(const QUrl &url) override; - int majorVersion() const Q_DECL_OVERRIDE; - int minorVersion() const Q_DECL_OVERRIDE; + int majorVersion() const override; + int minorVersion() const override; - qint64 contentLength() const Q_DECL_OVERRIDE; - void setContentLength(qint64 length) Q_DECL_OVERRIDE; + qint64 contentLength() const override; + void setContentLength(qint64 length) override; - QList<QPair<QByteArray, QByteArray> > header() const Q_DECL_OVERRIDE; - QByteArray headerField(const QByteArray &name, const QByteArray &defaultValue = QByteArray()) const Q_DECL_OVERRIDE; - void setHeaderField(const QByteArray &name, const QByteArray &data) Q_DECL_OVERRIDE; + QList<QPair<QByteArray, QByteArray> > header() const override; + QByteArray headerField(const QByteArray &name, const QByteArray &defaultValue = QByteArray()) const override; + void setHeaderField(const QByteArray &name, const QByteArray &data) override; void parseHeader(const QByteArray &header); // mainly for testing QHttpNetworkRequest request() const; diff --git a/src/network/access/qhttpnetworkrequest.cpp b/src/network/access/qhttpnetworkrequest.cpp index 60b566299f..bd34ac7e05 100644 --- a/src/network/access/qhttpnetworkrequest.cpp +++ b/src/network/access/qhttpnetworkrequest.cpp @@ -48,7 +48,7 @@ QHttpNetworkRequestPrivate::QHttpNetworkRequestPrivate(QHttpNetworkRequest::Oper QHttpNetworkRequest::Priority pri, const QUrl &newUrl) : QHttpNetworkHeaderPrivate(newUrl), operation(op), priority(pri), uploadByteDevice(0), autoDecompress(false), pipeliningAllowed(false), spdyAllowed(false), http2Allowed(false), - withCredentials(true), preConnect(false), redirectCount(0), + http2Direct(false), withCredentials(true), preConnect(false), redirectCount(0), redirectPolicy(QNetworkRequest::ManualRedirectPolicy) { } @@ -63,6 +63,7 @@ QHttpNetworkRequestPrivate::QHttpNetworkRequestPrivate(const QHttpNetworkRequest pipeliningAllowed(other.pipeliningAllowed), spdyAllowed(other.spdyAllowed), http2Allowed(other.http2Allowed), + http2Direct(other.http2Direct), withCredentials(other.withCredentials), ssl(other.ssl), preConnect(other.preConnect), @@ -85,6 +86,7 @@ bool QHttpNetworkRequestPrivate::operator==(const QHttpNetworkRequestPrivate &ot && (pipeliningAllowed == other.pipeliningAllowed) && (spdyAllowed == other.spdyAllowed) && (http2Allowed == other.http2Allowed) + && (http2Direct == other.http2Direct) // we do not clear the customVerb in setOperation && (operation != QHttpNetworkRequest::Custom || (customVerb == other.customVerb)) && (withCredentials == other.withCredentials) @@ -350,6 +352,16 @@ void QHttpNetworkRequest::setHTTP2Allowed(bool b) d->http2Allowed = b; } +bool QHttpNetworkRequest::isHTTP2Direct() const +{ + return d->http2Direct; +} + +void QHttpNetworkRequest::setHTTP2Direct(bool b) +{ + d->http2Direct = 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 ecf8856ded..4fd973cf3f 100644 --- a/src/network/access/qhttpnetworkrequest_p.h +++ b/src/network/access/qhttpnetworkrequest_p.h @@ -90,18 +90,18 @@ public: QHttpNetworkRequest &operator=(const QHttpNetworkRequest &other); bool operator==(const QHttpNetworkRequest &other) const; - QUrl url() const Q_DECL_OVERRIDE; - void setUrl(const QUrl &url) Q_DECL_OVERRIDE; + QUrl url() const override; + void setUrl(const QUrl &url) override; - int majorVersion() const Q_DECL_OVERRIDE; - int minorVersion() const Q_DECL_OVERRIDE; + int majorVersion() const override; + int minorVersion() const override; - qint64 contentLength() const Q_DECL_OVERRIDE; - void setContentLength(qint64 length) Q_DECL_OVERRIDE; + qint64 contentLength() const override; + void setContentLength(qint64 length) override; - QList<QPair<QByteArray, QByteArray> > header() const Q_DECL_OVERRIDE; - QByteArray headerField(const QByteArray &name, const QByteArray &defaultValue = QByteArray()) const Q_DECL_OVERRIDE; - void setHeaderField(const QByteArray &name, const QByteArray &data) Q_DECL_OVERRIDE; + QList<QPair<QByteArray, QByteArray> > header() const override; + QByteArray headerField(const QByteArray &name, const QByteArray &defaultValue = QByteArray()) const override; + void setHeaderField(const QByteArray &name, const QByteArray &data) override; Operation operation() const; void setOperation(Operation operation); @@ -121,6 +121,9 @@ public: bool isHTTP2Allowed() const; void setHTTP2Allowed(bool b); + bool isHTTP2Direct() const; + void setHTTP2Direct(bool b); + bool withCredentials() const; void setWithCredentials(bool b); @@ -172,6 +175,7 @@ public: bool pipeliningAllowed; bool spdyAllowed; bool http2Allowed; + bool http2Direct; bool withCredentials; bool ssl; bool preConnect; diff --git a/src/network/access/qhttpprotocolhandler_p.h b/src/network/access/qhttpprotocolhandler_p.h index 863b988be3..902a7ea0b2 100644 --- a/src/network/access/qhttpprotocolhandler_p.h +++ b/src/network/access/qhttpprotocolhandler_p.h @@ -64,9 +64,9 @@ public: QHttpProtocolHandler(QHttpNetworkConnectionChannel *channel); private: - virtual void _q_receiveReply() Q_DECL_OVERRIDE; - virtual void _q_readyRead() Q_DECL_OVERRIDE; - virtual bool sendRequest() Q_DECL_OVERRIDE; + virtual void _q_receiveReply() override; + virtual void _q_readyRead() override; + virtual bool sendRequest() override; }; QT_END_NAMESPACE diff --git a/src/network/access/qhttpthreaddelegate.cpp b/src/network/access/qhttpthreaddelegate.cpp index 3204f8da33..cfb9ab1139 100644 --- a/src/network/access/qhttpthreaddelegate.cpp +++ b/src/network/access/qhttpthreaddelegate.cpp @@ -197,7 +197,7 @@ public: setShareable(true); } - virtual void dispose() Q_DECL_OVERRIDE + virtual void dispose() override { #if 0 // sample code; do this right with the API Q_ASSERT(!isWorking()); @@ -292,11 +292,17 @@ void QHttpThreadDelegate::startRequest() QHttpNetworkConnection::ConnectionType connectionType = httpRequest.isHTTP2Allowed() ? QHttpNetworkConnection::ConnectionTypeHTTP2 : QHttpNetworkConnection::ConnectionTypeHTTP; + if (httpRequest.isHTTP2Direct()) { + Q_ASSERT(!httpRequest.isHTTP2Allowed()); + connectionType = QHttpNetworkConnection::ConnectionTypeHTTP2Direct; + } + #ifndef QT_NO_SSL if (ssl && !incomingSslConfiguration.data()) incomingSslConfiguration.reset(new QSslConfiguration); if (httpRequest.isHTTP2Allowed() && ssl) { + // With HTTP2Direct we do not try any protocol negotiation. QList<QByteArray> protocols; protocols << QSslConfiguration::ALPNProtocolHTTP2 << QSslConfiguration::NextProtocolHttp1_1; diff --git a/src/network/access/qhttpthreaddelegate_p.h b/src/network/access/qhttpthreaddelegate_p.h index da115d6710..9029d6fce8 100644 --- a/src/network/access/qhttpthreaddelegate_p.h +++ b/src/network/access/qhttpthreaddelegate_p.h @@ -218,12 +218,12 @@ public: { } - qint64 pos() const Q_DECL_OVERRIDE + qint64 pos() const override { return m_pos; } - const char* readPointer(qint64 maximumLength, qint64 &len) Q_DECL_OVERRIDE + const char* readPointer(qint64 maximumLength, qint64 &len) override { if (m_amount > 0) { len = m_amount; @@ -243,7 +243,7 @@ public: return 0; } - bool advanceReadPointer(qint64 a) Q_DECL_OVERRIDE + bool advanceReadPointer(qint64 a) override { if (m_data == 0) return false; @@ -258,7 +258,7 @@ public: return true; } - bool atEnd() const Q_DECL_OVERRIDE + bool atEnd() const override { if (m_amount > 0) return false; @@ -266,7 +266,7 @@ public: return m_atEnd; } - bool reset() Q_DECL_OVERRIDE + bool reset() override { m_amount = 0; m_data = 0; @@ -288,7 +288,7 @@ public: return b; } - qint64 size() const Q_DECL_OVERRIDE + qint64 size() const override { return m_size; } diff --git a/src/network/access/qnetworkaccessauthenticationmanager.cpp b/src/network/access/qnetworkaccessauthenticationmanager.cpp index 2b07833cda..b661cc45b3 100644 --- a/src/network/access/qnetworkaccessauthenticationmanager.cpp +++ b/src/network/access/qnetworkaccessauthenticationmanager.cpp @@ -95,7 +95,7 @@ public: } } - virtual void dispose() Q_DECL_OVERRIDE { delete this; } + virtual void dispose() override { delete this; } }; #ifndef QT_NO_NETWORKPROXY diff --git a/src/network/access/qnetworkaccesscache_p.h b/src/network/access/qnetworkaccesscache_p.h index 3732b5cbb4..69ea649a8a 100644 --- a/src/network/access/qnetworkaccesscache_p.h +++ b/src/network/access/qnetworkaccesscache_p.h @@ -106,7 +106,7 @@ signals: void entryReady(QNetworkAccessCache::CacheableObject *); protected: - void timerEvent(QTimerEvent *) Q_DECL_OVERRIDE; + void timerEvent(QTimerEvent *) override; private: // idea copied from qcache.h diff --git a/src/network/access/qnetworkaccesscachebackend_p.h b/src/network/access/qnetworkaccesscachebackend_p.h index 8db1a6b1d5..dfb0ce84d9 100644 --- a/src/network/access/qnetworkaccesscachebackend_p.h +++ b/src/network/access/qnetworkaccesscachebackend_p.h @@ -65,12 +65,12 @@ public: QNetworkAccessCacheBackend(); ~QNetworkAccessCacheBackend(); - void open() Q_DECL_OVERRIDE; - void closeDownstreamChannel() Q_DECL_OVERRIDE; + void open() override; + void closeDownstreamChannel() override; void closeUpstreamChannel(); void upstreamReadyRead(); - void downstreamReadyWrite() Q_DECL_OVERRIDE; + void downstreamReadyWrite() override; private: bool sendCacheContents(); diff --git a/src/network/access/qnetworkaccessdebugpipebackend_p.h b/src/network/access/qnetworkaccessdebugpipebackend_p.h index 1d1af61dbd..d9a7aabdad 100644 --- a/src/network/access/qnetworkaccessdebugpipebackend_p.h +++ b/src/network/access/qnetworkaccessdebugpipebackend_p.h @@ -68,10 +68,10 @@ public: QNetworkAccessDebugPipeBackend(); virtual ~QNetworkAccessDebugPipeBackend(); - virtual void open() Q_DECL_OVERRIDE; - virtual void closeDownstreamChannel() Q_DECL_OVERRIDE; + virtual void open() override; + virtual void closeDownstreamChannel() override; - virtual void downstreamReadyWrite() Q_DECL_OVERRIDE; + virtual void downstreamReadyWrite() override; protected: void pushFromSocketToDownstream(); @@ -101,9 +101,9 @@ private: class QNetworkAccessDebugPipeBackendFactory: public QNetworkAccessBackendFactory { public: - virtual QStringList supportedSchemes() const Q_DECL_OVERRIDE; + virtual QStringList supportedSchemes() const override; virtual QNetworkAccessBackend *create(QNetworkAccessManager::Operation op, - const QNetworkRequest &request) const Q_DECL_OVERRIDE; + const QNetworkRequest &request) const override; }; #endif // QT_BUILD_INTERNAL diff --git a/src/network/access/qnetworkaccessfilebackend_p.h b/src/network/access/qnetworkaccessfilebackend_p.h index 081ff2b9e7..2c01fb1121 100644 --- a/src/network/access/qnetworkaccessfilebackend_p.h +++ b/src/network/access/qnetworkaccessfilebackend_p.h @@ -66,10 +66,10 @@ public: QNetworkAccessFileBackend(); virtual ~QNetworkAccessFileBackend(); - virtual void open() Q_DECL_OVERRIDE; - virtual void closeDownstreamChannel() Q_DECL_OVERRIDE; + virtual void open() override; + virtual void closeDownstreamChannel() override; - virtual void downstreamReadyWrite() Q_DECL_OVERRIDE; + virtual void downstreamReadyWrite() override; public slots: void uploadReadyReadSlot(); @@ -87,9 +87,9 @@ private: class QNetworkAccessFileBackendFactory: public QNetworkAccessBackendFactory { public: - virtual QStringList supportedSchemes() const Q_DECL_OVERRIDE; + virtual QStringList supportedSchemes() const override; virtual QNetworkAccessBackend *create(QNetworkAccessManager::Operation op, - const QNetworkRequest &request) const Q_DECL_OVERRIDE; + const QNetworkRequest &request) const override; }; QT_END_NAMESPACE diff --git a/src/network/access/qnetworkaccessftpbackend.cpp b/src/network/access/qnetworkaccessftpbackend.cpp index 0df2569e87..c5404e4221 100644 --- a/src/network/access/qnetworkaccessftpbackend.cpp +++ b/src/network/access/qnetworkaccessftpbackend.cpp @@ -94,7 +94,7 @@ public: setShareable(false); } - void dispose() Q_DECL_OVERRIDE + void dispose() override { connect(this, SIGNAL(done(bool)), this, SLOT(deleteLater())); close(); diff --git a/src/network/access/qnetworkaccessftpbackend_p.h b/src/network/access/qnetworkaccessftpbackend_p.h index 0f26d05327..4bd082fb67 100644 --- a/src/network/access/qnetworkaccessftpbackend_p.h +++ b/src/network/access/qnetworkaccessftpbackend_p.h @@ -84,10 +84,10 @@ public: QNetworkAccessFtpBackend(); virtual ~QNetworkAccessFtpBackend(); - virtual void open() Q_DECL_OVERRIDE; - virtual void closeDownstreamChannel() Q_DECL_OVERRIDE; + virtual void open() override; + virtual void closeDownstreamChannel() override; - virtual void downstreamReadyWrite() Q_DECL_OVERRIDE; + virtual void downstreamReadyWrite() override; enum CacheCleanupMode { ReleaseCachedConnection, @@ -115,9 +115,9 @@ private: class QNetworkAccessFtpBackendFactory: public QNetworkAccessBackendFactory { public: - virtual QStringList supportedSchemes() const Q_DECL_OVERRIDE; + virtual QStringList supportedSchemes() const override; virtual QNetworkAccessBackend *create(QNetworkAccessManager::Operation op, - const QNetworkRequest &request) const Q_DECL_OVERRIDE; + const QNetworkRequest &request) const override; }; QT_END_NAMESPACE diff --git a/src/network/access/qnetworkaccessmanager.h b/src/network/access/qnetworkaccessmanager.h index 4806ec0475..9cbf8a48d5 100644 --- a/src/network/access/qnetworkaccessmanager.h +++ b/src/network/access/qnetworkaccessmanager.h @@ -100,7 +100,7 @@ public: Q_ENUM(NetworkAccessibility) #endif - explicit QNetworkAccessManager(QObject *parent = Q_NULLPTR); + explicit QNetworkAccessManager(QObject *parent = nullptr); ~QNetworkAccessManager(); // ### Qt 6: turn into virtual @@ -139,7 +139,7 @@ public: QNetworkReply *put(const QNetworkRequest &request, const QByteArray &data); QNetworkReply *put(const QNetworkRequest &request, QHttpMultiPart *multiPart); QNetworkReply *deleteResource(const QNetworkRequest &request); - QNetworkReply *sendCustomRequest(const QNetworkRequest &request, const QByteArray &verb, QIODevice *data = Q_NULLPTR); + QNetworkReply *sendCustomRequest(const QNetworkRequest &request, const QByteArray &verb, QIODevice *data = nullptr); QNetworkReply *sendCustomRequest(const QNetworkRequest &request, const QByteArray &verb, const QByteArray &data); QNetworkReply *sendCustomRequest(const QNetworkRequest &request, const QByteArray &verb, QHttpMultiPart *multiPart); @@ -181,7 +181,7 @@ Q_SIGNALS: protected: virtual QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, - QIODevice *outgoingData = Q_NULLPTR); + QIODevice *outgoingData = nullptr); protected Q_SLOTS: QStringList supportedSchemesImplementation() const; diff --git a/src/network/access/qnetworkcookiejar.h b/src/network/access/qnetworkcookiejar.h index f9c1549e20..c3b2200443 100644 --- a/src/network/access/qnetworkcookiejar.h +++ b/src/network/access/qnetworkcookiejar.h @@ -54,7 +54,7 @@ class Q_NETWORK_EXPORT QNetworkCookieJar: public QObject { Q_OBJECT public: - explicit QNetworkCookieJar(QObject *parent = Q_NULLPTR); + explicit QNetworkCookieJar(QObject *parent = nullptr); virtual ~QNetworkCookieJar(); virtual QList<QNetworkCookie> cookiesForUrl(const QUrl &url) const; diff --git a/src/network/access/qnetworkdiskcache.h b/src/network/access/qnetworkdiskcache.h index 0e9258f6de..ff7d3192e8 100644 --- a/src/network/access/qnetworkdiskcache.h +++ b/src/network/access/qnetworkdiskcache.h @@ -53,7 +53,7 @@ class Q_NETWORK_EXPORT QNetworkDiskCache : public QAbstractNetworkCache Q_OBJECT public: - explicit QNetworkDiskCache(QObject *parent = Q_NULLPTR); + explicit QNetworkDiskCache(QObject *parent = nullptr); ~QNetworkDiskCache(); QString cacheDirectory() const; @@ -62,18 +62,18 @@ public: qint64 maximumCacheSize() const; void setMaximumCacheSize(qint64 size); - qint64 cacheSize() const Q_DECL_OVERRIDE; - QNetworkCacheMetaData metaData(const QUrl &url) Q_DECL_OVERRIDE; - void updateMetaData(const QNetworkCacheMetaData &metaData) Q_DECL_OVERRIDE; - QIODevice *data(const QUrl &url) Q_DECL_OVERRIDE; - bool remove(const QUrl &url) Q_DECL_OVERRIDE; - QIODevice *prepare(const QNetworkCacheMetaData &metaData) Q_DECL_OVERRIDE; - void insert(QIODevice *device) Q_DECL_OVERRIDE; + qint64 cacheSize() const override; + QNetworkCacheMetaData metaData(const QUrl &url) override; + void updateMetaData(const QNetworkCacheMetaData &metaData) override; + QIODevice *data(const QUrl &url) override; + bool remove(const QUrl &url) override; + QIODevice *prepare(const QNetworkCacheMetaData &metaData) override; + void insert(QIODevice *device) override; QNetworkCacheMetaData fileMetaData(const QString &fileName) const; public Q_SLOTS: - void clear() Q_DECL_OVERRIDE; + void clear() override; protected: virtual qint64 expire(); diff --git a/src/network/access/qnetworkfile_p.h b/src/network/access/qnetworkfile_p.h index dd56b24bd8..e788308d82 100644 --- a/src/network/access/qnetworkfile_p.h +++ b/src/network/access/qnetworkfile_p.h @@ -67,7 +67,7 @@ public: public Q_SLOTS: void open(); - void close() Q_DECL_OVERRIDE; + void close() override; Q_SIGNALS: void finished(bool ok); diff --git a/src/network/access/qnetworkreply.h b/src/network/access/qnetworkreply.h index d858e07d84..63c2752caf 100644 --- a/src/network/access/qnetworkreply.h +++ b/src/network/access/qnetworkreply.h @@ -114,8 +114,8 @@ public: ~QNetworkReply(); // reimplemented from QIODevice - virtual void close() Q_DECL_OVERRIDE; - virtual bool isSequential() const Q_DECL_OVERRIDE; + virtual void close() override; + virtual bool isSequential() const override; // like QAbstractSocket: qint64 readBufferSize() const; @@ -169,9 +169,9 @@ Q_SIGNALS: void downloadProgress(qint64 bytesReceived, qint64 bytesTotal); protected: - explicit QNetworkReply(QObject *parent = Q_NULLPTR); + explicit QNetworkReply(QObject *parent = nullptr); QNetworkReply(QNetworkReplyPrivate &dd, QObject *parent); - virtual qint64 writeData(const char *data, qint64 len) Q_DECL_OVERRIDE; + virtual qint64 writeData(const char *data, qint64 len) override; void setOperation(QNetworkAccessManager::Operation operation); void setRequest(const QNetworkRequest &request); diff --git a/src/network/access/qnetworkreplydataimpl_p.h b/src/network/access/qnetworkreplydataimpl_p.h index c8b44d7539..81d2110d69 100644 --- a/src/network/access/qnetworkreplydataimpl_p.h +++ b/src/network/access/qnetworkreplydataimpl_p.h @@ -67,15 +67,15 @@ class QNetworkReplyDataImpl: public QNetworkReply public: QNetworkReplyDataImpl(QObject *parent, const QNetworkRequest &req, const QNetworkAccessManager::Operation op); ~QNetworkReplyDataImpl(); - virtual void abort() Q_DECL_OVERRIDE; + virtual void abort() override; // reimplemented from QNetworkReply - virtual void close() Q_DECL_OVERRIDE; - virtual qint64 bytesAvailable() const Q_DECL_OVERRIDE; - virtual bool isSequential () const Q_DECL_OVERRIDE; - qint64 size() const Q_DECL_OVERRIDE; + virtual void close() override; + virtual qint64 bytesAvailable() const override; + virtual bool isSequential () const override; + qint64 size() const override; - virtual qint64 readData(char *data, qint64 maxlen) Q_DECL_OVERRIDE; + virtual qint64 readData(char *data, qint64 maxlen) override; Q_DECLARE_PRIVATE(QNetworkReplyDataImpl) }; diff --git a/src/network/access/qnetworkreplyfileimpl_p.h b/src/network/access/qnetworkreplyfileimpl_p.h index d6af66152e..55aece0bed 100644 --- a/src/network/access/qnetworkreplyfileimpl_p.h +++ b/src/network/access/qnetworkreplyfileimpl_p.h @@ -67,15 +67,15 @@ class QNetworkReplyFileImpl: public QNetworkReply public: QNetworkReplyFileImpl(QNetworkAccessManager *manager, const QNetworkRequest &req, const QNetworkAccessManager::Operation op); ~QNetworkReplyFileImpl(); - virtual void abort() Q_DECL_OVERRIDE; + virtual void abort() override; // reimplemented from QNetworkReply - virtual void close() Q_DECL_OVERRIDE; - virtual qint64 bytesAvailable() const Q_DECL_OVERRIDE; - virtual bool isSequential () const Q_DECL_OVERRIDE; - qint64 size() const Q_DECL_OVERRIDE; + virtual void close() override; + virtual qint64 bytesAvailable() const override; + virtual bool isSequential () const override; + qint64 size() const override; - virtual qint64 readData(char *data, qint64 maxlen) Q_DECL_OVERRIDE; + virtual qint64 readData(char *data, qint64 maxlen) override; private Q_SLOTS: void fileOpenFinished(bool isOpen); diff --git a/src/network/access/qnetworkreplyhttpimpl.cpp b/src/network/access/qnetworkreplyhttpimpl.cpp index 46a2f2f208..1ece623061 100644 --- a/src/network/access/qnetworkreplyhttpimpl.cpp +++ b/src/network/access/qnetworkreplyhttpimpl.cpp @@ -772,6 +772,12 @@ void QNetworkReplyHttpImplPrivate::postRequest(const QNetworkRequest &newHttpReq if (request.attribute(QNetworkRequest::HTTP2AllowedAttribute).toBool()) httpRequest.setHTTP2Allowed(true); + if (request.attribute(QNetworkRequest::Http2DirectAttribute).toBool()) { + // Intentionally mutually exclusive - cannot be both direct and 'allowed' + httpRequest.setHTTP2Direct(true); + httpRequest.setHTTP2Allowed(false); + } + if (static_cast<QNetworkRequest::LoadControl> (newHttpRequest.attribute(QNetworkRequest::AuthenticationReuseAttribute, QNetworkRequest::Automatic).toInt()) == QNetworkRequest::Manual) @@ -1286,7 +1292,9 @@ void QNetworkReplyHttpImplPrivate::replyDownloadMetaData(const QList<QPair<QByte q->setAttribute(QNetworkRequest::HttpPipeliningWasUsedAttribute, pu); const QVariant http2Allowed = request.attribute(QNetworkRequest::HTTP2AllowedAttribute); - if (http2Allowed.isValid() && http2Allowed.toBool()) { + const QVariant http2Direct = request.attribute(QNetworkRequest::Http2DirectAttribute); + if ((http2Allowed.isValid() && http2Allowed.toBool()) + || (http2Direct.isValid() && http2Direct.toBool())) { q->setAttribute(QNetworkRequest::HTTP2WasUsedAttribute, spdyWasUsed); q->setAttribute(QNetworkRequest::SpdyWasUsedAttribute, false); } else { diff --git a/src/network/access/qnetworkreplyhttpimpl_p.h b/src/network/access/qnetworkreplyhttpimpl_p.h index 9d47f65ce7..8d2bd132b0 100644 --- a/src/network/access/qnetworkreplyhttpimpl_p.h +++ b/src/network/access/qnetworkreplyhttpimpl_p.h @@ -86,14 +86,14 @@ public: QNetworkReplyHttpImpl(QNetworkAccessManager* const, const QNetworkRequest&, QNetworkAccessManager::Operation&, QIODevice* outgoingData); virtual ~QNetworkReplyHttpImpl(); - void close() Q_DECL_OVERRIDE; - void abort() Q_DECL_OVERRIDE; - qint64 bytesAvailable() const Q_DECL_OVERRIDE; - bool isSequential () const Q_DECL_OVERRIDE; - qint64 size() const Q_DECL_OVERRIDE; - qint64 readData(char*, qint64) Q_DECL_OVERRIDE; - void setReadBufferSize(qint64 size) Q_DECL_OVERRIDE; - bool canReadLine () const Q_DECL_OVERRIDE; + void close() override; + void abort() override; + qint64 bytesAvailable() const override; + bool isSequential () const override; + qint64 size() const override; + qint64 readData(char*, qint64) override; + void setReadBufferSize(qint64 size) override; + bool canReadLine () const override; Q_DECLARE_PRIVATE(QNetworkReplyHttpImpl) Q_PRIVATE_SLOT(d_func(), void _q_startOperation()) @@ -141,10 +141,10 @@ public: #ifndef QT_NO_SSL protected: - void ignoreSslErrors() Q_DECL_OVERRIDE; - void ignoreSslErrorsImplementation(const QList<QSslError> &errors) Q_DECL_OVERRIDE; - void setSslConfigurationImplementation(const QSslConfiguration &configuration) Q_DECL_OVERRIDE; - void sslConfigurationImplementation(QSslConfiguration &configuration) const Q_DECL_OVERRIDE; + void ignoreSslErrors() override; + void ignoreSslErrorsImplementation(const QList<QSslError> &errors) override; + void setSslConfigurationImplementation(const QSslConfiguration &configuration) override; + void sslConfigurationImplementation(QSslConfiguration &configuration) const override; #endif signals: diff --git a/src/network/access/qnetworkreplyimpl_p.h b/src/network/access/qnetworkreplyimpl_p.h index 7cd99392d3..f4e8284ab6 100644 --- a/src/network/access/qnetworkreplyimpl_p.h +++ b/src/network/access/qnetworkreplyimpl_p.h @@ -76,15 +76,15 @@ class QNetworkReplyImpl: public QNetworkReply public: QNetworkReplyImpl(QObject *parent = 0); ~QNetworkReplyImpl(); - virtual void abort() Q_DECL_OVERRIDE; + virtual void abort() override; // reimplemented from QNetworkReply / QIODevice - virtual void close() Q_DECL_OVERRIDE; - virtual qint64 bytesAvailable() const Q_DECL_OVERRIDE; - virtual void setReadBufferSize(qint64 size) Q_DECL_OVERRIDE; + virtual void close() override; + virtual qint64 bytesAvailable() const override; + virtual void setReadBufferSize(qint64 size) override; - virtual qint64 readData(char *data, qint64 maxlen) Q_DECL_OVERRIDE; - virtual bool event(QEvent *) Q_DECL_OVERRIDE; + virtual qint64 readData(char *data, qint64 maxlen) override; + virtual bool event(QEvent *) override; Q_DECLARE_PRIVATE(QNetworkReplyImpl) Q_PRIVATE_SLOT(d_func(), void _q_startOperation()) @@ -101,10 +101,10 @@ public: #ifndef QT_NO_SSL protected: - void sslConfigurationImplementation(QSslConfiguration &configuration) const Q_DECL_OVERRIDE; - void setSslConfigurationImplementation(const QSslConfiguration &configuration) Q_DECL_OVERRIDE; - virtual void ignoreSslErrors() Q_DECL_OVERRIDE; - virtual void ignoreSslErrorsImplementation(const QList<QSslError> &errors) Q_DECL_OVERRIDE; + void sslConfigurationImplementation(QSslConfiguration &configuration) const override; + void setSslConfigurationImplementation(const QSslConfiguration &configuration) override; + virtual void ignoreSslErrors() override; + virtual void ignoreSslErrorsImplementation(const QList<QSslError> &errors) override; #endif }; @@ -219,9 +219,9 @@ public: QNetworkAccessManager::Operation op); ~QDisabledNetworkReply(); - void abort() Q_DECL_OVERRIDE { } + void abort() override { } protected: - qint64 readData(char *, qint64) Q_DECL_OVERRIDE { return -1; } + qint64 readData(char *, qint64) override { return -1; } }; #endif diff --git a/src/network/access/qnetworkrequest.cpp b/src/network/access/qnetworkrequest.cpp index 60701d45be..277190b3bd 100644 --- a/src/network/access/qnetworkrequest.cpp +++ b/src/network/access/qnetworkrequest.cpp @@ -298,6 +298,18 @@ QT_BEGIN_NAMESPACE This attribute obsoletes FollowRedirectsAttribute. (This value was introduced in 5.9.) + \value Http2DirectAttribute + Requests only, type: QMetaType::Bool (default: false) + If set, this attribute will force QNetworkAccessManager to use + HTTP/2 protocol without initial HTTP/2 protocol negotiation. + Use of this attribute implies prior knowledge that a particular + server supports HTTP/2. The attribute works with SSL or 'cleartext' + HTTP/2. If a server turns out to not support HTTP/2, when HTTP/2 direct + was specified, QNetworkAccessManager gives up, without attempting to + fall back to HTTP/1.1. If both HTTP2AllowedAttribute and + Http2DirectAttribute are set, Http2DirectAttribute takes priority. + (This value was introduced in 5.10.) + \value User Special type. Additional information can be passed in QVariants with types ranging from User to UserMax. The default diff --git a/src/network/access/qnetworkrequest.h b/src/network/access/qnetworkrequest.h index 68d4ae6d6b..cddd81bd19 100644 --- a/src/network/access/qnetworkrequest.h +++ b/src/network/access/qnetworkrequest.h @@ -92,6 +92,7 @@ public: HTTP2WasUsedAttribute, OriginalContentLengthAttribute, RedirectPolicyAttribute, + Http2DirectAttribute, User = 1000, UserMax = 32767 diff --git a/src/network/access/qspdyprotocolhandler_p.h b/src/network/access/qspdyprotocolhandler_p.h index 0a18505b23..bfc2390ccc 100644 --- a/src/network/access/qspdyprotocolhandler_p.h +++ b/src/network/access/qspdyprotocolhandler_p.h @@ -101,9 +101,9 @@ public: Q_DECLARE_FLAGS(SETTINGS_ID_Flags, SETTINGS_ID_Flag) - virtual void _q_receiveReply() Q_DECL_OVERRIDE; - virtual void _q_readyRead() Q_DECL_OVERRIDE; - virtual bool sendRequest() Q_DECL_OVERRIDE; + virtual void _q_receiveReply() override; + virtual void _q_readyRead() override; + virtual bool sendRequest() override; private slots: void _q_uploadDataReadyRead(); |