Index: net/http/http_util_unittest.cc |
diff --git a/net/http/http_util_unittest.cc b/net/http/http_util_unittest.cc |
index 2b456605d703ae7c5c7bb178d7b64ce4165e7e31..8df697a90d693a5a32d324174bf98e7ef67ab1f0 100644 |
--- a/net/http/http_util_unittest.cc |
+++ b/net/http/http_util_unittest.cc |
@@ -249,6 +249,40 @@ TEST(HttpUtilTest, Unquote) { |
EXPECT_STREQ("x\"", HttpUtil::Unquote("'x\"'").c_str()); |
} |
+TEST(HttpUtilTest, StrictUnquote) { |
+ std::string out; |
+ |
+ // Replace <backslash> " with ". |
+ EXPECT_TRUE(HttpUtil::StrictUnquote("\"xyz\\\"abc\"", &out)); |
+ EXPECT_STREQ("xyz\"abc", out.c_str()); |
+ |
+ // Replace <backslash> <backslash> with <backslash> |
+ EXPECT_TRUE(HttpUtil::StrictUnquote("\"xyz\\\\abc\"", &out)); |
+ EXPECT_STREQ("xyz\\abc", out.c_str()); |
+ EXPECT_TRUE(HttpUtil::StrictUnquote("\"xyz\\\\\\\\\\\\abc\"", &out)); |
+ EXPECT_STREQ("xyz\\\\\\abc", out.c_str()); |
+ |
+ // Replace <backslash> X with X |
+ EXPECT_TRUE(HttpUtil::StrictUnquote("\"xyz\\Xabc\"", &out)); |
+ EXPECT_STREQ("xyzXabc", out.c_str()); |
+ |
+ // Return false on unquoted inputs. |
+ EXPECT_FALSE(HttpUtil::StrictUnquote("X", &out)); |
+ |
+ // Return false on mismatched quotes. |
+ EXPECT_FALSE(HttpUtil::StrictUnquote("\"", &out)); |
+ EXPECT_FALSE(HttpUtil::StrictUnquote("\"xyz", &out)); |
+ EXPECT_FALSE(HttpUtil::StrictUnquote("\"abc'", &out)); |
+ |
+ // Return false on escaped terminal quote. |
+ EXPECT_FALSE(HttpUtil::StrictUnquote("\"abc\\\"", &out)); |
+ |
+ // Allow single quotes to act as quote marks. |
+ // Not part of RFC 2616. |
+ EXPECT_TRUE(HttpUtil::StrictUnquote("'x\"'", &out)); |
+ EXPECT_STREQ("x\"", out.c_str()); |
+} |
+ |
TEST(HttpUtilTest, Quote) { |
EXPECT_STREQ("\"xyz\\\"abc\"", HttpUtil::Quote("xyz\"abc").c_str()); |
@@ -1177,6 +1211,20 @@ TEST(HttpUtilTest, NameValuePairsIteratorMissingEndQuote) { |
&parser, false, true, std::string(), std::string())); |
} |
+TEST(HttpUtilTest, NameValuePairsIteratorStrictQuotes) { |
+ std::string data = "foo=\"bar\"; name='value"; |
+ HttpUtil::NameValuePairsIterator parser( |
+ data.begin(), data.end(), ';', |
+ HttpUtil::NameValuePairsIterator::VALUES_NOT_OPTIONAL, |
+ HttpUtil::NameValuePairsIterator::STRICT_QUOTES); |
+ EXPECT_TRUE(parser.valid()); |
+ |
+ ASSERT_NO_FATAL_FAILURE( |
+ CheckNextNameValuePair(&parser, true, true, "foo", "bar")); |
+ ASSERT_NO_FATAL_FAILURE(CheckNextNameValuePair(&parser, false, false, |
+ std::string(), std::string())); |
+} |
+ |
TEST(HttpUtilTest, IsValidHeaderValueRFC7230) { |
EXPECT_TRUE(HttpUtil::IsValidHeaderValueRFC7230("")); |