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));
1733 QList<QHttpHeaderRange> results;
1735 const QList<QByteArray> rangesVals = values(WellKnownHeader::Range);
1736 bool invalidHeaderEncountered =
false;
1738 for (QByteArrayView rangesVal : rangesVals) {
1739 if (!rangesVal.startsWith(
"bytes="_ba))
1742 rangesVal = rangesVal.slice(6);
1744 for (QLatin1StringView part : qTokenize(QLatin1StringView(rangesVal), u',')) {
1745 int dashPos = part.indexOf(u'-');
1746 if (dashPos == -1) {
1747 invalidHeaderEncountered =
true;
1751 const QLatin1StringView startStr = part.sliced(0, dashPos).trimmed();
1752 const QLatin1StringView endStr = part.sliced(dashPos + 1).trimmed();
1754 bool okStart =
false;
1757 std::optional<qint64> start;
1758 std::optional<qint64> end;
1760 if (!startStr.isEmpty()) {
1761 const qint64 startVal = startStr.toLongLong(&okStart);
1766 if (!endStr.isEmpty()) {
1767 const qint64 endVal = endStr.toLongLong(&okEnd);
1772 if ((!startStr.isEmpty() && !okStart) || (!endStr.isEmpty() && !okEnd)) {
1773 invalidHeaderEncountered =
true;
1777 QHttpHeaderRange range(start, end);
1778 if (!range.isValid()) {
1779 invalidHeaderEncountered =
true;
1783 results.append(range);
1788 *ok = !invalidHeaderEncountered;
1790 return invalidHeaderEncountered ? QList<QHttpHeaderRange>{} : results;
1817 if (ranges.isEmpty()) {
1818 removeAll(WellKnownHeader::Range);
1822 QByteArray result(
"bytes=");
1823 for (qsizetype i = 0; i < ranges.size(); ++i) {
1830 result += QByteArray::number(*range.start());
1833 result += QByteArray::number(*range.end());
1836 replaceOrAppend(WellKnownHeader::Range, result);
1882QList<std::pair<QByteArray, QByteArray>>
QHttpHeaders::toListOfPairs()
const
1884 QList<std::pair<QByteArray, QByteArray>> list;
1887 list.reserve(size());
1888 for (
const auto & h : std::as_const(d->headers))
1889 list.append({h.name.asByteArray(), h.value});
1899 QMultiMap<QByteArray, QByteArray> map;
1902 for (
const auto &h : std::as_const(d->headers))
1903 map.insert(h.name.asByteArray(), h.value);
1913 QMultiHash<QByteArray, QByteArray> hash;
1916 hash.reserve(size());
1917 for (
const auto &h : std::as_const(d->headers))
1918 hash.insert(h.name.asByteArray(), h.value);