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)
|
if (size.second > maxHeaderListSize)
|
||||||
return HttpHeader(); // Bad, we cannot send this request ...
|
return HttpHeader(); // Bad, we cannot send this request ...
|
||||||
|
|
||||||
const auto requestHeader = request.header().toListOfPairs();
|
const QHttpHeaders requestHeader = request.header();
|
||||||
for (const auto &field : requestHeader) {
|
for (qsizetype i = 0; i < requestHeader.size(); ++i) {
|
||||||
const HeaderSize delta = entry_size(field.first, field.second);
|
const auto name = requestHeader.nameAt(i);
|
||||||
|
const auto value = requestHeader.valueAt(i);
|
||||||
|
const HeaderSize delta = entry_size(name, value);
|
||||||
if (!delta.first) // Overflow???
|
if (!delta.first) // Overflow???
|
||||||
break;
|
break;
|
||||||
if (std::numeric_limits<quint32>::max() - delta.second < size.second)
|
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)
|
if (size.second > maxHeaderListSize)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (field.first.compare("connection", Qt::CaseInsensitive) == 0 ||
|
if (name.compare("connection", Qt::CaseInsensitive) == 0 ||
|
||||||
field.first.compare("host", Qt::CaseInsensitive) == 0 ||
|
name.compare("host", Qt::CaseInsensitive) == 0 ||
|
||||||
field.first.compare("keep-alive", Qt::CaseInsensitive) == 0 ||
|
name.compare("keep-alive", Qt::CaseInsensitive) == 0 ||
|
||||||
field.first.compare("proxy-connection", Qt::CaseInsensitive) == 0 ||
|
name.compare("proxy-connection", Qt::CaseInsensitive) == 0 ||
|
||||||
field.first.compare("transfer-encoding", Qt::CaseInsensitive) == 0)
|
name.compare("transfer-encoding", Qt::CaseInsensitive) == 0)
|
||||||
continue; // Those headers are not valid (section 3.2.1) - from QSpdyProtocolHandler
|
continue; // Those headers are not valid (section 3.2.1) - from QSpdyProtocolHandler
|
||||||
// TODO: verify with specs, which fields are valid to send ....
|
// 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.
|
// Note: RFC 7450 8.1.2 (HTTP/2) states that header field names must be lower-cased
|
||||||
// A request or response containing uppercase header field names
|
// prior to their encoding in HTTP/2; header name fields in QHttpHeaders are already
|
||||||
// MUST be treated as malformed (Section 8.1.2.6)".
|
// lower-cased
|
||||||
header.emplace_back(field.first.toLower(), field.second);
|
header.emplace_back(QByteArray{name.data(), name.size()},
|
||||||
|
QByteArray{value.data(), value.size()});
|
||||||
}
|
}
|
||||||
|
|
||||||
return header;
|
return header;
|
||||||
|
@ -112,9 +112,9 @@ QByteArray QHttpNetworkRequest::uri(bool throughProxy) const
|
|||||||
|
|
||||||
QByteArray QHttpNetworkRequestPrivate::header(const QHttpNetworkRequest &request, bool throughProxy)
|
QByteArray QHttpNetworkRequestPrivate::header(const QHttpNetworkRequest &request, bool throughProxy)
|
||||||
{
|
{
|
||||||
const QList<QPair<QByteArray, QByteArray> > fields = request.header().toListOfPairs();
|
const QHttpHeaders headers = request.header();
|
||||||
QByteArray ba;
|
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 += request.methodName();
|
||||||
ba += ' ';
|
ba += ' ';
|
||||||
@ -126,10 +126,10 @@ QByteArray QHttpNetworkRequestPrivate::header(const QHttpNetworkRequest &request
|
|||||||
ba += QByteArray::number(request.minorVersion());
|
ba += QByteArray::number(request.minorVersion());
|
||||||
ba += "\r\n";
|
ba += "\r\n";
|
||||||
|
|
||||||
for (const auto& [name, value] : fields) {
|
for (qsizetype i = 0; i < headers.size(); ++i) {
|
||||||
ba += name;
|
ba += headers.nameAt(i);
|
||||||
ba += ": ";
|
ba += ": ";
|
||||||
ba += value;
|
ba += headers.valueAt(i);
|
||||||
ba += "\r\n";
|
ba += "\r\n";
|
||||||
}
|
}
|
||||||
if (request.d->operation == QHttpNetworkRequest::Post) {
|
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 autoDecompress = request.rawHeader("accept-encoding").isEmpty();
|
||||||
const bool shouldDecompress = isCompressed && autoDecompress;
|
const bool shouldDecompress = isCompressed && autoDecompress;
|
||||||
// reconstruct the HTTP header
|
// 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);
|
QByteArray value = q->rawHeader(key);
|
||||||
|
|
||||||
// Reset any previous "location" header set in the reply. In case of
|
// Reset any previous "location" header set in the reply. In case of
|
||||||
@ -1398,7 +1401,7 @@ void QNetworkReplyHttpImplPrivate::replyDownloadMetaData(const QHttpHeaders &hm,
|
|||||||
value += ", ";
|
value += ", ";
|
||||||
}
|
}
|
||||||
value += originValue;
|
value += originValue;
|
||||||
q->setRawHeader(key, value);
|
q->setRawHeader({key.data(), key.size()}, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
q->setAttribute(QNetworkRequest::HttpStatusCodeAttribute, statusCode);
|
q->setAttribute(QNetworkRequest::HttpStatusCodeAttribute, statusCode);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user