Index: third_party/WebKit/Source/platform/network/ParsedContentType.cpp |
diff --git a/third_party/WebKit/Source/platform/network/ParsedContentType.cpp b/third_party/WebKit/Source/platform/network/ParsedContentType.cpp |
index 55423702c1eb20499f12321d7991b66826b0d5f2..b8e7814c017001280345ba7d34ac70f9ee9b863a 100644 |
--- a/third_party/WebKit/Source/platform/network/ParsedContentType.cpp |
+++ b/third_party/WebKit/Source/platform/network/ParsedContentType.cpp |
@@ -36,22 +36,16 @@ |
namespace blink { |
-class DummyParsedContentType final { |
- STACK_ALLOCATED(); |
+using SubstringRange = ParsedContentType::SubstringRange; |
- public: |
- void setContentType(const SubstringRange&) const {} |
- void setContentTypeParameter(const SubstringRange&, |
- const SubstringRange&) const {} |
-}; |
+namespace { |
-static void skipSpaces(const String& input, unsigned& startIndex) { |
+void skipSpaces(const String& input, unsigned& startIndex) { |
while (startIndex < input.length() && input[startIndex] == ' ') |
++startIndex; |
} |
-static SubstringRange parseParameterPart(const String& input, |
- unsigned& startIndex) { |
+SubstringRange parseParameterPart(const String& input, unsigned& startIndex) { |
unsigned inputLength = input.length(); |
unsigned tokenStart = startIndex; |
unsigned& tokenEnd = startIndex; |
@@ -77,11 +71,31 @@ static SubstringRange parseParameterPart(const String& input, |
return SubstringRange(tokenStart, tokenEnd - tokenStart); |
} |
-static String substringForRange(const String& string, |
- const SubstringRange& range) { |
+String substringForRange(const String& string, const SubstringRange& range) { |
return string.substring(range.first, range.second); |
} |
+} // namespace |
+ |
+ParsedContentType::ParsedContentType(const String& contentType) { |
+ if (contentType.contains('\r') || contentType.contains('\n')) |
+ m_isValid = false; |
+ else |
+ m_isValid = parse(contentType.stripWhiteSpace()); |
+} |
+ |
+String ParsedContentType::charset() const { |
+ return parameterValueForName("charset"); |
+} |
+ |
+String ParsedContentType::parameterValueForName(const String& name) const { |
+ return m_parameters.get(name); |
+} |
+ |
+size_t ParsedContentType::parameterCount() const { |
+ return m_parameters.size(); |
+} |
+ |
// From http://tools.ietf.org/html/rfc2045#section-5.1: |
// |
// content := "Content-Type" ":" type "/" subtype |
@@ -128,8 +142,7 @@ static String substringForRange(const String& string, |
// ; Must be in quoted-string, |
// ; to use within parameter values |
-template <class ReceiverType> |
-bool parseContentType(const String& contentType, ReceiverType& receiver) { |
+bool ParsedContentType::parse(const String& contentType) { |
unsigned index = 0; |
unsigned contentTypeLength = contentType.length(); |
skipSpaces(contentType, index); |
@@ -141,13 +154,18 @@ bool parseContentType(const String& contentType, ReceiverType& receiver) { |
// There should not be any quoted strings until we reach the parameters. |
size_t semiColonIndex = contentType.find(';', index); |
if (semiColonIndex == kNotFound) { |
- receiver.setContentType(SubstringRange(index, contentTypeLength - index)); |
+ m_mimeType = |
+ substringForRange(contentType, |
+ SubstringRange(index, contentTypeLength - index)) |
+ .stripWhiteSpace(); |
return true; |
} |
- receiver.setContentType(SubstringRange(index, semiColonIndex - index)); |
+ m_mimeType = substringForRange(contentType, |
+ SubstringRange(index, semiColonIndex - index)) |
+ .stripWhiteSpace(); |
index = semiColonIndex + 1; |
- while (true) { |
+ do { |
skipSpaces(contentType, index); |
SubstringRange keyRange = parseParameterPart(contentType, index); |
if (!keyRange.second || index >= contentTypeLength) { |
@@ -181,49 +199,11 @@ bool parseContentType(const String& contentType, ReceiverType& receiver) { |
return false; |
} |
- receiver.setContentTypeParameter(keyRange, valueRange); |
- |
- if (index >= contentTypeLength) |
- return true; |
- } |
+ m_parameters.set(substringForRange(contentType, keyRange), |
+ substringForRange(contentType, valueRange)); |
+ } while (index < contentTypeLength); |
return true; |
} |
-bool isValidContentType(const String& contentType) { |
- if (contentType.contains('\r') || contentType.contains('\n')) |
- return false; |
- |
- DummyParsedContentType parsedContentType = DummyParsedContentType(); |
- return parseContentType<DummyParsedContentType>(contentType, |
- parsedContentType); |
-} |
- |
-ParsedContentType::ParsedContentType(const String& contentType) |
- : m_contentType(contentType.stripWhiteSpace()) { |
- parseContentType<ParsedContentType>(m_contentType, *this); |
-} |
- |
-String ParsedContentType::charset() const { |
- return parameterValueForName("charset"); |
-} |
- |
-String ParsedContentType::parameterValueForName(const String& name) const { |
- return m_parameters.get(name); |
-} |
- |
-size_t ParsedContentType::parameterCount() const { |
- return m_parameters.size(); |
-} |
- |
-void ParsedContentType::setContentType(const SubstringRange& contentRange) { |
- m_mimeType = substringForRange(m_contentType, contentRange).stripWhiteSpace(); |
-} |
- |
-void ParsedContentType::setContentTypeParameter(const SubstringRange& key, |
- const SubstringRange& value) { |
- m_parameters.set(substringForRange(m_contentType, key), |
- substringForRange(m_contentType, value)); |
-} |
- |
} // namespace blink |