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

Side by Side 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, 7 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <algorithm> 5 #include <algorithm>
6 6
7 #include "base/strings/string_util.h" 7 #include "base/strings/string_util.h"
8 #include "net/http/http_util.h" 8 #include "net/http/http_util.h"
9 #include "testing/gtest/include/gtest/gtest.h" 9 #include "testing/gtest/include/gtest/gtest.h"
10 10
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 // Replace <backslash> X with X 240 // Replace <backslash> X with X
241 EXPECT_STREQ("xyzXabc", HttpUtil::Unquote("\"xyz\\Xabc\"").c_str()); 241 EXPECT_STREQ("xyzXabc", HttpUtil::Unquote("\"xyz\\Xabc\"").c_str());
242 242
243 // Act as identity function on unquoted inputs. 243 // Act as identity function on unquoted inputs.
244 EXPECT_STREQ("X", HttpUtil::Unquote("X").c_str()); 244 EXPECT_STREQ("X", HttpUtil::Unquote("X").c_str());
245 EXPECT_STREQ("\"", HttpUtil::Unquote("\"").c_str()); 245 EXPECT_STREQ("\"", HttpUtil::Unquote("\"").c_str());
246 246
247 // Allow single quotes to act as quote marks. 247 // Allow single quotes to act as quote marks.
248 // Not part of RFC 2616. 248 // Not part of RFC 2616.
249 EXPECT_STREQ("x\"", HttpUtil::Unquote("'x\"'").c_str()); 249 EXPECT_STREQ("x\"", HttpUtil::Unquote("'x\"'").c_str());
250
251 // Allow quotes in the middle of the input.
252 EXPECT_STREQ("foo\"bar", HttpUtil::Unquote("\"foo\"bar\"").c_str());
253
254 // Allow the final quote to be escaped.
255 EXPECT_STREQ("foo", HttpUtil::Unquote("\"foo\\\"").c_str());
256 }
257
258 TEST(HttpUtilTest, StrictUnquote) {
259 std::string out;
260
261 // Replace <backslash> " with ".
262 EXPECT_TRUE(HttpUtil::StrictUnquote("\"xyz\\\"abc\"", &out));
263 EXPECT_STREQ("xyz\"abc", out.c_str());
264
265 // Replace <backslash> <backslash> with <backslash>.
266 EXPECT_TRUE(HttpUtil::StrictUnquote("\"xyz\\\\abc\"", &out));
267 EXPECT_STREQ("xyz\\abc", out.c_str());
268 EXPECT_TRUE(HttpUtil::StrictUnquote("\"xyz\\\\\\\\\\\\abc\"", &out));
269 EXPECT_STREQ("xyz\\\\\\abc", out.c_str());
270
271 // Replace <backslash> X with X.
272 EXPECT_TRUE(HttpUtil::StrictUnquote("\"xyz\\Xabc\"", &out));
273 EXPECT_STREQ("xyzXabc", out.c_str());
274
275 // Empty quoted string.
276 EXPECT_TRUE(HttpUtil::StrictUnquote("\"\"", &out));
277 EXPECT_STREQ("", out.c_str());
278
279 // Return false on unquoted inputs.
280 EXPECT_FALSE(HttpUtil::StrictUnquote("X", &out));
281 EXPECT_FALSE(HttpUtil::StrictUnquote("", &out));
282
283 // Return false on mismatched quotes.
284 EXPECT_FALSE(HttpUtil::StrictUnquote("\"", &out));
285 EXPECT_FALSE(HttpUtil::StrictUnquote("\"xyz", &out));
286 EXPECT_FALSE(HttpUtil::StrictUnquote("\"abc'", &out));
287
288 // Return false on escaped terminal quote.
289 EXPECT_FALSE(HttpUtil::StrictUnquote("\"abc\\\"", &out));
290 EXPECT_FALSE(HttpUtil::StrictUnquote("\"\\\"", &out));
291
292 // Allow escaped backslash before terminal quote.
293 EXPECT_TRUE(HttpUtil::StrictUnquote("\"\\\\\"", &out));
294 EXPECT_STREQ("\\", out.c_str());
295
296 // Allow single quotes to act as quote marks.
297 // Not part of RFC 2616.
298 EXPECT_TRUE(HttpUtil::StrictUnquote("'x\"'", &out));
299 EXPECT_STREQ("x\"", out.c_str());
300 EXPECT_TRUE(HttpUtil::StrictUnquote("\"x'\"", &out));
301 EXPECT_STREQ("x'", out.c_str());
302 EXPECT_TRUE(HttpUtil::StrictUnquote("''", &out));
303 EXPECT_STREQ("", out.c_str());
250 } 304 }
251 305
252 TEST(HttpUtilTest, Quote) { 306 TEST(HttpUtilTest, Quote) {
253 EXPECT_STREQ("\"xyz\\\"abc\"", HttpUtil::Quote("xyz\"abc").c_str()); 307 EXPECT_STREQ("\"xyz\\\"abc\"", HttpUtil::Quote("xyz\"abc").c_str());
254 308
255 // Replace <backslash> <backslash> with <backslash> 309 // Replace <backslash> <backslash> with <backslash>
256 EXPECT_STREQ("\"xyz\\\\abc\"", HttpUtil::Quote("xyz\\abc").c_str()); 310 EXPECT_STREQ("\"xyz\\\\abc\"", HttpUtil::Quote("xyz\\abc").c_str());
257 311
258 // Replace <backslash> X with X 312 // Replace <backslash> X with X
259 EXPECT_STREQ("\"xyzXabc\"", HttpUtil::Quote("xyzXabc").c_str()); 313 EXPECT_STREQ("\"xyzXabc\"", HttpUtil::Quote("xyzXabc").c_str());
(...skipping 835 matching lines...) Expand 10 before | Expand all | Expand 10 after
1095 HttpUtil::NameValuePairsIterator default_parser(data.begin(), data.end(), 1149 HttpUtil::NameValuePairsIterator default_parser(data.begin(), data.end(),
1096 ';'); 1150 ';');
1097 EXPECT_TRUE(default_parser.valid()); 1151 EXPECT_TRUE(default_parser.valid());
1098 ASSERT_NO_FATAL_FAILURE( 1152 ASSERT_NO_FATAL_FAILURE(
1099 CheckNextNameValuePair(&default_parser, true, true, "alpha", "1")); 1153 CheckNextNameValuePair(&default_parser, true, true, "alpha", "1"));
1100 ASSERT_NO_FATAL_FAILURE(CheckNextNameValuePair(&default_parser, false, false, 1154 ASSERT_NO_FATAL_FAILURE(CheckNextNameValuePair(&default_parser, false, false,
1101 std::string(), std::string())); 1155 std::string(), std::string()));
1102 1156
1103 HttpUtil::NameValuePairsIterator values_required_parser( 1157 HttpUtil::NameValuePairsIterator values_required_parser(
1104 data.begin(), data.end(), ';', 1158 data.begin(), data.end(), ';',
1105 HttpUtil::NameValuePairsIterator::VALUES_NOT_OPTIONAL); 1159 HttpUtil::NameValuePairsIterator::Values::NOT_OPTIONAL,
1160 HttpUtil::NameValuePairsIterator::Quotes::NOT_STRICT);
1106 EXPECT_TRUE(values_required_parser.valid()); 1161 EXPECT_TRUE(values_required_parser.valid());
1107 ASSERT_NO_FATAL_FAILURE(CheckNextNameValuePair(&values_required_parser, true, 1162 ASSERT_NO_FATAL_FAILURE(CheckNextNameValuePair(&values_required_parser, true,
1108 true, "alpha", "1")); 1163 true, "alpha", "1"));
1109 ASSERT_NO_FATAL_FAILURE(CheckNextNameValuePair( 1164 ASSERT_NO_FATAL_FAILURE(CheckNextNameValuePair(
1110 &values_required_parser, false, false, std::string(), std::string())); 1165 &values_required_parser, false, false, std::string(), std::string()));
1111 1166
1112 HttpUtil::NameValuePairsIterator parser( 1167 HttpUtil::NameValuePairsIterator parser(
1113 data.begin(), data.end(), ';', 1168 data.begin(), data.end(), ';',
1114 HttpUtil::NameValuePairsIterator::VALUES_OPTIONAL); 1169 HttpUtil::NameValuePairsIterator::Values::OPTIONAL,
1170 HttpUtil::NameValuePairsIterator::Quotes::NOT_STRICT);
1115 EXPECT_TRUE(parser.valid()); 1171 EXPECT_TRUE(parser.valid());
1116 1172
1117 ASSERT_NO_FATAL_FAILURE( 1173 ASSERT_NO_FATAL_FAILURE(
1118 CheckNextNameValuePair(&parser, true, true, "alpha", "1")); 1174 CheckNextNameValuePair(&parser, true, true, "alpha", "1"));
1119 ASSERT_NO_FATAL_FAILURE( 1175 ASSERT_NO_FATAL_FAILURE(
1120 CheckNextNameValuePair(&parser, true, true, "beta", std::string())); 1176 CheckNextNameValuePair(&parser, true, true, "beta", std::string()));
1121 ASSERT_NO_FATAL_FAILURE( 1177 ASSERT_NO_FATAL_FAILURE(
1122 CheckNextNameValuePair(&parser, true, true, "cappa", std::string())); 1178 CheckNextNameValuePair(&parser, true, true, "cappa", std::string()));
1123 ASSERT_NO_FATAL_FAILURE( 1179 ASSERT_NO_FATAL_FAILURE(
1124 CheckNextNameValuePair(&parser, true, true, "delta", std::string())); 1180 CheckNextNameValuePair(&parser, true, true, "delta", std::string()));
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1170 std::string data = "name='value"; 1226 std::string data = "name='value";
1171 HttpUtil::NameValuePairsIterator parser(data.begin(), data.end(), ';'); 1227 HttpUtil::NameValuePairsIterator parser(data.begin(), data.end(), ';');
1172 EXPECT_TRUE(parser.valid()); 1228 EXPECT_TRUE(parser.valid());
1173 1229
1174 ASSERT_NO_FATAL_FAILURE( 1230 ASSERT_NO_FATAL_FAILURE(
1175 CheckNextNameValuePair(&parser, true, true, "name", "value")); 1231 CheckNextNameValuePair(&parser, true, true, "name", "value"));
1176 ASSERT_NO_FATAL_FAILURE(CheckNextNameValuePair( 1232 ASSERT_NO_FATAL_FAILURE(CheckNextNameValuePair(
1177 &parser, false, true, std::string(), std::string())); 1233 &parser, false, true, std::string(), std::string()));
1178 } 1234 }
1179 1235
1236 TEST(HttpUtilTest, NameValuePairsIteratorStrictQuotesEscapedEndQuote) {
1237 std::string data = "foo=bar; name=\"value\\\"";
1238 HttpUtil::NameValuePairsIterator parser(
1239 data.begin(), data.end(), ';',
1240 HttpUtil::NameValuePairsIterator::Values::NOT_OPTIONAL,
1241 HttpUtil::NameValuePairsIterator::Quotes::STRICT);
1242 EXPECT_TRUE(parser.valid());
1243
1244 ASSERT_NO_FATAL_FAILURE(
1245 CheckNextNameValuePair(&parser, true, true, "foo", "bar"));
1246 ASSERT_NO_FATAL_FAILURE(CheckNextNameValuePair(&parser, false, false,
1247 std::string(), std::string()));
1248 }
1249
1250 TEST(HttpUtilTest, NameValuePairsIteratorStrictQuotesQuoteInValue) {
1251 std::string data = "foo=\"bar\"; name=\"va\"lue\"";
1252 HttpUtil::NameValuePairsIterator parser(
1253 data.begin(), data.end(), ';',
1254 HttpUtil::NameValuePairsIterator::Values::NOT_OPTIONAL,
1255 HttpUtil::NameValuePairsIterator::Quotes::STRICT);
1256 EXPECT_TRUE(parser.valid());
1257
1258 ASSERT_NO_FATAL_FAILURE(
1259 CheckNextNameValuePair(&parser, true, true, "foo", "bar"));
1260 ASSERT_NO_FATAL_FAILURE(CheckNextNameValuePair(&parser, false, false,
1261 std::string(), std::string()));
1262 }
1263
1264 TEST(HttpUtilTest, NameValuePairsIteratorStrictQuotesMissingEndQuote) {
1265 std::string data = "foo=\"bar\"; name='value";
1266 HttpUtil::NameValuePairsIterator parser(
1267 data.begin(), data.end(), ';',
1268 HttpUtil::NameValuePairsIterator::Values::NOT_OPTIONAL,
1269 HttpUtil::NameValuePairsIterator::Quotes::STRICT);
1270 EXPECT_TRUE(parser.valid());
1271
1272 ASSERT_NO_FATAL_FAILURE(
1273 CheckNextNameValuePair(&parser, true, true, "foo", "bar"));
1274 ASSERT_NO_FATAL_FAILURE(CheckNextNameValuePair(&parser, false, false,
1275 std::string(), std::string()));
1276 }
1277
1180 TEST(HttpUtilTest, IsValidHeaderValueRFC7230) { 1278 TEST(HttpUtilTest, IsValidHeaderValueRFC7230) {
1181 EXPECT_TRUE(HttpUtil::IsValidHeaderValueRFC7230("")); 1279 EXPECT_TRUE(HttpUtil::IsValidHeaderValueRFC7230(""));
1182 1280
1183 EXPECT_FALSE(HttpUtil::IsValidHeaderValueRFC7230(" ")); 1281 EXPECT_FALSE(HttpUtil::IsValidHeaderValueRFC7230(" "));
1184 EXPECT_FALSE(HttpUtil::IsValidHeaderValueRFC7230(" q")); 1282 EXPECT_FALSE(HttpUtil::IsValidHeaderValueRFC7230(" q"));
1185 EXPECT_FALSE(HttpUtil::IsValidHeaderValueRFC7230("q ")); 1283 EXPECT_FALSE(HttpUtil::IsValidHeaderValueRFC7230("q "));
1186 EXPECT_FALSE(HttpUtil::IsValidHeaderValueRFC7230("\t")); 1284 EXPECT_FALSE(HttpUtil::IsValidHeaderValueRFC7230("\t"));
1187 EXPECT_FALSE(HttpUtil::IsValidHeaderValueRFC7230("\tq")); 1285 EXPECT_FALSE(HttpUtil::IsValidHeaderValueRFC7230("\tq"));
1188 EXPECT_FALSE(HttpUtil::IsValidHeaderValueRFC7230("q\t")); 1286 EXPECT_FALSE(HttpUtil::IsValidHeaderValueRFC7230("q\t"));
1189 1287
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
1253 EXPECT_TRUE(HttpUtil::HasValidators(v1_1, kEtagWeak, kLastModified)); 1351 EXPECT_TRUE(HttpUtil::HasValidators(v1_1, kEtagWeak, kLastModified));
1254 EXPECT_TRUE(HttpUtil::HasValidators(v1_1, kEtagEmpty, kLastModified)); 1352 EXPECT_TRUE(HttpUtil::HasValidators(v1_1, kEtagEmpty, kLastModified));
1255 1353
1256 EXPECT_FALSE(HttpUtil::HasValidators(v1_1, kMissing, kLastModifiedInvalid)); 1354 EXPECT_FALSE(HttpUtil::HasValidators(v1_1, kMissing, kLastModifiedInvalid));
1257 EXPECT_TRUE(HttpUtil::HasValidators(v1_1, kEtagStrong, kLastModifiedInvalid)); 1355 EXPECT_TRUE(HttpUtil::HasValidators(v1_1, kEtagStrong, kLastModifiedInvalid));
1258 EXPECT_TRUE(HttpUtil::HasValidators(v1_1, kEtagWeak, kLastModifiedInvalid)); 1356 EXPECT_TRUE(HttpUtil::HasValidators(v1_1, kEtagWeak, kLastModifiedInvalid));
1259 EXPECT_TRUE(HttpUtil::HasValidators(v1_1, kEtagEmpty, kLastModifiedInvalid)); 1357 EXPECT_TRUE(HttpUtil::HasValidators(v1_1, kEtagEmpty, kLastModifiedInvalid));
1260 } 1358 }
1261 1359
1262 } // namespace net 1360 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698