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 // 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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |