OLD | NEW |
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 Loading... |
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 // Don't allow single quotes to act as quote marks. |
| 297 EXPECT_FALSE(HttpUtil::StrictUnquote("'x\"'", &out)); |
| 298 EXPECT_TRUE(HttpUtil::StrictUnquote("\"x'\"", &out)); |
| 299 EXPECT_STREQ("x'", out.c_str()); |
| 300 EXPECT_FALSE(HttpUtil::StrictUnquote("''", &out)); |
250 } | 301 } |
251 | 302 |
252 TEST(HttpUtilTest, Quote) { | 303 TEST(HttpUtilTest, Quote) { |
253 EXPECT_STREQ("\"xyz\\\"abc\"", HttpUtil::Quote("xyz\"abc").c_str()); | 304 EXPECT_STREQ("\"xyz\\\"abc\"", HttpUtil::Quote("xyz\"abc").c_str()); |
254 | 305 |
255 // Replace <backslash> <backslash> with <backslash> | 306 // Replace <backslash> <backslash> with <backslash> |
256 EXPECT_STREQ("\"xyz\\\\abc\"", HttpUtil::Quote("xyz\\abc").c_str()); | 307 EXPECT_STREQ("\"xyz\\\\abc\"", HttpUtil::Quote("xyz\\abc").c_str()); |
257 | 308 |
258 // Replace <backslash> X with X | 309 // Replace <backslash> X with X |
259 EXPECT_STREQ("\"xyzXabc\"", HttpUtil::Quote("xyzXabc").c_str()); | 310 EXPECT_STREQ("\"xyzXabc\"", HttpUtil::Quote("xyzXabc").c_str()); |
(...skipping 835 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1095 HttpUtil::NameValuePairsIterator default_parser(data.begin(), data.end(), | 1146 HttpUtil::NameValuePairsIterator default_parser(data.begin(), data.end(), |
1096 ';'); | 1147 ';'); |
1097 EXPECT_TRUE(default_parser.valid()); | 1148 EXPECT_TRUE(default_parser.valid()); |
1098 ASSERT_NO_FATAL_FAILURE( | 1149 ASSERT_NO_FATAL_FAILURE( |
1099 CheckNextNameValuePair(&default_parser, true, true, "alpha", "1")); | 1150 CheckNextNameValuePair(&default_parser, true, true, "alpha", "1")); |
1100 ASSERT_NO_FATAL_FAILURE(CheckNextNameValuePair(&default_parser, false, false, | 1151 ASSERT_NO_FATAL_FAILURE(CheckNextNameValuePair(&default_parser, false, false, |
1101 std::string(), std::string())); | 1152 std::string(), std::string())); |
1102 | 1153 |
1103 HttpUtil::NameValuePairsIterator values_required_parser( | 1154 HttpUtil::NameValuePairsIterator values_required_parser( |
1104 data.begin(), data.end(), ';', | 1155 data.begin(), data.end(), ';', |
1105 HttpUtil::NameValuePairsIterator::VALUES_NOT_OPTIONAL); | 1156 HttpUtil::NameValuePairsIterator::Values::REQUIRED, |
| 1157 HttpUtil::NameValuePairsIterator::Quotes::NOT_STRICT); |
1106 EXPECT_TRUE(values_required_parser.valid()); | 1158 EXPECT_TRUE(values_required_parser.valid()); |
1107 ASSERT_NO_FATAL_FAILURE(CheckNextNameValuePair(&values_required_parser, true, | 1159 ASSERT_NO_FATAL_FAILURE(CheckNextNameValuePair(&values_required_parser, true, |
1108 true, "alpha", "1")); | 1160 true, "alpha", "1")); |
1109 ASSERT_NO_FATAL_FAILURE(CheckNextNameValuePair( | 1161 ASSERT_NO_FATAL_FAILURE(CheckNextNameValuePair( |
1110 &values_required_parser, false, false, std::string(), std::string())); | 1162 &values_required_parser, false, false, std::string(), std::string())); |
1111 | 1163 |
1112 HttpUtil::NameValuePairsIterator parser( | 1164 HttpUtil::NameValuePairsIterator parser( |
1113 data.begin(), data.end(), ';', | 1165 data.begin(), data.end(), ';', |
1114 HttpUtil::NameValuePairsIterator::VALUES_OPTIONAL); | 1166 HttpUtil::NameValuePairsIterator::Values::NOT_REQUIRED, |
| 1167 HttpUtil::NameValuePairsIterator::Quotes::NOT_STRICT); |
1115 EXPECT_TRUE(parser.valid()); | 1168 EXPECT_TRUE(parser.valid()); |
1116 | 1169 |
1117 ASSERT_NO_FATAL_FAILURE( | 1170 ASSERT_NO_FATAL_FAILURE( |
1118 CheckNextNameValuePair(&parser, true, true, "alpha", "1")); | 1171 CheckNextNameValuePair(&parser, true, true, "alpha", "1")); |
1119 ASSERT_NO_FATAL_FAILURE( | 1172 ASSERT_NO_FATAL_FAILURE( |
1120 CheckNextNameValuePair(&parser, true, true, "beta", std::string())); | 1173 CheckNextNameValuePair(&parser, true, true, "beta", std::string())); |
1121 ASSERT_NO_FATAL_FAILURE( | 1174 ASSERT_NO_FATAL_FAILURE( |
1122 CheckNextNameValuePair(&parser, true, true, "cappa", std::string())); | 1175 CheckNextNameValuePair(&parser, true, true, "cappa", std::string())); |
1123 ASSERT_NO_FATAL_FAILURE( | 1176 ASSERT_NO_FATAL_FAILURE( |
1124 CheckNextNameValuePair(&parser, true, true, "delta", std::string())); | 1177 CheckNextNameValuePair(&parser, true, true, "delta", std::string())); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1170 std::string data = "name='value"; | 1223 std::string data = "name='value"; |
1171 HttpUtil::NameValuePairsIterator parser(data.begin(), data.end(), ';'); | 1224 HttpUtil::NameValuePairsIterator parser(data.begin(), data.end(), ';'); |
1172 EXPECT_TRUE(parser.valid()); | 1225 EXPECT_TRUE(parser.valid()); |
1173 | 1226 |
1174 ASSERT_NO_FATAL_FAILURE( | 1227 ASSERT_NO_FATAL_FAILURE( |
1175 CheckNextNameValuePair(&parser, true, true, "name", "value")); | 1228 CheckNextNameValuePair(&parser, true, true, "name", "value")); |
1176 ASSERT_NO_FATAL_FAILURE(CheckNextNameValuePair( | 1229 ASSERT_NO_FATAL_FAILURE(CheckNextNameValuePair( |
1177 &parser, false, true, std::string(), std::string())); | 1230 &parser, false, true, std::string(), std::string())); |
1178 } | 1231 } |
1179 | 1232 |
| 1233 TEST(HttpUtilTest, NameValuePairsIteratorStrictQuotesEscapedEndQuote) { |
| 1234 std::string data = "foo=bar; name=\"value\\\""; |
| 1235 HttpUtil::NameValuePairsIterator parser( |
| 1236 data.begin(), data.end(), ';', |
| 1237 HttpUtil::NameValuePairsIterator::Values::REQUIRED, |
| 1238 HttpUtil::NameValuePairsIterator::Quotes::STRICT_QUOTES); |
| 1239 EXPECT_TRUE(parser.valid()); |
| 1240 |
| 1241 ASSERT_NO_FATAL_FAILURE( |
| 1242 CheckNextNameValuePair(&parser, true, true, "foo", "bar")); |
| 1243 ASSERT_NO_FATAL_FAILURE(CheckNextNameValuePair(&parser, false, false, |
| 1244 std::string(), std::string())); |
| 1245 } |
| 1246 |
| 1247 TEST(HttpUtilTest, NameValuePairsIteratorStrictQuotesQuoteInValue) { |
| 1248 std::string data = "foo=\"bar\"; name=\"va\"lue\""; |
| 1249 HttpUtil::NameValuePairsIterator parser( |
| 1250 data.begin(), data.end(), ';', |
| 1251 HttpUtil::NameValuePairsIterator::Values::REQUIRED, |
| 1252 HttpUtil::NameValuePairsIterator::Quotes::STRICT_QUOTES); |
| 1253 EXPECT_TRUE(parser.valid()); |
| 1254 |
| 1255 ASSERT_NO_FATAL_FAILURE( |
| 1256 CheckNextNameValuePair(&parser, true, true, "foo", "bar")); |
| 1257 ASSERT_NO_FATAL_FAILURE(CheckNextNameValuePair(&parser, false, false, |
| 1258 std::string(), std::string())); |
| 1259 } |
| 1260 |
| 1261 TEST(HttpUtilTest, NameValuePairsIteratorStrictQuotesMissingEndQuote) { |
| 1262 std::string data = "foo=\"bar\"; name=\"value"; |
| 1263 HttpUtil::NameValuePairsIterator parser( |
| 1264 data.begin(), data.end(), ';', |
| 1265 HttpUtil::NameValuePairsIterator::Values::REQUIRED, |
| 1266 HttpUtil::NameValuePairsIterator::Quotes::STRICT_QUOTES); |
| 1267 EXPECT_TRUE(parser.valid()); |
| 1268 |
| 1269 ASSERT_NO_FATAL_FAILURE( |
| 1270 CheckNextNameValuePair(&parser, true, true, "foo", "bar")); |
| 1271 ASSERT_NO_FATAL_FAILURE(CheckNextNameValuePair(&parser, false, false, |
| 1272 std::string(), std::string())); |
| 1273 } |
| 1274 |
| 1275 TEST(HttpUtilTest, NameValuePairsIteratorStrictQuotesSingleQuotes) { |
| 1276 std::string data = "foo=\"bar\"; name='value; ok=it'"; |
| 1277 HttpUtil::NameValuePairsIterator parser( |
| 1278 data.begin(), data.end(), ';', |
| 1279 HttpUtil::NameValuePairsIterator::Values::REQUIRED, |
| 1280 HttpUtil::NameValuePairsIterator::Quotes::STRICT_QUOTES); |
| 1281 EXPECT_TRUE(parser.valid()); |
| 1282 |
| 1283 ASSERT_NO_FATAL_FAILURE( |
| 1284 CheckNextNameValuePair(&parser, true, true, "foo", "bar")); |
| 1285 ASSERT_NO_FATAL_FAILURE( |
| 1286 CheckNextNameValuePair(&parser, true, true, "name", "'value")); |
| 1287 ASSERT_NO_FATAL_FAILURE( |
| 1288 CheckNextNameValuePair(&parser, true, true, "ok", "it'")); |
| 1289 } |
| 1290 |
1180 TEST(HttpUtilTest, IsValidHeaderValueRFC7230) { | 1291 TEST(HttpUtilTest, IsValidHeaderValueRFC7230) { |
1181 EXPECT_TRUE(HttpUtil::IsValidHeaderValueRFC7230("")); | 1292 EXPECT_TRUE(HttpUtil::IsValidHeaderValueRFC7230("")); |
1182 | 1293 |
1183 EXPECT_FALSE(HttpUtil::IsValidHeaderValueRFC7230(" ")); | 1294 EXPECT_FALSE(HttpUtil::IsValidHeaderValueRFC7230(" ")); |
1184 EXPECT_FALSE(HttpUtil::IsValidHeaderValueRFC7230(" q")); | 1295 EXPECT_FALSE(HttpUtil::IsValidHeaderValueRFC7230(" q")); |
1185 EXPECT_FALSE(HttpUtil::IsValidHeaderValueRFC7230("q ")); | 1296 EXPECT_FALSE(HttpUtil::IsValidHeaderValueRFC7230("q ")); |
1186 EXPECT_FALSE(HttpUtil::IsValidHeaderValueRFC7230("\t")); | 1297 EXPECT_FALSE(HttpUtil::IsValidHeaderValueRFC7230("\t")); |
1187 EXPECT_FALSE(HttpUtil::IsValidHeaderValueRFC7230("\tq")); | 1298 EXPECT_FALSE(HttpUtil::IsValidHeaderValueRFC7230("\tq")); |
1188 EXPECT_FALSE(HttpUtil::IsValidHeaderValueRFC7230("q\t")); | 1299 EXPECT_FALSE(HttpUtil::IsValidHeaderValueRFC7230("q\t")); |
1189 | 1300 |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1253 EXPECT_TRUE(HttpUtil::HasValidators(v1_1, kEtagWeak, kLastModified)); | 1364 EXPECT_TRUE(HttpUtil::HasValidators(v1_1, kEtagWeak, kLastModified)); |
1254 EXPECT_TRUE(HttpUtil::HasValidators(v1_1, kEtagEmpty, kLastModified)); | 1365 EXPECT_TRUE(HttpUtil::HasValidators(v1_1, kEtagEmpty, kLastModified)); |
1255 | 1366 |
1256 EXPECT_FALSE(HttpUtil::HasValidators(v1_1, kMissing, kLastModifiedInvalid)); | 1367 EXPECT_FALSE(HttpUtil::HasValidators(v1_1, kMissing, kLastModifiedInvalid)); |
1257 EXPECT_TRUE(HttpUtil::HasValidators(v1_1, kEtagStrong, kLastModifiedInvalid)); | 1368 EXPECT_TRUE(HttpUtil::HasValidators(v1_1, kEtagStrong, kLastModifiedInvalid)); |
1258 EXPECT_TRUE(HttpUtil::HasValidators(v1_1, kEtagWeak, kLastModifiedInvalid)); | 1369 EXPECT_TRUE(HttpUtil::HasValidators(v1_1, kEtagWeak, kLastModifiedInvalid)); |
1259 EXPECT_TRUE(HttpUtil::HasValidators(v1_1, kEtagEmpty, kLastModifiedInvalid)); | 1370 EXPECT_TRUE(HttpUtil::HasValidators(v1_1, kEtagEmpty, kLastModifiedInvalid)); |
1260 } | 1371 } |
1261 | 1372 |
1262 } // namespace net | 1373 } // namespace net |
OLD | NEW |