Bug 1890189: make cache control parsing case insensitive. r=necko-reviewers,kershaw

Differential Revision: https://phabricator.services.mozilla.com/D216487
This commit is contained in:
smayya 2024-07-17 10:32:13 +00:00
Родитель 24ed804729
Коммит 8347a15889
2 изменённых файлов: 35 добавлений и 9 удалений

Просмотреть файл

@ -24,6 +24,17 @@ CacheControlParser::CacheControlParser(nsACString const& aHeader)
mPublic(false),
mPrivate(false),
mImmutable(false) {
mDirectiveTokens[NO_CACHE] = AddCustomToken("no-cache", CASE_INSENSITIVE);
mDirectiveTokens[NO_STORE] = AddCustomToken("no-store", CASE_INSENSITIVE);
mDirectiveTokens[MAX_AGE] = AddCustomToken("max-age", CASE_INSENSITIVE);
mDirectiveTokens[MAX_STALE] = AddCustomToken("max-stale", CASE_INSENSITIVE);
mDirectiveTokens[MIN_FRESH] = AddCustomToken("min-fresh", CASE_INSENSITIVE);
mDirectiveTokens[STALE_WHILE_REVALIDATE] =
AddCustomToken("stale-while-revalidate", CASE_INSENSITIVE);
mDirectiveTokens[PUBLIC] = AddCustomToken("public", CASE_INSENSITIVE);
mDirectiveTokens[PRIVATE] = AddCustomToken("private", CASE_INSENSITIVE);
mDirectiveTokens[IMMUTABLE] = AddCustomToken("immutable", CASE_INSENSITIVE);
SkipWhites();
if (!CheckEOF()) {
Directive();
@ -33,24 +44,24 @@ CacheControlParser::CacheControlParser(nsACString const& aHeader)
void CacheControlParser::Directive() {
do {
SkipWhites();
if (CheckWord("no-cache")) {
if (Check(mDirectiveTokens[NO_CACHE])) {
mNoCache = true;
IgnoreDirective(); // ignore any optionally added values
} else if (CheckWord("no-store")) {
} else if (Check(mDirectiveTokens[NO_STORE])) {
mNoStore = true;
} else if (CheckWord("max-age")) {
} else if (Check(mDirectiveTokens[MAX_AGE])) {
mMaxAgeSet = SecondsValue(&mMaxAge);
} else if (CheckWord("max-stale")) {
} else if (Check(mDirectiveTokens[MAX_STALE])) {
mMaxStaleSet = SecondsValue(&mMaxStale, PR_UINT32_MAX);
} else if (CheckWord("min-fresh")) {
} else if (Check(mDirectiveTokens[MIN_FRESH])) {
mMinFreshSet = SecondsValue(&mMinFresh);
} else if (CheckWord("stale-while-revalidate")) {
} else if (Check(mDirectiveTokens[STALE_WHILE_REVALIDATE])) {
mStaleWhileRevalidateSet = SecondsValue(&mStaleWhileRevalidate);
} else if (CheckWord("public")) {
} else if (Check(mDirectiveTokens[PUBLIC])) {
mPublic = true;
} else if (CheckWord("private")) {
} else if (Check(mDirectiveTokens[PRIVATE])) {
mPrivate = true;
} else if (CheckWord("immutable")) {
} else if (Check(mDirectiveTokens[IMMUTABLE])) {
mImmutable = true;
} else {
IgnoreDirective();

Просмотреть файл

@ -27,7 +27,22 @@ class CacheControlParser final : Tokenizer {
bool Immutable();
private:
enum CacheControlDirective : uint32_t {
NO_CACHE = 0,
NO_STORE,
MAX_AGE,
MAX_STALE,
MIN_FRESH,
STALE_WHILE_REVALIDATE,
PUBLIC,
PRIVATE,
IMMUTABLE,
DIRECTIVE_UNKNOWN
};
Token mDirectiveTokens[DIRECTIVE_UNKNOWN];
void Directive();
void IgnoreDirective();
[[nodiscard]] bool SecondsValue(uint32_t* seconds, uint32_t defaultVal = 0);