Replace QHttpHeaders::toListOfPairs() usage with iteration
... as a more computationally effective way, which was not present at the time those usages were introduced. As a drive-by add spaces around a binary operator Task-number: QTBUG-122017 Pick-to: 6.7 Change-Id: I0528c995d1a3c1fe171486c5c313697d1706ee10 Reviewed-by: Marc Mutz <marc.mutz@qt.io>
This commit is contained in:
parent
a61ac2ca58
commit
60f471f4b6
@ -60,9 +60,11 @@ HPack::HttpHeader build_headers(const QHttpNetworkRequest &request, quint32 maxH
|
||||
if (size.second > maxHeaderListSize)
|
||||
return HttpHeader(); // Bad, we cannot send this request ...
|
||||
|
||||
const auto requestHeader = request.header().toListOfPairs();
|
||||
for (const auto &field : requestHeader) {
|
||||
const HeaderSize delta = entry_size(field.first, field.second);
|
||||
const QHttpHeaders requestHeader = request.header();
|
||||
for (qsizetype i = 0; i < requestHeader.size(); ++i) {
|
||||
const auto name = requestHeader.nameAt(i);
|
||||
const auto value = requestHeader.valueAt(i);
|
||||
const HeaderSize delta = entry_size(name, value);
|
||||
if (!delta.first) // Overflow???
|
||||
break;
|
||||
if (std::numeric_limits<quint32>::max() - delta.second < size.second)
|
||||
@ -71,18 +73,19 @@ HPack::HttpHeader build_headers(const QHttpNetworkRequest &request, quint32 maxH
|
||||
if (size.second > maxHeaderListSize)
|
||||
break;
|
||||
|
||||
if (field.first.compare("connection", Qt::CaseInsensitive) == 0 ||
|
||||
field.first.compare("host", Qt::CaseInsensitive) == 0 ||
|
||||
field.first.compare("keep-alive", Qt::CaseInsensitive) == 0 ||
|
||||
field.first.compare("proxy-connection", Qt::CaseInsensitive) == 0 ||
|
||||
field.first.compare("transfer-encoding", Qt::CaseInsensitive) == 0)
|
||||
if (name.compare("connection", Qt::CaseInsensitive) == 0 ||
|
||||
name.compare("host", Qt::CaseInsensitive) == 0 ||
|
||||
name.compare("keep-alive", Qt::CaseInsensitive) == 0 ||
|
||||
name.compare("proxy-connection", Qt::CaseInsensitive) == 0 ||
|
||||
name.compare("transfer-encoding", Qt::CaseInsensitive) == 0)
|
||||
continue; // Those headers are not valid (section 3.2.1) - from QSpdyProtocolHandler
|
||||
// TODO: verify with specs, which fields are valid to send ....
|
||||
// toLower - 8.1.2 .... "header field names MUST be converted to lowercase prior
|
||||
// to their encoding in HTTP/2.
|
||||
// A request or response containing uppercase header field names
|
||||
// MUST be treated as malformed (Section 8.1.2.6)".
|
||||
header.emplace_back(field.first.toLower(), field.second);
|
||||
//
|
||||
// Note: RFC 7450 8.1.2 (HTTP/2) states that header field names must be lower-cased
|
||||
// prior to their encoding in HTTP/2; header name fields in QHttpHeaders are already
|
||||
// lower-cased
|
||||
header.emplace_back(QByteArray{name.data(), name.size()},
|
||||
QByteArray{value.data(), value.size()});
|
||||
}
|
||||
|
||||
return header;
|
||||
|
@ -112,9 +112,9 @@ QByteArray QHttpNetworkRequest::uri(bool throughProxy) const
|
||||
|
||||
QByteArray QHttpNetworkRequestPrivate::header(const QHttpNetworkRequest &request, bool throughProxy)
|
||||
{
|
||||
const QList<QPair<QByteArray, QByteArray> > fields = request.header().toListOfPairs();
|
||||
const QHttpHeaders headers = request.header();
|
||||
QByteArray ba;
|
||||
ba.reserve(40 + fields.size()*25); // very rough lower bound estimation
|
||||
ba.reserve(40 + headers.size() * 25); // very rough lower bound estimation
|
||||
|
||||
ba += request.methodName();
|
||||
ba += ' ';
|
||||
@ -126,10 +126,10 @@ QByteArray QHttpNetworkRequestPrivate::header(const QHttpNetworkRequest &request
|
||||
ba += QByteArray::number(request.minorVersion());
|
||||
ba += "\r\n";
|
||||
|
||||
for (const auto& [name, value] : fields) {
|
||||
ba += name;
|
||||
for (qsizetype i = 0; i < headers.size(); ++i) {
|
||||
ba += headers.nameAt(i);
|
||||
ba += ": ";
|
||||
ba += value;
|
||||
ba += headers.valueAt(i);
|
||||
ba += "\r\n";
|
||||
}
|
||||
if (request.d->operation == QHttpNetworkRequest::Post) {
|
||||
|
@ -1364,7 +1364,10 @@ void QNetworkReplyHttpImplPrivate::replyDownloadMetaData(const QHttpHeaders &hm,
|
||||
const bool autoDecompress = request.rawHeader("accept-encoding").isEmpty();
|
||||
const bool shouldDecompress = isCompressed && autoDecompress;
|
||||
// reconstruct the HTTP header
|
||||
for (const auto &[key, originValue] : hm.toListOfPairs()) {
|
||||
for (qsizetype i = 0; i < hm.size(); ++i) {
|
||||
const auto key = hm.nameAt(i);
|
||||
const auto originValue = hm.valueAt(i);
|
||||
|
||||
QByteArray value = q->rawHeader(key);
|
||||
|
||||
// Reset any previous "location" header set in the reply. In case of
|
||||
@ -1398,7 +1401,7 @@ void QNetworkReplyHttpImplPrivate::replyDownloadMetaData(const QHttpHeaders &hm,
|
||||
value += ", ";
|
||||
}
|
||||
value += originValue;
|
||||
q->setRawHeader(key, value);
|
||||
q->setRawHeader({key.data(), key.size()}, value);
|
||||
}
|
||||
|
||||
q->setAttribute(QNetworkRequest::HttpStatusCodeAttribute, statusCode);
|
||||
|
Loading…
x
Reference in New Issue
Block a user