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..a9593603dd9e9118adbeca4086b2527f93066e22 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)); |
mmenke
2016/04/26 18:05:58
Suggest duplicating this test,but with single and
|
+ EXPECT_STREQ("x\"", out.c_str()); |
+} |
mmenke
2016/04/26 18:05:58
Some more other suggested tests:
Minimal quoted s
|
+ |
TEST(HttpUtilTest, Quote) { |
EXPECT_STREQ("\"xyz\\\"abc\"", HttpUtil::Quote("xyz\"abc").c_str()); |
@@ -1102,7 +1136,8 @@ TEST(HttpUtilTest, NameValuePairsIteratorOptionalValues) { |
HttpUtil::NameValuePairsIterator values_required_parser( |
data.begin(), data.end(), ';', |
- HttpUtil::NameValuePairsIterator::VALUES_NOT_OPTIONAL); |
+ HttpUtil::NameValuePairsIterator::Values::NOT_OPTIONAL, |
+ HttpUtil::NameValuePairsIterator::Quotes::NOT_STRICT); |
EXPECT_TRUE(values_required_parser.valid()); |
ASSERT_NO_FATAL_FAILURE(CheckNextNameValuePair(&values_required_parser, true, |
true, "alpha", "1")); |
@@ -1111,7 +1146,8 @@ TEST(HttpUtilTest, NameValuePairsIteratorOptionalValues) { |
HttpUtil::NameValuePairsIterator parser( |
data.begin(), data.end(), ';', |
- HttpUtil::NameValuePairsIterator::VALUES_OPTIONAL); |
+ HttpUtil::NameValuePairsIterator::Values::OPTIONAL, |
+ HttpUtil::NameValuePairsIterator::Quotes::NOT_STRICT); |
EXPECT_TRUE(parser.valid()); |
ASSERT_NO_FATAL_FAILURE( |
@@ -1177,6 +1213,20 @@ TEST(HttpUtilTest, NameValuePairsIteratorMissingEndQuote) { |
&parser, false, true, std::string(), std::string())); |
} |
+TEST(HttpUtilTest, NameValuePairsIteratorStrictQuotes) { |
+ std::string data = "foo=\"bar\"; name='value"; |
mmenke
2016/04/26 18:05:58
Also, shouldn't use mismatched quotes in this test
mmenke
2016/04/26 18:05:58
Could you also test a case with a missing end quot
Marijn Kruisselbrink
2016/04/27 01:49:50
This does in fact only fail in strict mode (the ex
mmenke
2016/04/27 04:02:40
Oops, sorry, misread the test - was thinking the f
|
+ HttpUtil::NameValuePairsIterator parser( |
+ data.begin(), data.end(), ';', |
+ HttpUtil::NameValuePairsIterator::Values::NOT_OPTIONAL, |
+ HttpUtil::NameValuePairsIterator::Quotes::STRICT); |
+ 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("")); |