#include "net/http/http_response_headers.h"
#include <algorithm>
#include <limits>
#include <memory>
#include <optional>
#include <string_view>
#include <utility>
#include "base/format_macros.h"
#include "base/logging.h"
#include "base/metrics/histogram_macros.h"
#include "base/pickle.h"
#include "base/ranges/algorithm.h"
#include "base/strings/escape.h"
#include "base/strings/strcat.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "base/time/time.h"
#include "base/values.h"
#include "net/base/features.h"
#include "net/base/parse_number.h"
#include "net/base/tracing.h"
#include "net/http/http_byte_range.h"
#include "net/http/http_log_util.h"
#include "net/http/http_status_code.h"
#include "net/http/http_util.h"
#include "net/log/net_log_capture_mode.h"
#include "net/log/net_log_values.h"
Time;
namespace net {
namespace {
const char* const kHopByHopResponseHeaders[] = …;
const char* const kChallengeResponseHeaders[] = …;
const char* const kCookieResponseHeaders[] = …;
const char* const kSecurityStateHeaders[] = …;
const char* const kNonUpdatedHeaders[] = …;
const char* const kNonUpdatedHeaderPrefixes[] = …;
constexpr char kActivateStorageAccessHeader[] = …;
bool ShouldUpdateHeader(std::string_view name) { … }
bool HasEmbeddedNulls(std::string_view str) { … }
void CheckDoesNotHaveEmbeddedNulls(std::string_view str) { … }
void RemoveLeadingSpaces(std::string_view* s) { … }
int ParseStatus(std::string_view status, std::string& append_to) { … }
}
const char HttpResponseHeaders::kContentRange[] = …;
const char HttpResponseHeaders::kLastModified[] = …;
const char HttpResponseHeaders::kVary[] = …;
struct HttpResponseHeaders::ParsedHeader { … };
HttpResponseHeaders::Builder::Builder(HttpVersion version,
std::string_view status)
: … { … }
HttpResponseHeaders::Builder::~Builder() = default;
scoped_refptr<HttpResponseHeaders> HttpResponseHeaders::Builder::Build() { … }
HttpResponseHeaders::HttpResponseHeaders(const std::string& raw_input)
: … { … }
HttpResponseHeaders::HttpResponseHeaders(base::PickleIterator* iter)
: … { … }
HttpResponseHeaders::HttpResponseHeaders(
BuilderPassKey,
HttpVersion version,
std::string_view status,
base::span<const std::pair<std::string_view, std::string_view>> headers)
: … { … }
scoped_refptr<HttpResponseHeaders> HttpResponseHeaders::TryToCreate(
std::string_view headers) { … }
scoped_refptr<HttpResponseHeaders> HttpResponseHeaders::TryToCreateForDataURL(
std::string_view content_type) { … }
void HttpResponseHeaders::Persist(base::Pickle* pickle,
PersistOptions options) { … }
void HttpResponseHeaders::Update(const HttpResponseHeaders& new_headers) { … }
void HttpResponseHeaders::MergeWithHeaders(std::string raw_headers,
const HeaderSet& headers_to_remove) { … }
void HttpResponseHeaders::RemoveHeader(std::string_view name) { … }
void HttpResponseHeaders::RemoveHeaders(
const std::unordered_set<std::string>& header_names) { … }
void HttpResponseHeaders::RemoveHeaderLine(const std::string& name,
const std::string& value) { … }
void HttpResponseHeaders::AddHeader(std::string_view name,
std::string_view value) { … }
void HttpResponseHeaders::SetHeader(std::string_view name,
std::string_view value) { … }
void HttpResponseHeaders::AddCookie(const std::string& cookie_string) { … }
void HttpResponseHeaders::ReplaceStatusLine(const std::string& new_status) { … }
void HttpResponseHeaders::UpdateWithNewRange(const HttpByteRange& byte_range,
int64_t resource_size,
bool replace_status_line) { … }
void HttpResponseHeaders::Parse(const std::string& raw_input) { … }
bool HttpResponseHeaders::GetNormalizedHeader(std::string_view name,
std::string* value) const { … }
std::string HttpResponseHeaders::GetStatusLine() const { … }
std::string HttpResponseHeaders::GetStatusText() const { … }
bool HttpResponseHeaders::EnumerateHeaderLines(size_t* iter,
std::string* name,
std::string* value) const { … }
bool HttpResponseHeaders::EnumerateHeader(size_t* iter,
std::string_view name,
std::string* value) const { … }
bool HttpResponseHeaders::HasHeaderValue(std::string_view name,
std::string_view value) const { … }
bool HttpResponseHeaders::HasHeader(std::string_view name) const { … }
HttpResponseHeaders::~HttpResponseHeaders() = default;
HttpVersion HttpResponseHeaders::ParseVersion(
std::string::const_iterator line_begin,
std::string::const_iterator line_end) { … }
void HttpResponseHeaders::ParseStatusLine(
std::string::const_iterator line_begin,
std::string::const_iterator line_end,
bool has_headers) { … }
size_t HttpResponseHeaders::FindHeader(size_t from,
std::string_view search) const { … }
std::optional<base::TimeDelta> HttpResponseHeaders::GetCacheControlDirective(
std::string_view directive) const { … }
void HttpResponseHeaders::AddHeader(std::string::const_iterator name_begin,
std::string::const_iterator name_end,
std::string::const_iterator values_begin,
std::string::const_iterator values_end,
ContainsCommas contains_commas) { … }
void HttpResponseHeaders::AddToParsed(std::string::const_iterator name_begin,
std::string::const_iterator name_end,
std::string::const_iterator value_begin,
std::string::const_iterator value_end) { … }
void HttpResponseHeaders::AddNonCacheableHeaders(HeaderSet* result) const { … }
void HttpResponseHeaders::AddHopByHopHeaders(HeaderSet* result) { … }
void HttpResponseHeaders::AddCookieHeaders(HeaderSet* result) { … }
void HttpResponseHeaders::AddChallengeHeaders(HeaderSet* result) { … }
void HttpResponseHeaders::AddHopContentRangeHeaders(HeaderSet* result) { … }
void HttpResponseHeaders::AddSecurityStateHeaders(HeaderSet* result) { … }
void HttpResponseHeaders::GetMimeTypeAndCharset(std::string* mime_type,
std::string* charset) const { … }
bool HttpResponseHeaders::GetMimeType(std::string* mime_type) const { … }
bool HttpResponseHeaders::GetCharset(std::string* charset) const { … }
bool HttpResponseHeaders::IsRedirect(std::string* location) const { … }
bool HttpResponseHeaders::HasStorageAccessRetryHeader() const { … }
bool HttpResponseHeaders::HasStorageAccessLoadHeader() const { … }
bool HttpResponseHeaders::IsRedirectResponseCode(int response_code) { … }
ValidationType HttpResponseHeaders::RequiresValidation(
const Time& request_time,
const Time& response_time,
const Time& current_time) const { … }
HttpResponseHeaders::FreshnessLifetimes
HttpResponseHeaders::GetFreshnessLifetimes(const Time& response_time) const { … }
base::TimeDelta HttpResponseHeaders::GetCurrentAge(
const Time& request_time,
const Time& response_time,
const Time& current_time) const { … }
std::optional<base::TimeDelta> HttpResponseHeaders::GetMaxAgeValue() const { … }
std::optional<base::TimeDelta> HttpResponseHeaders::GetAgeValue() const { … }
std::optional<Time> HttpResponseHeaders::GetDateValue() const { … }
std::optional<Time> HttpResponseHeaders::GetLastModifiedValue() const { … }
std::optional<Time> HttpResponseHeaders::GetExpiresValue() const { … }
std::optional<base::TimeDelta>
HttpResponseHeaders::GetStaleWhileRevalidateValue() const { … }
std::optional<Time> HttpResponseHeaders::GetTimeValuedHeader(
const std::string& name) const { … }
bool HttpResponseHeaders::IsKeepAlive() const { … }
bool HttpResponseHeaders::HasStrongValidators() const { … }
bool HttpResponseHeaders::HasValidators() const { … }
int64_t HttpResponseHeaders::GetContentLength() const { … }
int64_t HttpResponseHeaders::GetInt64HeaderValue(
const std::string& header) const { … }
bool HttpResponseHeaders::GetContentRangeFor206(
int64_t* first_byte_position,
int64_t* last_byte_position,
int64_t* instance_length) const { … }
base::Value::Dict HttpResponseHeaders::NetLogParams(
NetLogCaptureMode capture_mode) const { … }
bool HttpResponseHeaders::IsChunkEncoded() const { … }
bool HttpResponseHeaders::IsCookieResponseHeader(std::string_view name) { … }
void HttpResponseHeaders::WriteIntoTrace(perfetto::TracedValue context) const { … }
bool HttpResponseHeaders::StrictlyEquals(
const HttpResponseHeaders& other) const { … }
}