diff options
Diffstat (limited to 'src/network/access')
50 files changed, 291 insertions, 286 deletions
diff --git a/src/network/access/access.pri b/src/network/access/access.pri index e8669dcec8..1d6a04a424 100644 --- a/src/network/access/access.pri +++ b/src/network/access/access.pri @@ -1,14 +1,6 @@ # Qt network access module HEADERS += \ - access/qhttpnetworkheader_p.h \ - access/qhttpnetworkrequest_p.h \ - access/qhttpnetworkreply_p.h \ - access/qhttpnetworkconnection_p.h \ - access/qhttpnetworkconnectionchannel_p.h \ - access/qabstractprotocolhandler_p.h \ - access/qhttpprotocolhandler_p.h \ - access/qspdyprotocolhandler_p.h \ access/qnetworkaccessauthenticationmanager_p.h \ access/qnetworkaccessmanager.h \ access/qnetworkaccessmanager_p.h \ @@ -27,28 +19,15 @@ HEADERS += \ access/qnetworkreply_p.h \ access/qnetworkreplyimpl_p.h \ access/qnetworkreplydataimpl_p.h \ - access/qnetworkreplyhttpimpl_p.h \ access/qnetworkreplyfileimpl_p.h \ access/qabstractnetworkcache_p.h \ access/qabstractnetworkcache.h \ - access/qhttpthreaddelegate_p.h \ - access/qhttpmultipart.h \ - access/qhttpmultipart_p.h \ access/qnetworkfile_p.h \ - access/qhttp2protocolhandler_p.h \ access/qhsts_p.h \ access/qhstspolicy.h \ access/qhstsstore_p.h SOURCES += \ - access/qhttpnetworkheader.cpp \ - access/qhttpnetworkrequest.cpp \ - access/qhttpnetworkreply.cpp \ - access/qhttpnetworkconnection.cpp \ - access/qhttpnetworkconnectionchannel.cpp \ - access/qabstractprotocolhandler.cpp \ - access/qhttpprotocolhandler.cpp \ - access/qspdyprotocolhandler.cpp \ access/qnetworkaccessauthenticationmanager.cpp \ access/qnetworkaccessmanager.cpp \ access/qnetworkaccesscache.cpp \ @@ -62,13 +41,9 @@ SOURCES += \ access/qnetworkreply.cpp \ access/qnetworkreplyimpl.cpp \ access/qnetworkreplydataimpl.cpp \ - access/qnetworkreplyhttpimpl.cpp \ access/qnetworkreplyfileimpl.cpp \ access/qabstractnetworkcache.cpp \ - access/qhttpthreaddelegate.cpp \ - access/qhttpmultipart.cpp \ access/qnetworkfile.cpp \ - access/qhttp2protocolhandler.cpp \ access/qhsts.cpp \ access/qhstspolicy.cpp \ access/qhstsstore.cpp @@ -94,4 +69,36 @@ qtConfig(networkdiskcache) { mac: LIBS_PRIVATE += -framework Security include($$PWD/../../3rdparty/zlib_dependency.pri) -include($$PWD/http2/http2.pri) + +qtConfig(http) { + include($$PWD/http2/http2.pri) + + SOURCES += \ + access/qabstractprotocolhandler.cpp \ + access/qhttp2protocolhandler.cpp \ + access/qhttpmultipart.cpp \ + access/qhttpnetworkconnection.cpp \ + access/qhttpnetworkconnectionchannel.cpp \ + access/qhttpnetworkheader.cpp \ + access/qhttpnetworkreply.cpp \ + access/qhttpnetworkrequest.cpp \ + access/qhttpprotocolhandler.cpp \ + access/qhttpthreaddelegate.cpp \ + access/qnetworkreplyhttpimpl.cpp \ + access/qspdyprotocolhandler.cpp + + HEADERS += \ + access/qabstractprotocolhandler_p.h \ + access/qhttp2protocolhandler_p.h \ + access/qhttpmultipart.h \ + access/qhttpmultipart_p.h \ + access/qhttpnetworkconnection_p.h \ + access/qhttpnetworkconnectionchannel_p.h \ + access/qhttpnetworkheader_p.h \ + access/qhttpnetworkreply_p.h \ + access/qhttpnetworkrequest_p.h \ + access/qhttpprotocolhandler_p.h \ + access/qhttpthreaddelegate_p.h \ + access/qnetworkreplyhttpimpl_p.h \ + access/qspdyprotocolhandler_p.h +} 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/http2streams_p.h b/src/network/access/http2/http2streams_p.h index 8465486ae8..0be6b3b253 100644 --- a/src/network/access/http2/http2streams_p.h +++ b/src/network/access/http2/http2streams_p.h @@ -62,6 +62,8 @@ #include <vector> +QT_REQUIRE_CONFIG(http); + QT_BEGIN_NAMESPACE class QNonContiguousByteDevice; 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/qabstractprotocolhandler.cpp b/src/network/access/qabstractprotocolhandler.cpp index d408f3b37a..f15dfe6899 100644 --- a/src/network/access/qabstractprotocolhandler.cpp +++ b/src/network/access/qabstractprotocolhandler.cpp @@ -40,8 +40,6 @@ #include <private/qabstractprotocolhandler_p.h> #include <private/qhttpnetworkconnectionchannel_p.h> -#ifndef QT_NO_HTTP - QT_BEGIN_NAMESPACE QAbstractProtocolHandler::QAbstractProtocolHandler(QHttpNetworkConnectionChannel *channel) @@ -62,5 +60,3 @@ void QAbstractProtocolHandler::setReply(QHttpNetworkReply *reply) } QT_END_NAMESPACE - -#endif // QT_NO_HTTP diff --git a/src/network/access/qabstractprotocolhandler_p.h b/src/network/access/qabstractprotocolhandler_p.h index 30814d6737..04a07734dd 100644 --- a/src/network/access/qabstractprotocolhandler_p.h +++ b/src/network/access/qabstractprotocolhandler_p.h @@ -53,7 +53,7 @@ #include <QtNetwork/private/qtnetworkglobal_p.h> -#ifndef QT_NO_HTTP +QT_REQUIRE_CONFIG(http); QT_BEGIN_NAMESPACE @@ -81,6 +81,4 @@ protected: QT_END_NAMESPACE -#endif // QT_NO_HTTP - #endif // QABSTRACTPROTOCOLHANDLER_H 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 42f1343c52..0cdcee6b59 100644 --- a/src/network/access/qhttp2protocolhandler.cpp +++ b/src/network/access/qhttp2protocolhandler.cpp @@ -40,8 +40,6 @@ #include "qhttpnetworkconnection_p.h" #include "qhttp2protocolhandler_p.h" -#if !defined(QT_NO_HTTP) - #include "http2/bitstreams_p.h" #include <private/qnoncontiguousbytedevice_p.h> @@ -88,7 +86,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; @@ -1511,5 +1510,3 @@ void QHttp2ProtocolHandler::closeSession() } QT_END_NAMESPACE - -#endif // !defined(QT_NO_HTTP) diff --git a/src/network/access/qhttp2protocolhandler_p.h b/src/network/access/qhttp2protocolhandler_p.h index dd209bd0ef..9165808302 100644 --- a/src/network/access/qhttp2protocolhandler_p.h +++ b/src/network/access/qhttp2protocolhandler_p.h @@ -55,8 +55,6 @@ #include <private/qabstractprotocolhandler_p.h> #include <private/qhttpnetworkrequest_p.h> -#if !defined(QT_NO_HTTP) - #include <private/http2protocol_p.h> #include <private/http2streams_p.h> #include <private/http2frames_p.h> @@ -75,6 +73,8 @@ #include <deque> #include <set> +QT_REQUIRE_CONFIG(http); + QT_BEGIN_NAMESPACE class QHttp2ProtocolHandler : public QObject, public QAbstractProtocolHandler @@ -228,6 +228,4 @@ private: QT_END_NAMESPACE -#endif // !defined(QT_NO_HTTP) - #endif diff --git a/src/network/access/qhttpmultipart.h b/src/network/access/qhttpmultipart.h index 6d4531b099..78585a704d 100644 --- a/src/network/access/qhttpmultipart.h +++ b/src/network/access/qhttpmultipart.h @@ -46,6 +46,8 @@ #include <QtCore/QIODevice> #include <QtNetwork/QNetworkRequest> +QT_REQUIRE_CONFIG(http); + QT_BEGIN_NAMESPACE @@ -98,8 +100,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..363e0b346c 100644 --- a/src/network/access/qhttpmultipart_p.h +++ b/src/network/access/qhttpmultipart_p.h @@ -56,6 +56,8 @@ #include "qnetworkrequest_p.h" // for deriving QHttpPartPrivate from QNetworkHeadersPrivate #include "private/qobject_p.h" +QT_REQUIRE_CONFIG(http); + QT_BEGIN_NAMESPACE @@ -124,30 +126,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..842a73a2f9 100644 --- a/src/network/access/qhttpnetworkconnection.cpp +++ b/src/network/access/qhttpnetworkconnection.cpp @@ -53,8 +53,6 @@ #include <qpair.h> #include <qdebug.h> -#ifndef QT_NO_HTTP - #ifndef QT_NO_SSL # include <private/qsslsocket_p.h> # include <QtNetwork/qsslkey.h> @@ -83,10 +81,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 +121,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 +1064,7 @@ void QHttpNetworkConnectionPrivate::_q_startNextRequest() } break; } + case QHttpNetworkConnection::ConnectionTypeHTTP2Direct: case QHttpNetworkConnection::ConnectionTypeHTTP2: case QHttpNetworkConnection::ConnectionTypeSPDY: { if (channels[0].spdyRequestsToSend.isEmpty() && channels[0].switchedToHttp2) @@ -1554,5 +1554,3 @@ void QHttpNetworkConnectionPrivate::emitProxyAuthenticationRequired(const QHttpN QT_END_NAMESPACE #include "moc_qhttpnetworkconnection_p.cpp" - -#endif // QT_NO_HTTP diff --git a/src/network/access/qhttpnetworkconnection_p.h b/src/network/access/qhttpnetworkconnection_p.h index d3450417aa..91827a6eb1 100644 --- a/src/network/access/qhttpnetworkconnection_p.h +++ b/src/network/access/qhttpnetworkconnection_p.h @@ -71,7 +71,7 @@ #include <private/qhttpnetworkconnectionchannel_p.h> -#ifndef QT_NO_HTTP +QT_REQUIRE_CONFIG(http); QT_BEGIN_NAMESPACE @@ -94,7 +94,8 @@ public: enum ConnectionType { ConnectionTypeHTTP, ConnectionTypeSPDY, - ConnectionTypeHTTP2 + ConnectionTypeHTTP2, + ConnectionTypeHTTP2Direct }; #ifndef QT_NO_BEARERMANAGEMENT @@ -295,6 +296,4 @@ public: QT_END_NAMESPACE -#endif // QT_NO_HTTP - #endif diff --git a/src/network/access/qhttpnetworkconnectionchannel.cpp b/src/network/access/qhttpnetworkconnectionchannel.cpp index 094a48a603..0ac14c78f6 100644 --- a/src/network/access/qhttpnetworkconnectionchannel.cpp +++ b/src/network/access/qhttpnetworkconnectionchannel.cpp @@ -45,8 +45,6 @@ #include <qpair.h> #include <qdebug.h> -#ifndef QT_NO_HTTP - #include <private/qhttp2protocolhandler_p.h> #include <private/qhttpprotocolhandler_p.h> #include <private/qspdyprotocolhandler_p.h> @@ -438,6 +436,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 +893,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 +1135,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 +1204,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 +1217,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 @@ -1303,5 +1319,3 @@ void QHttpNetworkConnectionChannel::setConnection(QHttpNetworkConnection *c) QT_END_NAMESPACE #include "moc_qhttpnetworkconnectionchannel_p.cpp" - -#endif // QT_NO_HTTP diff --git a/src/network/access/qhttpnetworkconnectionchannel_p.h b/src/network/access/qhttpnetworkconnectionchannel_p.h index 844a7d5d15..e9cdae5653 100644 --- a/src/network/access/qhttpnetworkconnectionchannel_p.h +++ b/src/network/access/qhttpnetworkconnectionchannel_p.h @@ -68,8 +68,6 @@ #include <private/qhttpnetworkconnection_p.h> #include <private/qabstractprotocolhandler_p.h> -#ifndef QT_NO_HTTP - #ifndef QT_NO_SSL # include <QtNetwork/qsslsocket.h> # include <QtNetwork/qsslerror.h> @@ -80,6 +78,8 @@ #include <QtCore/qscopedpointer.h> +QT_REQUIRE_CONFIG(http); + QT_BEGIN_NAMESPACE class QHttpNetworkRequest; @@ -216,6 +216,4 @@ public: QT_END_NAMESPACE -#endif // QT_NO_HTTP - #endif diff --git a/src/network/access/qhttpnetworkheader.cpp b/src/network/access/qhttpnetworkheader.cpp index 7199abbf17..19a3dfcfe8 100644 --- a/src/network/access/qhttpnetworkheader.cpp +++ b/src/network/access/qhttpnetworkheader.cpp @@ -41,8 +41,6 @@ #include <algorithm> -#ifndef QT_NO_HTTP - QT_BEGIN_NAMESPACE QHttpNetworkHeaderPrivate::QHttpNetworkHeaderPrivate(const QUrl &newUrl) @@ -121,5 +119,3 @@ bool QHttpNetworkHeaderPrivate::operator==(const QHttpNetworkHeaderPrivate &othe QT_END_NAMESPACE - -#endif diff --git a/src/network/access/qhttpnetworkheader_p.h b/src/network/access/qhttpnetworkheader_p.h index 46aec1dd8c..f46c259919 100644 --- a/src/network/access/qhttpnetworkheader_p.h +++ b/src/network/access/qhttpnetworkheader_p.h @@ -53,11 +53,11 @@ #include <QtNetwork/private/qtnetworkglobal_p.h> -#ifndef QT_NO_HTTP - #include <qshareddata.h> #include <qurl.h> +QT_REQUIRE_CONFIG(http); + QT_BEGIN_NAMESPACE class Q_AUTOTEST_EXPORT QHttpNetworkHeader @@ -99,10 +99,6 @@ public: QT_END_NAMESPACE - -#endif // QT_NO_HTTP - - #endif // QHTTPNETWORKHEADER_H diff --git a/src/network/access/qhttpnetworkreply.cpp b/src/network/access/qhttpnetworkreply.cpp index 778ba821e8..a657346958 100644 --- a/src/network/access/qhttpnetworkreply.cpp +++ b/src/network/access/qhttpnetworkreply.cpp @@ -40,8 +40,6 @@ #include "qhttpnetworkreply_p.h" #include "qhttpnetworkconnection_p.h" -#ifndef QT_NO_HTTP - #ifndef QT_NO_SSL # include <QtNetwork/qsslkey.h> # include <QtNetwork/qsslcipher.h> @@ -1035,5 +1033,3 @@ void QHttpNetworkReply::ignoreSslErrors(const QList<QSslError> &errors) QT_END_NAMESPACE - -#endif // QT_NO_HTTP diff --git a/src/network/access/qhttpnetworkreply_p.h b/src/network/access/qhttpnetworkreply_p.h index faab03f056..863e21ea3e 100644 --- a/src/network/access/qhttpnetworkreply_p.h +++ b/src/network/access/qhttpnetworkreply_p.h @@ -53,8 +53,6 @@ #include <QtNetwork/private/qtnetworkglobal_p.h> -#ifndef QT_NO_HTTP - #include <qplatformdefs.h> #ifndef QT_NO_COMPRESS @@ -77,6 +75,8 @@ struct z_stream_s; #include <private/qringbuffer_p.h> #include <private/qbytedata_p.h> +QT_REQUIRE_CONFIG(http); + QT_BEGIN_NAMESPACE class QHttpNetworkConnection; @@ -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; @@ -285,7 +285,4 @@ public: QT_END_NAMESPACE -#endif // QT_NO_HTTP - - #endif // QHTTPNETWORKREPLY_H diff --git a/src/network/access/qhttpnetworkrequest.cpp b/src/network/access/qhttpnetworkrequest.cpp index 60b566299f..3fcf946945 100644 --- a/src/network/access/qhttpnetworkrequest.cpp +++ b/src/network/access/qhttpnetworkrequest.cpp @@ -40,15 +40,13 @@ #include "qhttpnetworkrequest_p.h" #include "private/qnoncontiguousbytedevice_p.h" -#ifndef QT_NO_HTTP - QT_BEGIN_NAMESPACE QHttpNetworkRequestPrivate::QHttpNetworkRequestPrivate(QHttpNetworkRequest::Operation op, 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 +61,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 +84,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 +350,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; @@ -383,5 +393,3 @@ int QHttpNetworkRequest::minorVersion() const QT_END_NAMESPACE -#endif - diff --git a/src/network/access/qhttpnetworkrequest_p.h b/src/network/access/qhttpnetworkrequest_p.h index ecf8856ded..2cbb8e255e 100644 --- a/src/network/access/qhttpnetworkrequest_p.h +++ b/src/network/access/qhttpnetworkrequest_p.h @@ -52,12 +52,12 @@ // #include <QtNetwork/private/qtnetworkglobal_p.h> -#ifndef QT_NO_HTTP - #include <private/qhttpnetworkheader_p.h> #include <QtNetwork/qnetworkrequest.h> #include <qmetatype.h> +QT_REQUIRE_CONFIG(http); + QT_BEGIN_NAMESPACE class QNonContiguousByteDevice; @@ -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; @@ -184,7 +188,4 @@ QT_END_NAMESPACE Q_DECLARE_METATYPE(QHttpNetworkRequest) -#endif // QT_NO_HTTP - - #endif // QHTTPNETWORKREQUEST_H diff --git a/src/network/access/qhttpprotocolhandler.cpp b/src/network/access/qhttpprotocolhandler.cpp index 37e8b9bed8..edcbdcbe0e 100644 --- a/src/network/access/qhttpprotocolhandler.cpp +++ b/src/network/access/qhttpprotocolhandler.cpp @@ -42,8 +42,6 @@ #include <private/qnoncontiguousbytedevice_p.h> #include <private/qhttpnetworkconnectionchannel_p.h> -#ifndef QT_NO_HTTP - QT_BEGIN_NAMESPACE QHttpProtocolHandler::QHttpProtocolHandler(QHttpNetworkConnectionChannel *channel) @@ -437,5 +435,3 @@ bool QHttpProtocolHandler::sendRequest() } QT_END_NAMESPACE - -#endif // QT_NO_HTTP diff --git a/src/network/access/qhttpprotocolhandler_p.h b/src/network/access/qhttpprotocolhandler_p.h index 863b988be3..8e766604bb 100644 --- a/src/network/access/qhttpprotocolhandler_p.h +++ b/src/network/access/qhttpprotocolhandler_p.h @@ -55,7 +55,7 @@ #include <QtNetwork/private/qtnetworkglobal_p.h> #include <private/qabstractprotocolhandler_p.h> -#ifndef QT_NO_HTTP +QT_REQUIRE_CONFIG(http); QT_BEGIN_NAMESPACE @@ -64,13 +64,11 @@ 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 -#endif // QT_NO_HTTP - #endif diff --git a/src/network/access/qhttpthreaddelegate.cpp b/src/network/access/qhttpthreaddelegate.cpp index 3204f8da33..0e97acdd9d 100644 --- a/src/network/access/qhttpthreaddelegate.cpp +++ b/src/network/access/qhttpthreaddelegate.cpp @@ -50,8 +50,6 @@ #include "private/qnetworkaccesscache_p.h" #include "private/qnoncontiguousbytedevice_p.h" -#ifndef QT_NO_HTTP - QT_BEGIN_NAMESPACE static QNetworkReply::NetworkError statusCodeFromHttp(int httpStatusCode, const QUrl &url) @@ -197,7 +195,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 +290,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; @@ -762,6 +766,4 @@ void QHttpThreadDelegate::synchronousProxyAuthenticationRequiredSlot(const QNet #endif -#endif // QT_NO_HTTP - QT_END_NAMESPACE diff --git a/src/network/access/qhttpthreaddelegate_p.h b/src/network/access/qhttpthreaddelegate_p.h index da115d6710..019a8b8b74 100644 --- a/src/network/access/qhttpthreaddelegate_p.h +++ b/src/network/access/qhttpthreaddelegate_p.h @@ -68,7 +68,7 @@ #include "qnetworkaccessauthenticationmanager_p.h" #include <QtNetwork/private/http2protocol_p.h> -#ifndef QT_NO_HTTP +QT_REQUIRE_CONFIG(http); QT_BEGIN_NAMESPACE @@ -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; } @@ -327,6 +327,4 @@ signals: QT_END_NAMESPACE -#endif // QT_NO_HTTP - #endif // QHTTPTHREADDELEGATE_H 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.cpp b/src/network/access/qnetworkaccessmanager.cpp index edf9dee78e..248b4ccd3b 100644 --- a/src/network/access/qnetworkaccessmanager.cpp +++ b/src/network/access/qnetworkaccessmanager.cpp @@ -66,10 +66,12 @@ #include "QtNetwork/private/qauthenticator_p.h" #include "QtNetwork/qsslconfiguration.h" #include "QtNetwork/qnetworkconfigmanager.h" -#include "QtNetwork/qhttpmultipart.h" -#include "qhttpmultipart_p.h" +#if QT_CONFIG(http) +#include "qhttpmultipart.h" +#include "qhttpmultipart_p.h" #include "qnetworkreplyhttpimpl_p.h" +#endif #include "qthread.h" @@ -469,7 +471,7 @@ QNetworkAccessManager::QNetworkAccessManager(QObject *parent) qRegisterMetaType<QSslPreSharedKeyAuthenticator *>(); #endif qRegisterMetaType<QList<QPair<QByteArray,QByteArray> > >(); -#ifndef QT_NO_HTTP +#if QT_CONFIG(http) qRegisterMetaType<QHttpNetworkRequest>(); #endif qRegisterMetaType<QNetworkReply::NetworkError>(); @@ -877,6 +879,7 @@ QNetworkReply *QNetworkAccessManager::post(const QNetworkRequest &request, const return reply; } +#if QT_CONFIG(http) /*! \since 4.8 @@ -916,6 +919,7 @@ QNetworkReply *QNetworkAccessManager::put(const QNetworkRequest &request, QHttpM QNetworkReply *reply = put(newRequest, device); return reply; } +#endif // QT_CONFIG(http) /*! Uploads the contents of \a data to the destination \a request and @@ -1285,6 +1289,7 @@ QNetworkReply *QNetworkAccessManager::sendCustomRequest(const QNetworkRequest &r return reply; } +#if QT_CONFIG(http) /*! \since 5.8 @@ -1306,6 +1311,7 @@ QNetworkReply *QNetworkAccessManager::sendCustomRequest(const QNetworkRequest &r QNetworkReply *reply = sendCustomRequest(newRequest, verb, device); return reply; } +#endif // QT_CONFIG(http) /*! Returns a new QNetworkReply object to handle the operation \a op @@ -1419,7 +1425,7 @@ QNetworkReply *QNetworkAccessManager::createRequest(QNetworkAccessManager::Opera } } -#ifndef QT_NO_HTTP +#if QT_CONFIG(http) // Since Qt 5 we use the new QNetworkReplyHttpImpl if (scheme == QLatin1String("http") || scheme == QLatin1String("preconnect-http") #ifndef QT_NO_SSL @@ -1451,7 +1457,7 @@ QNetworkReply *QNetworkAccessManager::createRequest(QNetworkAccessManager::Opera #endif return reply; } -#endif // QT_NO_HTTP +#endif // QT_CONFIG(http) // first step: create the reply QNetworkReplyImpl *reply = new QNetworkReplyImpl(this); @@ -1527,7 +1533,7 @@ QStringList QNetworkAccessManager::supportedSchemesImplementation() const QStringList schemes = d->backendSupportedSchemes(); // Those ones don't exist in backends -#ifndef QT_NO_HTTP +#if QT_CONFIG(http) schemes << QStringLiteral("http"); #ifndef QT_NO_SSL if (QSslSocket::supportsSsl()) @@ -1992,6 +1998,7 @@ void QNetworkAccessManagerPrivate::_q_networkSessionFailed(QNetworkSession::Sess #endif // QT_NO_BEARERMANAGEMENT +#if QT_CONFIG(http) QNetworkRequest QNetworkAccessManagerPrivate::prepareMultipart(const QNetworkRequest &request, QHttpMultiPart *multiPart) { // copy the request, we probably need to add some headers @@ -2039,6 +2046,7 @@ QNetworkRequest QNetworkAccessManagerPrivate::prepareMultipart(const QNetworkReq return newRequest; } +#endif // QT_CONFIG(http) QT_END_NAMESPACE diff --git a/src/network/access/qnetworkaccessmanager.h b/src/network/access/qnetworkaccessmanager.h index 4806ec0475..a0ce3eddcd 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 @@ -134,14 +134,17 @@ public: QNetworkReply *get(const QNetworkRequest &request); QNetworkReply *post(const QNetworkRequest &request, QIODevice *data); QNetworkReply *post(const QNetworkRequest &request, const QByteArray &data); - QNetworkReply *post(const QNetworkRequest &request, QHttpMultiPart *multiPart); QNetworkReply *put(const QNetworkRequest &request, QIODevice *data); 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); + +#if QT_CONFIG(http) + QNetworkReply *post(const QNetworkRequest &request, QHttpMultiPart *multiPart); + QNetworkReply *put(const QNetworkRequest &request, QHttpMultiPart *multiPart); QNetworkReply *sendCustomRequest(const QNetworkRequest &request, const QByteArray &verb, QHttpMultiPart *multiPart); +#endif #ifndef QT_NO_BEARERMANAGEMENT void setConfiguration(const QNetworkConfiguration &config); @@ -181,7 +184,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/qnetworkaccessmanager_p.h b/src/network/access/qnetworkaccessmanager_p.h index e5257251a4..428110e8bc 100644 --- a/src/network/access/qnetworkaccessmanager_p.h +++ b/src/network/access/qnetworkaccessmanager_p.h @@ -164,7 +164,9 @@ public: #endif +#if QT_CONFIG(http) QNetworkRequest prepareMultipart(const QNetworkRequest &request, QHttpMultiPart *multiPart); +#endif // this is the cache for storing downloaded files QAbstractNetworkCache *networkCache; 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 382da0db5a..96016453c2 100644 --- a/src/network/access/qnetworkreplyhttpimpl.cpp +++ b/src/network/access/qnetworkreplyhttpimpl.cpp @@ -60,8 +60,6 @@ #include "qnetworkcookiejar.h" -#ifndef QT_NO_HTTP - #include <string.h> // for strchr QT_BEGIN_NAMESPACE @@ -773,6 +771,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) @@ -1288,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 { @@ -2375,5 +2381,3 @@ void QNetworkReplyHttpImplPrivate::completeCacheSave() } QT_END_NAMESPACE - -#endif // QT_NO_HTTP diff --git a/src/network/access/qnetworkreplyhttpimpl_p.h b/src/network/access/qnetworkreplyhttpimpl_p.h index 9d47f65ce7..f5f01d0811 100644 --- a/src/network/access/qnetworkreplyhttpimpl_p.h +++ b/src/network/access/qnetworkreplyhttpimpl_p.h @@ -72,7 +72,7 @@ #include <QtNetwork/QSslConfiguration> #endif -#ifndef QT_NO_HTTP +QT_REQUIRE_CONFIG(http); QT_BEGIN_NAMESPACE @@ -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: @@ -315,6 +315,4 @@ public: QT_END_NAMESPACE -#endif // QT_NO_HTTP - #endif 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.cpp b/src/network/access/qspdyprotocolhandler.cpp index 445a2a1c29..403c01e974 100644 --- a/src/network/access/qspdyprotocolhandler.cpp +++ b/src/network/access/qspdyprotocolhandler.cpp @@ -43,7 +43,7 @@ #include <private/qhttpnetworkconnectionchannel_p.h> #include <QtCore/QtEndian> -#if !defined(QT_NO_HTTP) && !defined(QT_NO_SSL) +#if !defined(QT_NO_SSL) QT_BEGIN_NAMESPACE @@ -1294,4 +1294,4 @@ qint32 QSpdyProtocolHandler::generateNextStreamID() QT_END_NAMESPACE -#endif // !defined(QT_NO_HTTP) && !defined(QT_NO_SSL) +#endif // !defined(QT_NO_SSL) diff --git a/src/network/access/qspdyprotocolhandler_p.h b/src/network/access/qspdyprotocolhandler_p.h index 0a18505b23..dd93a9aba2 100644 --- a/src/network/access/qspdyprotocolhandler_p.h +++ b/src/network/access/qspdyprotocolhandler_p.h @@ -58,7 +58,9 @@ #include <zlib.h> -#if !defined(QT_NO_HTTP) && !defined(QT_NO_SSL) +QT_REQUIRE_CONFIG(http); + +#if !defined(QT_NO_SSL) QT_BEGIN_NAMESPACE @@ -101,9 +103,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(); @@ -223,6 +225,6 @@ Q_DECLARE_OPERATORS_FOR_FLAGS(QSpdyProtocolHandler::SETTINGS_ID_Flags) QT_END_NAMESPACE -#endif // !defined(QT_NO_HTTP) && !defined(QT_NO_SSL) +#endif // !defined(QT_NO_SSL) #endif // QSPDYPROTOCOLHANDLER_H |