| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "net/spdy/hpack/hpack_encoder.h" | 5 #include "net/spdy/hpack/hpack_encoder.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "testing/gmock/include/gmock/gmock.h" | 10 #include "testing/gmock/include/gmock/gmock.h" |
| (...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 285 EXPECT_EQ(expected_out, actual_out); | 285 EXPECT_EQ(expected_out, actual_out); |
| 286 } | 286 } |
| 287 | 287 |
| 288 TEST_F(HpackEncoderTest, MultipleEncodingPasses) { | 288 TEST_F(HpackEncoderTest, MultipleEncodingPasses) { |
| 289 // Pass 1. | 289 // Pass 1. |
| 290 { | 290 { |
| 291 SpdyHeaderBlock headers; | 291 SpdyHeaderBlock headers; |
| 292 headers["key1"] = "value1"; | 292 headers["key1"] = "value1"; |
| 293 headers["cookie"] = "a=bb"; | 293 headers["cookie"] = "a=bb"; |
| 294 | 294 |
| 295 ExpectIndex(IndexOf(key_1_)); |
| 295 ExpectIndex(IndexOf(cookie_a_)); | 296 ExpectIndex(IndexOf(cookie_a_)); |
| 296 ExpectIndex(IndexOf(key_1_)); | |
| 297 CompareWithExpectedEncoding(headers); | 297 CompareWithExpectedEncoding(headers); |
| 298 } | 298 } |
| 299 // Header table is: | 299 // Header table is: |
| 300 // 65: key1: value1 | 300 // 65: key1: value1 |
| 301 // 64: key2: value2 | 301 // 64: key2: value2 |
| 302 // 63: cookie: a=bb | 302 // 63: cookie: a=bb |
| 303 // 62: cookie: c=dd | 303 // 62: cookie: c=dd |
| 304 // Pass 2. | 304 // Pass 2. |
| 305 { | 305 { |
| 306 SpdyHeaderBlock headers; | 306 SpdyHeaderBlock headers; |
| 307 headers["key2"] = "value2"; | 307 headers["key2"] = "value2"; |
| 308 headers["cookie"] = "c=dd; e=ff"; | 308 headers["cookie"] = "c=dd; e=ff"; |
| 309 | 309 |
| 310 ExpectIndex(IndexOf(cookie_c_)); | 310 // "key2: value2" |
| 311 ExpectIndex(64); |
| 312 // "cookie: c=dd" |
| 313 ExpectIndex(62); |
| 311 // This cookie evicts |key1| from the dynamic table. | 314 // This cookie evicts |key1| from the dynamic table. |
| 312 ExpectIndexedLiteral(peer_.table()->GetByName("cookie"), "e=ff"); | 315 ExpectIndexedLiteral(peer_.table()->GetByName("cookie"), "e=ff"); |
| 313 // "key2: value2" | |
| 314 ExpectIndex(65); | |
| 315 | 316 |
| 316 CompareWithExpectedEncoding(headers); | 317 CompareWithExpectedEncoding(headers); |
| 317 } | 318 } |
| 318 // Header table is: | 319 // Header table is: |
| 319 // 65: key2: value2 | 320 // 65: key2: value2 |
| 320 // 64: cookie: a=bb | 321 // 64: cookie: a=bb |
| 321 // 63: cookie: c=dd | 322 // 63: cookie: c=dd |
| 322 // 62: cookie: e=ff | 323 // 62: cookie: e=ff |
| 323 // Pass 3. | 324 // Pass 3. |
| 324 { | 325 { |
| 325 SpdyHeaderBlock headers; | 326 SpdyHeaderBlock headers; |
| 326 headers["key2"] = "value2"; | 327 headers["key2"] = "value2"; |
| 327 headers["cookie"] = "a=bb; b=cc; c=dd"; | 328 headers["cookie"] = "a=bb; b=cc; c=dd"; |
| 328 | 329 |
| 330 // "key2: value2" |
| 331 ExpectIndex(65); |
| 329 // "cookie: a=bb" | 332 // "cookie: a=bb" |
| 330 ExpectIndex(64); | 333 ExpectIndex(64); |
| 331 // This cookie evicts |key2| from the dynamic table. | 334 // This cookie evicts |key2| from the dynamic table. |
| 332 ExpectIndexedLiteral(peer_.table()->GetByName("cookie"), "b=cc"); | 335 ExpectIndexedLiteral(peer_.table()->GetByName("cookie"), "b=cc"); |
| 333 // "cookie: c=dd" | 336 // "cookie: c=dd" |
| 334 ExpectIndex(64); | 337 ExpectIndex(64); |
| 335 // "key2: value2" | |
| 336 ExpectIndexedLiteral("key2", "value2"); | |
| 337 | 338 |
| 338 CompareWithExpectedEncoding(headers); | 339 CompareWithExpectedEncoding(headers); |
| 339 } | 340 } |
| 340 } | 341 } |
| 341 | 342 |
| 342 TEST_F(HpackEncoderTest, PseudoHeadersFirst) { | 343 TEST_F(HpackEncoderTest, PseudoHeadersFirst) { |
| 343 SpdyHeaderBlock headers; | 344 SpdyHeaderBlock headers; |
| 345 // A pseudo-header that should not be indexed. |
| 346 headers[":path"] = "/spam/eggs.html"; |
| 344 // A pseudo-header to be indexed. | 347 // A pseudo-header to be indexed. |
| 345 headers[":authority"] = "www.example.com"; | 348 headers[":authority"] = "www.example.com"; |
| 346 // A pseudo-header that should not be indexed. | |
| 347 headers[":path"] = "/spam/eggs.html"; | |
| 348 // A regular header which precedes ":" alphabetically, should still be encoded | 349 // A regular header which precedes ":" alphabetically, should still be encoded |
| 349 // after pseudo-headers. | 350 // after pseudo-headers. |
| 350 headers["-foo"] = "bar"; | 351 headers["-foo"] = "bar"; |
| 351 headers["foo"] = "bar"; | 352 headers["foo"] = "bar"; |
| 352 headers["cookie"] = "c=dd"; | 353 headers["cookie"] = "c=dd"; |
| 353 | 354 |
| 354 // Pseudo-headers are encoded in alphabetical order. | 355 // Headers are indexed in the order in which they were added. |
| 355 // This entry pushes "cookie: a=bb" back to 63. | 356 // This entry pushes "cookie: a=bb" back to 63. |
| 357 ExpectNonIndexedLiteral(":path", "/spam/eggs.html"); |
| 356 ExpectIndexedLiteral(peer_.table()->GetByName(":authority"), | 358 ExpectIndexedLiteral(peer_.table()->GetByName(":authority"), |
| 357 "www.example.com"); | 359 "www.example.com"); |
| 358 ExpectNonIndexedLiteral(":path", "/spam/eggs.html"); | |
| 359 // Regular headers are endoded in alphabetical order. | |
| 360 // This entry pushes "cookie: a=bb" back to 64. | |
| 361 ExpectIndexedLiteral("-foo", "bar"); | 360 ExpectIndexedLiteral("-foo", "bar"); |
| 362 ExpectIndex(64); | |
| 363 ExpectIndexedLiteral("foo", "bar"); | 361 ExpectIndexedLiteral("foo", "bar"); |
| 362 ExpectIndexedLiteral(peer_.table()->GetByName("cookie"), "c=dd"); |
| 364 CompareWithExpectedEncoding(headers); | 363 CompareWithExpectedEncoding(headers); |
| 365 } | 364 } |
| 366 | 365 |
| 367 TEST_F(HpackEncoderTest, CookieToCrumbs) { | 366 TEST_F(HpackEncoderTest, CookieToCrumbs) { |
| 368 test::HpackEncoderPeer peer(NULL); | 367 test::HpackEncoderPeer peer(NULL); |
| 369 std::vector<StringPiece> out; | 368 std::vector<StringPiece> out; |
| 370 | 369 |
| 371 // Leading and trailing whitespace is consumed. A space after ';' is consumed. | 370 // Leading and trailing whitespace is consumed. A space after ';' is consumed. |
| 372 // All other spaces remain. ';' at beginning and end of string produce empty | 371 // All other spaces remain. ';' at beginning and end of string produce empty |
| 373 // crumbs. | 372 // crumbs. |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 456 expected_.AppendUint32(62); | 455 expected_.AppendUint32(62); |
| 457 expected_.AppendPrefix(kStringLiteralIdentityEncoded); | 456 expected_.AppendPrefix(kStringLiteralIdentityEncoded); |
| 458 expected_.AppendUint32(3); | 457 expected_.AppendUint32(3); |
| 459 expected_.AppendBytes("bar"); | 458 expected_.AppendBytes("bar"); |
| 460 CompareWithExpectedEncoding(headers); | 459 CompareWithExpectedEncoding(headers); |
| 461 } | 460 } |
| 462 | 461 |
| 463 } // namespace | 462 } // namespace |
| 464 | 463 |
| 465 } // namespace net | 464 } // namespace net |
| OLD | NEW |