Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1227)

Unified Diff: Source/core/loader/LinkHeader.cpp

Issue 907453002: Add multiple header fields support for the Link header parser (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/loader/LinkHeader.h ('k') | Source/core/loader/LinkHeaderTest.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/loader/LinkHeader.cpp
diff --git a/Source/core/loader/LinkHeader.cpp b/Source/core/loader/LinkHeader.cpp
index 6f36f1be9e38982ed2b1a49bd79294721c27c35a..ae452d5466c178c3fcc025f60159241a9e42cb4b 100644
--- a/Source/core/loader/LinkHeader.cpp
+++ b/Source/core/loader/LinkHeader.cpp
@@ -29,9 +29,15 @@ static bool isValidParameterNameChar(CharType chr)
}
template <typename CharType>
+static bool isValidParameterValueEnd(CharType chr)
+{
+ return chr == ';' || chr == ',';
+}
+
+template <typename CharType>
static bool isValidParameterValueChar(CharType chr)
{
- return !isWhitespace(chr) && chr != ';';
+ return !isWhitespace(chr) && !isValidParameterValueEnd(chr);
}
// Before:
@@ -64,6 +70,19 @@ static bool parseURL(CharType*& position, CharType* end, String& url)
return true;
}
+template <typename CharType>
+static bool invalidParameterDelimiter(CharType*& position, CharType* end)
+{
+ return (!skipExactly<CharType>(position, end, ';') && (position < end) && (*position != ','));
+}
+
+template <typename CharType>
+static bool validFieldEnd(CharType*& position, CharType* end)
+{
+ ASSERT(position <= end);
+ return (position == end || *position == ',');
+}
+
// Before:
//
// <cat.jpg>; rel=preload
@@ -76,16 +95,16 @@ static bool parseURL(CharType*& position, CharType* end, String& url)
// ^ ^
// position end
template <typename CharType>
-static bool parseParameterDelimiter(CharType*& position, CharType* end, bool& isValidDelimiter)
+static bool parseParameterDelimiter(CharType*& position, CharType* end, bool& isValid)
{
- isValidDelimiter = true;
+ isValid = true;
skipWhile<CharType, isWhitespace>(position, end);
- if (!skipExactly<CharType>(position, end, ';') && (position < end)) {
- isValidDelimiter = false;
+ if (invalidParameterDelimiter(position, end)) {
+ isValid = false;
return false;
}
skipWhile<CharType, isWhitespace>(position, end);
- if (position == end)
+ if (validFieldEnd(position, end))
return false;
return true;
}
@@ -141,7 +160,7 @@ static bool parseParameterValue(CharType*& position, CharType* end, String& valu
skipWhile<CharType, isValidParameterValueChar>(position, end);
CharType* valueEnd = position;
skipWhile<CharType, isWhitespace>(position, end);
- if ((valueEnd == valueStart) || (position != end && *position != ';'))
+ if ((valueEnd == valueStart) || (position != end && !isValidParameterValueEnd(*position)))
return false;
value = String(valueStart, valueEnd - valueStart);
return true;
@@ -155,44 +174,64 @@ void LinkHeader::setValue(LinkParameterName name, String value)
}
template <typename CharType>
-bool LinkHeader::init(CharType* headerValue, unsigned len)
+static void findNextHeader(CharType*& position, CharType* end)
{
- CharType* position = headerValue;
- CharType* end = headerValue + len;
+ skipUntil<CharType>(position, end, ',');
+ skipExactly<CharType>(position, end, ',');
+}
- if (!parseURL(position, end, m_url))
- return false;
+template <typename CharType>
+LinkHeader::LinkHeader(CharType*& position, CharType* end)
+ : m_isValid(true)
+{
+ if (!parseURL(position, end, m_url)) {
+ m_isValid = false;
+ findNextHeader(position, end);
+ return;
+ }
while (position < end) {
- bool isValidDelimiter;
- if (!parseParameterDelimiter(position, end, isValidDelimiter))
- return isValidDelimiter;
+ if (!parseParameterDelimiter(position, end, m_isValid)) {
+ findNextHeader(position, end);
+ return;
+ }
LinkParameterName parameterName;
- if (!parseParameterName(position, end, parameterName))
- return false;
+ if (!parseParameterName(position, end, parameterName)) {
+ findNextHeader(position, end);
+ m_isValid = false;
+ return;
+ }
String parameterValue;
- if (!parseParameterValue(position, end, parameterValue))
- return false;
+ if (!parseParameterValue(position, end, parameterValue)) {
+ findNextHeader(position, end);
+ m_isValid = false;
+ return;
+ }
setValue(parameterName, parameterValue);
}
-
- return true;
}
-LinkHeader::LinkHeader(const String& header)
+LinkHeaderSet::LinkHeaderSet(const String& header)
{
- if (header.isNull()) {
- m_isValid = false;
+ if (header.isNull())
return;
- }
if (header.is8Bit())
- m_isValid = init(header.characters8(), header.length());
+ init(header.characters8(), header.length());
else
- m_isValid = init(header.characters16(), header.length());
+ init(header.characters16(), header.length());
+}
+
+template <typename CharType>
+void LinkHeaderSet::init(CharType* headerValue, unsigned len)
+{
+ CharType* position = headerValue;
+ CharType* end = headerValue + len;
+ while (position < end)
+ m_headerSet.append(LinkHeader(position, end));
}
}
« no previous file with comments | « Source/core/loader/LinkHeader.h ('k') | Source/core/loader/LinkHeaderTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698