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_encoder.h" | 5 #include "net/spdy/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 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
312 CompareWithExpectedEncoding(headers); | 312 CompareWithExpectedEncoding(headers); |
313 } | 313 } |
314 // Header table is: | 314 // Header table is: |
315 // 65: key1: value1 | 315 // 65: key1: value1 |
316 // 64: key2: value2 | 316 // 64: key2: value2 |
317 // 63: cookie: a=bb | 317 // 63: cookie: a=bb |
318 // 62: cookie: c=dd | 318 // 62: cookie: c=dd |
319 // Pass 2. | 319 // Pass 2. |
320 { | 320 { |
321 map<string, string> headers; | 321 map<string, string> headers; |
322 headers["key1"] = "value1"; | |
323 headers["key2"] = "value2"; | 322 headers["key2"] = "value2"; |
324 headers["cookie"] = "c=dd; e=ff"; | 323 headers["cookie"] = "c=dd; e=ff"; |
325 | 324 |
326 ExpectIndex(IndexOf(cookie_c_)); | 325 ExpectIndex(IndexOf(cookie_c_)); |
327 // key1 by index. | 326 // This cookie evicts |key1| from the dynamic table. |
| 327 ExpectIndexedLiteral(peer_.table()->GetByName("cookie"), "e=ff"); |
| 328 // "key2: value2" |
328 ExpectIndex(65); | 329 ExpectIndex(65); |
329 // key2 by index. | |
330 ExpectIndex(64); | |
331 // This cookie evicts |key1| from the header table. | |
332 ExpectIndexedLiteral(peer_.table()->GetByName("cookie"), "e=ff"); | |
333 | 330 |
334 CompareWithExpectedEncoding(headers); | 331 CompareWithExpectedEncoding(headers); |
335 } | 332 } |
336 // Header table is: | 333 // Header table is: |
337 // 65: key2: value2 | 334 // 65: key2: value2 |
338 // 64: cookie: a=bb | 335 // 64: cookie: a=bb |
339 // 63: cookie: c=dd | 336 // 63: cookie: c=dd |
340 // 62: cookie: e=ff | 337 // 62: cookie: e=ff |
341 // Pass 3. | 338 // Pass 3. |
342 { | 339 { |
343 map<string, string> headers; | 340 map<string, string> headers; |
344 headers["key1"] = "value1"; | 341 headers["key2"] = "value2"; |
345 headers["key3"] = "value3"; | 342 headers["cookie"] = "a=bb; b=cc; c=dd"; |
346 headers["cookie"] = "e=ff"; | |
347 | 343 |
348 // cookie: e=ff by index. | 344 // "cookie: a=bb" |
349 ExpectIndex(62); | 345 ExpectIndex(64); |
350 ExpectIndexedLiteral("key1", "value1"); | 346 // This cookie evicts |key2| from the dynamic table. |
351 ExpectIndexedLiteral("key3", "value3"); | 347 ExpectIndexedLiteral(peer_.table()->GetByName("cookie"), "b=cc"); |
| 348 // "cookie: c=dd" |
| 349 ExpectIndex(64); |
| 350 // "key2: value2" |
| 351 ExpectIndexedLiteral("key2", "value2"); |
352 | 352 |
353 CompareWithExpectedEncoding(headers); | 353 CompareWithExpectedEncoding(headers); |
354 } | 354 } |
355 } | 355 } |
356 | 356 |
357 TEST_F(HpackEncoderTest, PseudoHeadersFirst) { | 357 TEST_F(HpackEncoderTest, PseudoHeadersFirst) { |
358 map<string, string> headers; | 358 map<string, string> headers; |
359 // A pseudo-header to be indexed. | 359 // A pseudo-header to be indexed. |
360 headers[":authority"] = "www.example.com"; | 360 headers[":authority"] = "www.example.com"; |
361 // A pseudo-header that should not be indexed. | 361 // A pseudo-header that should not be indexed. |
362 headers[":path"] = "/spam/eggs.html"; | 362 headers[":path"] = "/spam/eggs.html"; |
363 // A regular header which precedes ":" alphabetically, should still be encoded | 363 // A regular header which precedes ":" alphabetically, should still be encoded |
364 // after pseudo-headers. | 364 // after pseudo-headers. |
365 headers["-foo"] = "bar"; | 365 headers["-foo"] = "bar"; |
366 headers["foo"] = "bar"; | 366 headers["foo"] = "bar"; |
367 headers["cookie"] = "c=dd"; | 367 headers["cookie"] = "c=dd"; |
368 | 368 |
369 // Pseudo-headers are encoded in alphabetical order. | 369 // Pseudo-headers are encoded in alphabetical order. |
| 370 // This entry pushes "cookie: a=bb" back to 63. |
370 ExpectIndexedLiteral(peer_.table()->GetByName(":authority"), | 371 ExpectIndexedLiteral(peer_.table()->GetByName(":authority"), |
371 "www.example.com"); | 372 "www.example.com"); |
372 ExpectNonIndexedLiteral(":path", "/spam/eggs.html"); | 373 ExpectNonIndexedLiteral(":path", "/spam/eggs.html"); |
373 // Regular headers in the header table are encoded first. | 374 // Regular headers are endoded in alphabetical order. |
374 ExpectIndex(IndexOf(cookie_a_)); | 375 // This entry pushes "cookie: a=bb" back to 64. |
375 // Regular headers not in the header table are encoded, in alphabetical order. | |
376 ExpectIndexedLiteral("-foo", "bar"); | 376 ExpectIndexedLiteral("-foo", "bar"); |
| 377 ExpectIndex(64); |
377 ExpectIndexedLiteral("foo", "bar"); | 378 ExpectIndexedLiteral("foo", "bar"); |
378 CompareWithExpectedEncoding(headers); | 379 CompareWithExpectedEncoding(headers); |
379 } | 380 } |
380 | 381 |
381 TEST_F(HpackEncoderTest, CookieToCrumbs) { | 382 TEST_F(HpackEncoderTest, CookieToCrumbs) { |
382 test::HpackEncoderPeer peer(NULL); | 383 test::HpackEncoderPeer peer(NULL); |
383 std::vector<StringPiece> out; | 384 std::vector<StringPiece> out; |
384 | 385 |
385 // A space after ';' is consumed. All other spaces remain. ';' at beginning | 386 // A space after ';' is consumed. All other spaces remain. ';' at beginning |
386 // and end of string produce empty crumbs. Duplicate crumbs are removed. | 387 // and end of string produce empty crumbs. Duplicate crumbs are removed. |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
461 expected_.AppendUint32(62); | 462 expected_.AppendUint32(62); |
462 expected_.AppendPrefix(kStringLiteralIdentityEncoded); | 463 expected_.AppendPrefix(kStringLiteralIdentityEncoded); |
463 expected_.AppendUint32(3); | 464 expected_.AppendUint32(3); |
464 expected_.AppendBytes("bar"); | 465 expected_.AppendBytes("bar"); |
465 CompareWithExpectedEncoding(headers); | 466 CompareWithExpectedEncoding(headers); |
466 } | 467 } |
467 | 468 |
468 } // namespace | 469 } // namespace |
469 | 470 |
470 } // namespace net | 471 } // namespace net |
OLD | NEW |