1041 const QDebugStateSaver saver(debug);
1042 debug.resetFormat().nospace();
1044 debug <<
"QHttpHeaders(";
1046 debug <<
"headers = ";
1047 const char *separator =
"";
1048 for (
const auto &h : headers.d->headers) {
1049 debug << separator << h.name.asView() <<
':' << h.value;
1240 if (!isValidHttpHeaderNameField(name) || !isValidHttpHeaderValueField(value))
1244 d->headers.insert(i, {HeaderName{name}, normalizedValue(value)});
1274 if (!isValidHttpHeaderNameField(name) || !isValidHttpHeaderValueField(newValue))
1278 d->headers.replace(i, {HeaderName{name}, normalizedValue(newValue)});
1288 if (!isValidHttpHeaderValueField(newValue))
1292 d->headers.replace(i, {HeaderName{name}, normalizedValue(newValue)});
1554std::optional<QList<qint64>>
QHttpHeaders::intValues(QAnyStringView name)
const
1556 QList<qint64> results;
1557 d->forEachHeader(name, [&](QByteArrayView value) {
1559 qint64 result = value.toLongLong(&ok);
1561 results.append(result);
1563 return results.isEmpty() ? std::nullopt :
1564 std::make_optional(std::move(results));
1662std::optional<QList<QDateTime>>
QHttpHeaders::dateTimeValues(QAnyStringView name)
const
1664 QList<QDateTime> results;
1665 d->forEachHeader(name, [&](QByteArrayView value) {
1666 QDateTime dt = QNetworkHeadersPrivate::fromHttpDate(value);
1668 results.append(std::move(dt));
1670 return results.isEmpty() ? std::nullopt :
1671 std::make_optional(std::move(results));
1731 QList<QPair<qint64, qint64>> results;
1733 const QList<QByteArray> rangesVals = values(WellKnownHeader::Range);
1734 bool invalidHeaderEncountered =
false;
1736 for (QByteArrayView rangesVal : rangesVals) {
1737 if (!rangesVal.startsWith(
"bytes="_ba))
1740 rangesVal = rangesVal.slice(6);
1742 for (QLatin1StringView part : qTokenize(QLatin1StringView(rangesVal), u',')) {
1743 int dashPos = part.indexOf(u'-');
1744 if (dashPos == -1) {
1745 invalidHeaderEncountered =
true;
1749 const QLatin1StringView startStr = part.sliced(0, dashPos).trimmed();
1750 const QLatin1StringView endStr = part.sliced(dashPos + 1).trimmed();
1752 bool okStart =
false;
1755 const qint64 start = startStr.isEmpty() ? -1 : startStr.toLongLong(&okStart);
1756 const qint64 end = endStr.isEmpty() ? -1 : endStr.toLongLong(&okEnd);
1758 if ((!startStr.isEmpty() && !okStart) || (!endStr.isEmpty() && !okEnd)) {
1759 invalidHeaderEncountered =
true;
1762 if (start == -1 && end == -1) {
1763 invalidHeaderEncountered =
true;
1767 results.append({start, end});
1772 *ok = !invalidHeaderEncountered;
1774 return invalidHeaderEncountered ? QList<QPair<qint64, qint64>>{} : results;
1798 if (ranges.isEmpty()) {
1799 removeAll(WellKnownHeader::Range);
1803 QByteArray result(
"bytes=");
1804 for (
int i = 0; i < ranges.size(); ++i) {
1805 const auto &pair = ranges.at(i);
1810 if (pair.first != -1)
1811 result += QByteArray::number(pair.first);
1813 if (pair.second != -1)
1814 result += QByteArray::number(pair.second);
1817 replaceOrAppend(WellKnownHeader::Range, result);
1863QList<std::pair<QByteArray, QByteArray>>
QHttpHeaders::toListOfPairs()
const
1865 QList<std::pair<QByteArray, QByteArray>> list;
1868 list.reserve(size());
1869 for (
const auto & h : std::as_const(d->headers))
1870 list.append({h.name.asByteArray(), h.value});
1880 QMultiMap<QByteArray, QByteArray> map;
1883 for (
const auto &h : std::as_const(d->headers))
1884 map.insert(h.name.asByteArray(), h.value);
1894 QMultiHash<QByteArray, QByteArray> hash;
1897 hash.reserve(size());
1898 for (
const auto &h : std::as_const(d->headers))
1899 hash.insert(h.name.asByteArray(), h.value);