diff options
Diffstat (limited to 'src/network/access/qnetworkaccessmanager.cpp')
-rw-r--r-- | src/network/access/qnetworkaccessmanager.cpp | 37 |
1 files changed, 28 insertions, 9 deletions
diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp index 4e13c9924b..ae99721758 100644 --- a/src/network/access/qnetworkaccessmanager.cpp +++ b/src/network/access/qnetworkaccessmanager.cpp @@ -1220,6 +1220,13 @@ QNetworkReply *QNetworkAccessManager::createRequest(QNetworkAccessManager::Opera bool isLocalFile = req.url().isLocalFile(); QString scheme = req.url().scheme(); + // Remap local+http to unix+http to make further processing easier + if (scheme == "local+http"_L1) { + scheme = u"unix+http"_s; + QUrl url = req.url(); + url.setScheme(scheme); + req.setUrl(url); + } // fast path for GET on file:// URLs // The QNetworkAccessFileBackend will right now only be used for PUT @@ -1255,12 +1262,14 @@ QNetworkReply *QNetworkAccessManager::createRequest(QNetworkAccessManager::Opera } } QNetworkRequest request = req; + auto h = request.headers(); #ifndef Q_OS_WASM // Content-length header is not allowed to be set by user in wasm - if (!request.header(QNetworkRequest::ContentLengthHeader).isValid() && + if (!h.contains(QHttpHeaders::WellKnownHeader::ContentLength) && outgoingData && !outgoingData->isSequential()) { // request has no Content-Length // but the data that is outgoing is random-access - request.setHeader(QNetworkRequest::ContentLengthHeader, outgoingData->size()); + h.append(QHttpHeaders::WellKnownHeader::ContentLength, + QByteArray::number(outgoingData->size())); } #endif if (static_cast<QNetworkRequest::LoadControl> @@ -1269,9 +1278,11 @@ QNetworkReply *QNetworkAccessManager::createRequest(QNetworkAccessManager::Opera if (d->cookieJar) { QList<QNetworkCookie> cookies = d->cookieJar->cookiesForUrl(request.url()); if (!cookies.isEmpty()) - request.setHeader(QNetworkRequest::CookieHeader, QVariant::fromValue(cookies)); + h.replaceOrAppend(QHttpHeaders::WellKnownHeader::Cookie, + QNetworkHeadersPrivate::fromCookieList(cookies)); } } + request.setHeaders(std::move(h)); #ifdef Q_OS_WASM Q_UNUSED(isLocalFile); // Support http, https, and relative urls @@ -1292,11 +1303,15 @@ QNetworkReply *QNetworkAccessManager::createRequest(QNetworkAccessManager::Opera u"https", u"preconnect-https", #endif + u"unix+http", }; // Since Qt 5 we use the new QNetworkReplyHttpImpl if (std::find(std::begin(httpSchemes), std::end(httpSchemes), scheme) != std::end(httpSchemes)) { + #ifndef QT_NO_SSL - if (isStrictTransportSecurityEnabled() && d->stsCache.isKnownHost(request.url())) { + const bool isLocalSocket = scheme.startsWith("unix"_L1); + if (!isLocalSocket && isStrictTransportSecurityEnabled() + && d->stsCache.isKnownHost(request.url())) { QUrl stsUrl(request.url()); // RFC6797, 8.3: // The UA MUST replace the URI scheme with "https" [RFC2818], @@ -1387,6 +1402,8 @@ QStringList QNetworkAccessManager::supportedSchemesImplementation() const // Those ones don't exist in backends #if QT_CONFIG(http) schemes << QStringLiteral("http"); + schemes << QStringLiteral("unix+http"); + schemes << QStringLiteral("local+http"); #ifndef QT_NO_SSL if (QSslSocket::supportsSsl()) schemes << QStringLiteral("https"); @@ -1746,9 +1763,10 @@ QNetworkRequest QNetworkAccessManagerPrivate::prepareMultipart(const QNetworkReq { // copy the request, we probably need to add some headers QNetworkRequest newRequest(request); + auto h = newRequest.headers(); // add Content-Type header if not there already - if (!request.header(QNetworkRequest::ContentTypeHeader).isValid()) { + if (!h.contains(QHttpHeaders::WellKnownHeader::ContentType)) { QByteArray contentType; contentType.reserve(34 + multiPart->d_func()->boundary.size()); contentType += "multipart/"; @@ -1768,14 +1786,15 @@ QNetworkRequest QNetworkAccessManagerPrivate::prepareMultipart(const QNetworkReq } // putting the boundary into quotes, recommended in RFC 2046 section 5.1.1 contentType += "; boundary=\"" + multiPart->d_func()->boundary + '"'; - newRequest.setHeader(QNetworkRequest::ContentTypeHeader, QVariant(contentType)); + h.append(QHttpHeaders::WellKnownHeader::ContentType, contentType); } // add MIME-Version header if not there already (we must include the header // if the message conforms to RFC 2045, see section 4 of that RFC) - auto mimeHeader = "MIME-Version"_ba; - if (!request.hasRawHeader(mimeHeader)) - newRequest.setRawHeader(mimeHeader, "1.0"_ba); + if (!h.contains(QHttpHeaders::WellKnownHeader::MIMEVersion)) + h.append(QHttpHeaders::WellKnownHeader::MIMEVersion, "1.0"_ba); + + newRequest.setHeaders(std::move(h)); QIODevice *device = multiPart->d_func()->device; if (!device->isReadable()) { |