Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(693)

Unified Diff: net/http/http_util_unittest.cc

Issue 1811163002: Share link header parsing code between blink and content. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@base-optional
Patch Set: address more comments Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..90023bc11ebe157f9bcb63eb57390f1e3bcc332c 100644
--- a/net/http/http_util_unittest.cc
+++ b/net/http/http_util_unittest.cc
@@ -247,6 +247,60 @@ TEST(HttpUtilTest, Unquote) {
// Allow single quotes to act as quote marks.
// Not part of RFC 2616.
EXPECT_STREQ("x\"", HttpUtil::Unquote("'x\"'").c_str());
+
+ // Allow quotes in the middle of the input.
+ EXPECT_STREQ("foo\"bar", HttpUtil::Unquote("\"foo\"bar\"").c_str());
+
+ // Allow the final quote to be escaped.
+ EXPECT_STREQ("foo", HttpUtil::Unquote("\"foo\\\"").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());
+
+ // Empty quoted string.
+ EXPECT_TRUE(HttpUtil::StrictUnquote("\"\"", &out));
+ EXPECT_STREQ("", out.c_str());
+
+ // Return false on unquoted inputs.
+ EXPECT_FALSE(HttpUtil::StrictUnquote("X", &out));
+ EXPECT_FALSE(HttpUtil::StrictUnquote("", &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));
+ EXPECT_FALSE(HttpUtil::StrictUnquote("\"\\\"", &out));
+
+ // Allow escaped backslash before terminal quote.
+ EXPECT_TRUE(HttpUtil::StrictUnquote("\"\\\\\"", &out));
+ EXPECT_STREQ("\\", out.c_str());
+
+ // 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());
+ EXPECT_TRUE(HttpUtil::StrictUnquote("\"x'\"", &out));
+ EXPECT_STREQ("x'", out.c_str());
+ EXPECT_TRUE(HttpUtil::StrictUnquote("''", &out));
+ EXPECT_STREQ("", out.c_str());
}
TEST(HttpUtilTest, Quote) {
@@ -1102,7 +1156,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 +1166,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 +1233,48 @@ TEST(HttpUtilTest, NameValuePairsIteratorMissingEndQuote) {
&parser, false, true, std::string(), std::string()));
}
+TEST(HttpUtilTest, NameValuePairsIteratorStrictQuotesEscapedEndQuote) {
+ std::string data = "foo=bar; name=\"value\\\"";
+ 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, NameValuePairsIteratorStrictQuotesQuoteInValue) {
+ std::string data = "foo=\"bar\"; name=\"va\"lue\"";
+ 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, NameValuePairsIteratorStrictQuotesMissingEndQuote) {
+ std::string data = "foo=\"bar\"; name='value";
+ 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(""));

Powered by Google App Engine
This is Rietveld 408576698