| Index: Source/core/platform/network/ParsedContentType.cpp
|
| diff --git a/Source/core/platform/network/ParsedContentType.cpp b/Source/core/platform/network/ParsedContentType.cpp
|
| index d8db86a8f3b8e6df430639c5b1ab9db6e42a696e..d08a3dd65cd9169b5557854b5426475e2be0fe73 100644
|
| --- a/Source/core/platform/network/ParsedContentType.cpp
|
| +++ b/Source/core/platform/network/ParsedContentType.cpp
|
| @@ -49,12 +49,7 @@ static void skipSpaces(const String& input, unsigned& startIndex)
|
| ++startIndex;
|
| }
|
|
|
| -static bool isTokenCharacter(char c)
|
| -{
|
| - return isASCII(c) && c > ' ' && c != '"' && c != '(' && c != ')' && c != ',' && c != '/' && (c < ':' || c > '@') && (c < '[' || c > ']');
|
| -}
|
| -
|
| -static SubstringRange parseToken(const String& input, unsigned& startIndex)
|
| +static SubstringRange parseParameterPart(const String& input, unsigned& startIndex)
|
| {
|
| unsigned inputLength = input.length();
|
| unsigned tokenStart = startIndex;
|
| @@ -63,40 +58,22 @@ static SubstringRange parseToken(const String& input, unsigned& startIndex)
|
| if (tokenEnd >= inputLength)
|
| return SubstringRange();
|
|
|
| + bool quoted = input[tokenStart] == '\"';
|
| + bool escape = false;
|
| +
|
| while (tokenEnd < inputLength) {
|
| - if (!isTokenCharacter(input[tokenEnd]))
|
| + UChar c = input[tokenEnd];
|
| + if (quoted && tokenStart != tokenEnd && c == '\"' && !escape)
|
| + return SubstringRange(tokenStart + 1, tokenEnd++ - tokenStart - 1);
|
| + if (!quoted && (c == ';' || c == '='))
|
| return SubstringRange(tokenStart, tokenEnd - tokenStart);
|
| + escape = !escape && c == '\\';
|
| ++tokenEnd;
|
| }
|
|
|
| - return SubstringRange(tokenStart, tokenEnd - tokenStart);
|
| -}
|
| -
|
| -static SubstringRange parseQuotedString(const String& input, unsigned& startIndex)
|
| -{
|
| - unsigned inputLength = input.length();
|
| - unsigned quotedStringStart = startIndex + 1;
|
| - unsigned& quotedStringEnd = startIndex;
|
| -
|
| - if (quotedStringEnd >= inputLength)
|
| - return SubstringRange();
|
| -
|
| - if (input[quotedStringEnd++] != '"' || quotedStringEnd >= inputLength)
|
| + if (quoted)
|
| return SubstringRange();
|
| -
|
| - bool lastCharacterWasBackslash = false;
|
| - char currentCharacter;
|
| - while ((currentCharacter = input[quotedStringEnd++]) != '"' || lastCharacterWasBackslash) {
|
| - if (quotedStringEnd >= inputLength)
|
| - return SubstringRange();
|
| - if (currentCharacter == '\\' && !lastCharacterWasBackslash) {
|
| - lastCharacterWasBackslash = true;
|
| - continue;
|
| - }
|
| - if (lastCharacterWasBackslash)
|
| - lastCharacterWasBackslash = false;
|
| - }
|
| - return SubstringRange(quotedStringStart, quotedStringEnd - quotedStringStart - 1);
|
| + return SubstringRange(tokenStart, tokenEnd - tokenStart);
|
| }
|
|
|
| static String substringForRange(const String& string, const SubstringRange& range)
|
| @@ -172,34 +149,29 @@ bool parseContentType(const String& contentType, ReceiverType& receiver)
|
| index = semiColonIndex + 1;
|
| while (true) {
|
| skipSpaces(contentType, index);
|
| - SubstringRange keyRange = parseToken(contentType, index);
|
| + SubstringRange keyRange = parseParameterPart(contentType, index);
|
| if (!keyRange.second || index >= contentTypeLength) {
|
| - LOG_ERROR("Invalid Content-Type parameter name.");
|
| + LOG_ERROR("Invalid Content-Type parameter name. (at %i)", index);
|
| return false;
|
| }
|
|
|
| // Should we tolerate spaces here?
|
| if (contentType[index++] != '=' || index >= contentTypeLength) {
|
| - LOG_ERROR("Invalid Content-Type malformed parameter.");
|
| + LOG_ERROR("Invalid Content-Type malformed parameter (at %i).", index);
|
| return false;
|
| }
|
|
|
| // Should we tolerate spaces here?
|
| - String value;
|
| - SubstringRange valueRange;
|
| - if (contentType[index] == '"')
|
| - valueRange = parseQuotedString(contentType, index);
|
| - else
|
| - valueRange = parseToken(contentType, index);
|
| + SubstringRange valueRange = parseParameterPart(contentType, index);
|
|
|
| if (!valueRange.second) {
|
| - LOG_ERROR("Invalid Content-Type, invalid parameter value.");
|
| + LOG_ERROR("Invalid Content-Type, invalid parameter value (at %i, for '%s').", index, substringForRange(contentType, keyRange).stripWhiteSpace().ascii().data());
|
| return false;
|
| }
|
|
|
| // Should we tolerate spaces here?
|
| if (index < contentTypeLength && contentType[index++] != ';') {
|
| - LOG_ERROR("Invalid Content-Type, invalid character at the end of key/value parameter.");
|
| + LOG_ERROR("Invalid Content-Type, invalid character at the end of key/value parameter (at %i).", index);
|
| return false;
|
| }
|
|
|
|
|