WebKit Bugzilla
Attachment 361430 Details for
Bug 193909
: Implement serializing in MIME type parser
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-193909-20190207214907.patch (text/plain), 9.49 KB, created by
Rob Buis
on 2019-02-07 12:49:08 PST
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Rob Buis
Created:
2019-02-07 12:49:08 PST
Size:
9.49 KB
patch
obsolete
>Subversion Revision: 240893 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index f54c0057975eb3d8683eea33331151ba1daf6d79..baddcafa432656d683047109ac297d36a65e6923 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,21 @@ >+2019-02-07 Rob Buis <rbuis@igalia.com> >+ >+ Implement serializing in MIME type parser >+ https://bugs.webkit.org/show_bug.cgi?id=193909 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Test: ParsedContentType.Serialize >+ >+ * platform/network/ParsedContentType.cpp: >+ (WebCore::parseQuotedString): >+ (WebCore::ParsedContentType::parameterValueForName const): >+ (WebCore::ParsedContentType::parameterCount const): >+ (WebCore::ParsedContentType::setContentType): >+ (WebCore::ParsedContentType::setContentTypeParameter): >+ (WebCore::ParsedContentType::serialize const): >+ * platform/network/ParsedContentType.h: >+ > 2018-12-16 Darin Adler <darin@apple.com> > > Convert additional String::format clients to alternative approaches >diff --git a/Source/WebCore/platform/network/ParsedContentType.cpp b/Source/WebCore/platform/network/ParsedContentType.cpp >index ceb54a72700c3ccc076dd687b2fb1bec74e7d84a..eb858159423b93f95bc5d9d6e5ea4f5363da5b1b 100644 >--- a/Source/WebCore/platform/network/ParsedContentType.cpp >+++ b/Source/WebCore/platform/network/ParsedContentType.cpp >@@ -33,6 +33,7 @@ > #include "ParsedContentType.h" > > #include <wtf/text/CString.h> >+#include <wtf/text/StringBuilder.h> > > namespace WebCore { > >@@ -96,8 +97,11 @@ static Optional<SubstringRange> parseQuotedString(const String& input, unsigned& > if (quotedStringEnd >= inputLength) > return WTF::nullopt; > >- if (input[quotedStringEnd++] != '"' || quotedStringEnd >= inputLength) >- return WTF::nullopt; >+ if (input[quotedStringEnd++] != '"' || quotedStringEnd >= inputLength) { >+ if (mode == Mode::Rfc2045) >+ return WTF::nullopt; >+ return SubstringRange(quotedStringStart, quotedStringEnd - quotedStringStart); >+ } > > bool lastCharacterWasBackslash = false; > char currentCharacter; >@@ -114,7 +118,9 @@ static Optional<SubstringRange> parseQuotedString(const String& input, unsigned& > if (lastCharacterWasBackslash) > lastCharacterWasBackslash = false; > } >- return SubstringRange(quotedStringStart, quotedStringEnd - quotedStringStart - 1); >+ if (input[quotedStringEnd - 1] == '"') >+ return SubstringRange(quotedStringStart, quotedStringEnd - quotedStringStart - 1); >+ return SubstringRange(quotedStringStart, quotedStringEnd - quotedStringStart); > } > > static String substringForRange(const String& string, const SubstringRange& range) >@@ -311,19 +317,19 @@ String ParsedContentType::charset() const > > String ParsedContentType::parameterValueForName(const String& name) const > { >- return m_parameters.get(name); >+ return m_parameterValues.get(name); > } > > size_t ParsedContentType::parameterCount() const > { >- return m_parameters.size(); >+ return m_parameterValues.size(); > } > > void ParsedContentType::setContentType(const SubstringRange& contentRange, Mode mode) > { > m_mimeType = substringForRange(m_contentType, contentRange).stripWhiteSpace(); > if (mode == Mode::MimeSniff) >- m_mimeType.convertToASCIILowercase(); >+ m_mimeType = m_mimeType.convertToASCIILowercase(); > } > > static bool isNonTokenCharacter(UChar ch) >@@ -338,12 +344,33 @@ static bool isNonQuotedStringTokenCharacter(UChar ch) > > void ParsedContentType::setContentTypeParameter(const String& keyName, const String& keyValue, Mode mode) > { >+ String name = keyName; > if (mode == Mode::MimeSniff) { >- if (m_parameters.contains(keyName) || keyName.find(isNonTokenCharacter) != notFound || keyValue.find(isNonQuotedStringTokenCharacter) != notFound) >+ if (m_parameterValues.contains(keyName) || keyName.find(isNonTokenCharacter) != notFound || keyValue.find(isNonQuotedStringTokenCharacter) != notFound) > return; >- keyName.convertToASCIILowercase(); >+ name = name.convertToASCIILowercase(); >+ } >+ m_parameterValues.set(name, keyValue); >+ m_parameterNames.append(name); >+} >+ >+String ParsedContentType::serialize() const >+{ >+ StringBuilder builder; >+ builder.append(m_mimeType); >+ for (auto paramName : m_parameterNames) { >+ builder.append(';'); >+ builder.append(paramName); >+ builder.append('='); >+ String value = m_parameterValues.get(paramName); >+ if (value.isEmpty() || value.find(isNonTokenCharacter) != notFound) { >+ builder.append('"'); >+ builder.append(value); >+ builder.append('"'); >+ } else >+ builder.append(value); > } >- m_parameters.set(keyName, keyValue); >+ return builder.toString(); > } > > } >diff --git a/Source/WebCore/platform/network/ParsedContentType.h b/Source/WebCore/platform/network/ParsedContentType.h >index de7df88f7c7fb156e638108a24a5fbe723af1363..49f2e223cd836e558a421ed0f0452b358c2ddc49 100644 >--- a/Source/WebCore/platform/network/ParsedContentType.h >+++ b/Source/WebCore/platform/network/ParsedContentType.h >@@ -47,7 +47,7 @@ WEBCORE_EXPORT bool isValidContentType(const String&, Mode = Mode::MimeSniff); > // FIXME: add support for comments. > class ParsedContentType { > public: >- static Optional<ParsedContentType> create(const String&, Mode = Mode::MimeSniff); >+ WEBCORE_EXPORT static Optional<ParsedContentType> create(const String&, Mode = Mode::MimeSniff); > ParsedContentType(ParsedContentType&&) = default; > > String mimeType() const { return m_mimeType; } >@@ -57,6 +57,8 @@ public: > String parameterValueForName(const String&) const; > size_t parameterCount() const; > >+ WEBCORE_EXPORT String serialize() const; >+ > private: > ParsedContentType(const String&); > ParsedContentType(const ParsedContentType&) = delete; >@@ -67,7 +69,8 @@ private: > > typedef HashMap<String, String> KeyValuePairs; > String m_contentType; >- KeyValuePairs m_parameters; >+ KeyValuePairs m_parameterValues; >+ Vector<String> m_parameterNames; > String m_mimeType; > }; > >diff --git a/Tools/ChangeLog b/Tools/ChangeLog >index 2b3e7f1fde5a993b92789a37d5731530cbc21fcc..c1de58db6fc720c647ccf13ec8228c4f9c89562d 100644 >--- a/Tools/ChangeLog >+++ b/Tools/ChangeLog >@@ -1,3 +1,14 @@ >+2019-02-07 Rob Buis <rbuis@igalia.com> >+ >+ Implement serializing in MIME type parser >+ https://bugs.webkit.org/show_bug.cgi?id=193909 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * TestWebKitAPI/Tests/WebCore/ParsedContentType.cpp: >+ (TestWebKitAPI::serializeIfValid): >+ (TestWebKitAPI::TEST): >+ > 2018-12-16 Darin Adler <darin@apple.com> > > Convert additional String::format clients to alternative approaches >diff --git a/Tools/TestWebKitAPI/Tests/WebCore/ParsedContentType.cpp b/Tools/TestWebKitAPI/Tests/WebCore/ParsedContentType.cpp >index 155704ad0a233ae4add7334148c5af2007568e4e..dd2747e8bc70c6d70bf6449f25307fb5c1730560 100644 >--- a/Tools/TestWebKitAPI/Tests/WebCore/ParsedContentType.cpp >+++ b/Tools/TestWebKitAPI/Tests/WebCore/ParsedContentType.cpp >@@ -98,4 +98,44 @@ TEST(ParsedContentType, Rfc2045) > EXPECT_FALSE(isValidContentType("text/plain;test=\"value\"foo;foo=bar", Mode::Rfc2045)); > } > >+static String serializeIfValid(const String& input) >+{ >+ if (Optional<ParsedContentType> parsedContentType = ParsedContentType::create(input)) >+ return parsedContentType->serialize(); >+ return String(); >+} >+ >+TEST(ParsedContentType, Serialize) >+{ >+ EXPECT_EQ(serializeIfValid("text/plain"), "text/plain"); >+ EXPECT_EQ(serializeIfValid("text/plain "), "text/plain"); >+ EXPECT_EQ(serializeIfValid("text/PLAIN"), "text/plain"); >+ EXPECT_EQ(serializeIfValid("text /plain"), String()); >+ EXPECT_EQ(serializeIfValid("text/ plain"), String()); >+ EXPECT_EQ(serializeIfValid("text / plain"), String()); >+ EXPECT_EQ(serializeIfValid("te xt/plain"), String()); >+ EXPECT_EQ(serializeIfValid("text/pla in"), String()); >+ EXPECT_EQ(serializeIfValid("text"), String()); >+ EXPECT_EQ(serializeIfValid("text/"), String()); >+ EXPECT_EQ(serializeIfValid("/plain"), String()); >+ >+ EXPECT_EQ(serializeIfValid("text/plain;"), "text/plain"); >+ EXPECT_EQ(serializeIfValid("text/plain;test"), "text/plain"); >+ EXPECT_EQ(serializeIfValid("text/plain; test"), "text/plain"); >+ EXPECT_EQ(serializeIfValid("text/plain;test="), "text/plain"); >+ EXPECT_EQ(serializeIfValid("text/plain;test=;test=value"), "text/plain;test=value"); >+ EXPECT_EQ(serializeIfValid("text/plain;test=value"), "text/plain;test=value"); >+ EXPECT_EQ(serializeIfValid("text/plain; test=value"), "text/plain;test=value"); >+ EXPECT_EQ(serializeIfValid("text/plain;test =value"), "text/plain"); >+ EXPECT_EQ(serializeIfValid("text/plain;test= value"), "text/plain;test=\" value\""); >+ EXPECT_EQ(serializeIfValid("text/plain;test=value "), "text/plain;test=value"); >+ EXPECT_EQ(serializeIfValid("text/plain;test=\"value\""), "text/plain;test=value"); >+ EXPECT_EQ(serializeIfValid("text/plain;test=\"value"), "text/plain;test=value"); >+ EXPECT_EQ(serializeIfValid("text/plain;test=\""), "text/plain;test=\"\""); >+ EXPECT_EQ(serializeIfValid("text/plain;test=\"value\"foo"), "text/plain;test=value"); >+ EXPECT_EQ(serializeIfValid("text/plain;test=\"value\"foo;foo=bar"), "text/plain;test=value;foo=bar"); >+ EXPECT_EQ(serializeIfValid("text/plain;test=\"val\\ue\""), "text/plain;test=\"val\\ue\""); >+ EXPECT_EQ(serializeIfValid("text/plain;test=\"val\\\"ue\""), "text/plain;test=\"val\\\"ue\""); >+} >+ > } // namespace TestWebKitAPI
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 193909
:
361430
|
361627
|
361686
|
362241
|
362244