| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 #include "net/quic/core/spdy_utils.h" | 4 #include "net/quic/core/spdy_utils.h" |
| 5 | 5 |
| 6 #include <memory> | 6 #include <memory> |
| 7 | 7 |
| 8 #include "base/macros.h" | 8 #include "base/macros.h" |
| 9 #include "net/quic/platform/api/quic_flag_utils.h" |
| 10 #include "net/quic/platform/api/quic_flags.h" |
| 9 #include "net/quic/platform/api/quic_string_piece.h" | 11 #include "net/quic/platform/api/quic_string_piece.h" |
| 10 #include "net/quic/platform/api/quic_text_utils.h" | 12 #include "net/quic/platform/api/quic_text_utils.h" |
| 11 #include "net/test/gtest_util.h" | 13 #include "net/test/gtest_util.h" |
| 12 | 14 |
| 13 using std::string; | 15 using std::string; |
| 14 using testing::UnorderedElementsAre; | 16 using testing::UnorderedElementsAre; |
| 15 using testing::Pair; | 17 using testing::Pair; |
| 16 | 18 |
| 17 namespace net { | 19 namespace net { |
| 18 namespace test { | 20 namespace test { |
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 239 // Pseudo headers are illegal in trailers. | 241 // Pseudo headers are illegal in trailers. |
| 240 auto trailers = | 242 auto trailers = |
| 241 FromList({{":pseudo_key", "value"}, {kFinalOffsetHeaderKey, "1234"}}); | 243 FromList({{":pseudo_key", "value"}, {kFinalOffsetHeaderKey, "1234"}}); |
| 242 size_t final_byte_offset = 0; | 244 size_t final_byte_offset = 0; |
| 243 SpdyHeaderBlock block; | 245 SpdyHeaderBlock block; |
| 244 EXPECT_FALSE(SpdyUtils::CopyAndValidateTrailers(*trailers, &final_byte_offset, | 246 EXPECT_FALSE(SpdyUtils::CopyAndValidateTrailers(*trailers, &final_byte_offset, |
| 245 &block)); | 247 &block)); |
| 246 } | 248 } |
| 247 | 249 |
| 248 TEST(CopyAndValidateTrailers, DuplicateTrailers) { | 250 TEST(CopyAndValidateTrailers, DuplicateTrailers) { |
| 249 // Duplicate trailers are not allowed. | 251 // Duplicate trailers are allowed, and their values are concatenated into a |
| 252 // single string delimted with '\0'. Some of the duplicate headers |
| 253 // deliberately have an empty value. |
| 254 FLAGS_quic_reloadable_flag_quic_handle_duplicate_trailers = true; |
| 250 auto trailers = FromList({{"key", "value0"}, | 255 auto trailers = FromList({{"key", "value0"}, |
| 251 {"key", "value1"}, | 256 {"key", "value1"}, |
| 252 {"key", ""}, | 257 {"key", ""}, |
| 253 {"key", ""}, | 258 {"key", ""}, |
| 254 {"key", "value2"}, | 259 {"key", "value2"}, |
| 255 {"key", ""}, | 260 {"key", ""}, |
| 256 {kFinalOffsetHeaderKey, "1234"}, | 261 {kFinalOffsetHeaderKey, "1234"}, |
| 257 {"other_key", "value"}, | 262 {"other_key", "value"}, |
| 258 {"key", "non_contiguous_duplicate"}}); | 263 {"key", "non_contiguous_duplicate"}}); |
| 259 size_t final_byte_offset = 0; | 264 size_t final_byte_offset = 0; |
| 260 SpdyHeaderBlock block; | 265 SpdyHeaderBlock block; |
| 261 EXPECT_FALSE(SpdyUtils::CopyAndValidateTrailers(*trailers, &final_byte_offset, | 266 EXPECT_TRUE(SpdyUtils::CopyAndValidateTrailers(*trailers, &final_byte_offset, |
| 262 &block)); | 267 &block)); |
| 268 EXPECT_THAT( |
| 269 block, |
| 270 UnorderedElementsAre( |
| 271 Pair("key", |
| 272 QuicStringPiece( |
| 273 "value0\0value1\0\0\0value2\0\0non_contiguous_duplicate", |
| 274 48)), |
| 275 Pair("other_key", "value"))); |
| 276 } |
| 277 |
| 278 TEST(CopyAndValidateTrailers, DuplicateCookies) { |
| 279 // Duplicate cookie headers in trailers should be concatenated into a single |
| 280 // "; " delimted string. |
| 281 FLAGS_quic_reloadable_flag_quic_handle_duplicate_trailers = true; |
| 282 auto headers = FromList({{"cookie", " part 1"}, |
| 283 {"cookie", "part 2 "}, |
| 284 {"cookie", "part3"}, |
| 285 {"key", "value"}, |
| 286 {kFinalOffsetHeaderKey, "1234"}, |
| 287 {"cookie", " non_contiguous_cookie!"}}); |
| 288 |
| 289 size_t final_byte_offset = 0; |
| 290 SpdyHeaderBlock block; |
| 291 EXPECT_TRUE( |
| 292 SpdyUtils::CopyAndValidateTrailers(*headers, &final_byte_offset, &block)); |
| 293 EXPECT_THAT( |
| 294 block, |
| 295 UnorderedElementsAre( |
| 296 Pair("cookie", " part 1; part 2 ; part3; non_contiguous_cookie!"), |
| 297 Pair("key", "value"))); |
| 263 } | 298 } |
| 264 | 299 |
| 265 TEST(GetUrlFromHeaderBlock, Basic) { | 300 TEST(GetUrlFromHeaderBlock, Basic) { |
| 266 SpdyHeaderBlock headers; | 301 SpdyHeaderBlock headers; |
| 267 EXPECT_EQ(SpdyUtils::GetUrlFromHeaderBlock(headers), ""); | 302 EXPECT_EQ(SpdyUtils::GetUrlFromHeaderBlock(headers), ""); |
| 268 headers[":scheme"] = "https"; | 303 headers[":scheme"] = "https"; |
| 269 EXPECT_EQ(SpdyUtils::GetUrlFromHeaderBlock(headers), ""); | 304 EXPECT_EQ(SpdyUtils::GetUrlFromHeaderBlock(headers), ""); |
| 270 headers[":authority"] = "www.google.com"; | 305 headers[":authority"] = "www.google.com"; |
| 271 EXPECT_EQ(SpdyUtils::GetUrlFromHeaderBlock(headers), ""); | 306 EXPECT_EQ(SpdyUtils::GetUrlFromHeaderBlock(headers), ""); |
| 272 headers[":path"] = "/index.html"; | 307 headers[":path"] = "/index.html"; |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 319 TEST(PopulateHeaderBlockFromUrl, Failure) { | 354 TEST(PopulateHeaderBlockFromUrl, Failure) { |
| 320 SpdyHeaderBlock headers; | 355 SpdyHeaderBlock headers; |
| 321 EXPECT_FALSE(SpdyUtils::PopulateHeaderBlockFromUrl("/", &headers)); | 356 EXPECT_FALSE(SpdyUtils::PopulateHeaderBlockFromUrl("/", &headers)); |
| 322 EXPECT_FALSE(SpdyUtils::PopulateHeaderBlockFromUrl("/index.html", &headers)); | 357 EXPECT_FALSE(SpdyUtils::PopulateHeaderBlockFromUrl("/index.html", &headers)); |
| 323 EXPECT_FALSE( | 358 EXPECT_FALSE( |
| 324 SpdyUtils::PopulateHeaderBlockFromUrl("www.google.com/", &headers)); | 359 SpdyUtils::PopulateHeaderBlockFromUrl("www.google.com/", &headers)); |
| 325 } | 360 } |
| 326 | 361 |
| 327 } // namespace test | 362 } // namespace test |
| 328 } // namespace net | 363 } // namespace net |
| OLD | NEW |