| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/websockets/websocket_stream.h" | 5 #include "net/websockets/websocket_stream.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <utility> | 9 #include <utility> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 473 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 484 failure_message()); | 484 failure_message()); |
| 485 } | 485 } |
| 486 | 486 |
| 487 // The permessage-deflate extension may only be specified once. | 487 // The permessage-deflate extension may only be specified once. |
| 488 TEST_F(WebSocketStreamCreateExtensionTest, OnlyOnePerMessageDeflateAllowed) { | 488 TEST_F(WebSocketStreamCreateExtensionTest, OnlyOnePerMessageDeflateAllowed) { |
| 489 CreateAndConnectWithExtensions( | 489 CreateAndConnectWithExtensions( |
| 490 "permessage-deflate, permessage-deflate; client_max_window_bits=10"); | 490 "permessage-deflate, permessage-deflate; client_max_window_bits=10"); |
| 491 EXPECT_FALSE(stream_); | 491 EXPECT_FALSE(stream_); |
| 492 EXPECT_TRUE(has_failed()); | 492 EXPECT_TRUE(has_failed()); |
| 493 EXPECT_EQ( | 493 EXPECT_EQ( |
| 494 "Error during WebSocket handshake: Received duplicate permessage-deflate " | 494 "Error during WebSocket handshake: " |
| 495 "response", | 495 "Received duplicate permessage-deflate response", |
| 496 failure_message()); | 496 failure_message()); |
| 497 } | 497 } |
| 498 | 498 |
| 499 // permessage-deflate parameters may not be duplicated. | 499 // permessage-deflate parameters may not be duplicated. |
| 500 TEST_F(WebSocketStreamCreateExtensionTest, NoDuplicateParameters) { | 500 TEST_F(WebSocketStreamCreateExtensionTest, NoDuplicateParameters) { |
| 501 CreateAndConnectWithExtensions( | 501 CreateAndConnectWithExtensions( |
| 502 "permessage-deflate; client_no_context_takeover; " | 502 "permessage-deflate; client_no_context_takeover; " |
| 503 "client_no_context_takeover"); | 503 "client_no_context_takeover"); |
| 504 EXPECT_FALSE(stream_); | 504 EXPECT_FALSE(stream_); |
| 505 EXPECT_TRUE(has_failed()); | 505 EXPECT_TRUE(has_failed()); |
| 506 EXPECT_EQ( | 506 EXPECT_EQ( |
| 507 "Error during WebSocket handshake: Received duplicate permessage-deflate " | 507 "Error during WebSocket handshake: Error in permessage-deflate: " |
| 508 "extension parameter client_no_context_takeover", | 508 "Received duplicate permessage-deflate extension parameter " |
| 509 "client_no_context_takeover", |
| 509 failure_message()); | 510 failure_message()); |
| 510 } | 511 } |
| 511 | 512 |
| 512 // permessage-deflate parameters must start with "client_" or "server_" | 513 // permessage-deflate parameters must start with "client_" or "server_" |
| 513 TEST_F(WebSocketStreamCreateExtensionTest, BadParameterPrefix) { | 514 TEST_F(WebSocketStreamCreateExtensionTest, BadParameterPrefix) { |
| 514 CreateAndConnectWithExtensions( | 515 CreateAndConnectWithExtensions( |
| 515 "permessage-deflate; absurd_no_context_takeover"); | 516 "permessage-deflate; absurd_no_context_takeover"); |
| 516 EXPECT_FALSE(stream_); | 517 EXPECT_FALSE(stream_); |
| 517 EXPECT_TRUE(has_failed()); | 518 EXPECT_TRUE(has_failed()); |
| 518 EXPECT_EQ( | 519 EXPECT_EQ( |
| 519 "Error during WebSocket handshake: Received an unexpected " | 520 "Error during WebSocket handshake: Error in permessage-deflate: " |
| 520 "permessage-deflate extension parameter", | 521 "Received an unexpected permessage-deflate extension parameter", |
| 521 failure_message()); | 522 failure_message()); |
| 522 } | 523 } |
| 523 | 524 |
| 524 // permessage-deflate parameters must be either *_no_context_takeover or | 525 // permessage-deflate parameters must be either *_no_context_takeover or |
| 525 // *_max_window_bits | 526 // *_max_window_bits |
| 526 TEST_F(WebSocketStreamCreateExtensionTest, BadParameterSuffix) { | 527 TEST_F(WebSocketStreamCreateExtensionTest, BadParameterSuffix) { |
| 527 CreateAndConnectWithExtensions( | 528 CreateAndConnectWithExtensions( |
| 528 "permessage-deflate; client_max_content_bits=5"); | 529 "permessage-deflate; client_max_content_bits=5"); |
| 529 EXPECT_FALSE(stream_); | 530 EXPECT_FALSE(stream_); |
| 530 EXPECT_TRUE(has_failed()); | 531 EXPECT_TRUE(has_failed()); |
| 531 EXPECT_EQ( | 532 EXPECT_EQ( |
| 532 "Error during WebSocket handshake: Received an unexpected " | 533 "Error during WebSocket handshake: Error in permessage-deflate: " |
| 533 "permessage-deflate extension parameter", | 534 "Received an unexpected permessage-deflate extension parameter", |
| 534 failure_message()); | 535 failure_message()); |
| 535 } | 536 } |
| 536 | 537 |
| 537 // *_no_context_takeover parameters must not have an argument | 538 // *_no_context_takeover parameters must not have an argument |
| 538 TEST_F(WebSocketStreamCreateExtensionTest, BadParameterValue) { | 539 TEST_F(WebSocketStreamCreateExtensionTest, BadParameterValue) { |
| 539 CreateAndConnectWithExtensions( | 540 CreateAndConnectWithExtensions( |
| 540 "permessage-deflate; client_no_context_takeover=true"); | 541 "permessage-deflate; client_no_context_takeover=true"); |
| 541 EXPECT_FALSE(stream_); | 542 EXPECT_FALSE(stream_); |
| 542 EXPECT_TRUE(has_failed()); | 543 EXPECT_TRUE(has_failed()); |
| 543 EXPECT_EQ( | 544 EXPECT_EQ( |
| 544 "Error during WebSocket handshake: Received invalid " | 545 "Error during WebSocket handshake: Error in permessage-deflate: " |
| 545 "client_no_context_takeover parameter", | 546 "Received invalid client_no_context_takeover parameter", |
| 546 failure_message()); | 547 failure_message()); |
| 547 } | 548 } |
| 548 | 549 |
| 549 // *_max_window_bits must have an argument | 550 // *_max_window_bits must have an argument |
| 550 TEST_F(WebSocketStreamCreateExtensionTest, NoMaxWindowBitsArgument) { | 551 TEST_F(WebSocketStreamCreateExtensionTest, NoMaxWindowBitsArgument) { |
| 551 CreateAndConnectWithExtensions("permessage-deflate; client_max_window_bits"); | 552 CreateAndConnectWithExtensions("permessage-deflate; client_max_window_bits"); |
| 552 EXPECT_FALSE(stream_); | 553 EXPECT_FALSE(stream_); |
| 553 EXPECT_TRUE(has_failed()); | 554 EXPECT_TRUE(has_failed()); |
| 554 EXPECT_EQ( | 555 EXPECT_EQ( |
| 555 "Error during WebSocket handshake: client_max_window_bits must have " | 556 "Error during WebSocket handshake: Error in permessage-deflate: " |
| 556 "value", | 557 "client_max_window_bits must have value", |
| 557 failure_message()); | 558 failure_message()); |
| 558 } | 559 } |
| 559 | 560 |
| 560 // *_max_window_bits must be an integer | 561 // *_max_window_bits must be an integer |
| 561 TEST_F(WebSocketStreamCreateExtensionTest, MaxWindowBitsValueInteger) { | 562 TEST_F(WebSocketStreamCreateExtensionTest, MaxWindowBitsValueInteger) { |
| 562 CreateAndConnectWithExtensions( | 563 CreateAndConnectWithExtensions( |
| 563 "permessage-deflate; server_max_window_bits=banana"); | 564 "permessage-deflate; server_max_window_bits=banana"); |
| 564 EXPECT_FALSE(stream_); | 565 EXPECT_FALSE(stream_); |
| 565 EXPECT_TRUE(has_failed()); | 566 EXPECT_TRUE(has_failed()); |
| 566 EXPECT_EQ( | 567 EXPECT_EQ( |
| 567 "Error during WebSocket handshake: Received invalid " | 568 "Error during WebSocket handshake: Error in permessage-deflate: " |
| 568 "server_max_window_bits parameter", | 569 "Received invalid server_max_window_bits parameter", |
| 569 failure_message()); | 570 failure_message()); |
| 570 } | 571 } |
| 571 | 572 |
| 572 // *_max_window_bits must be >= 8 | 573 // *_max_window_bits must be >= 8 |
| 573 TEST_F(WebSocketStreamCreateExtensionTest, MaxWindowBitsValueTooSmall) { | 574 TEST_F(WebSocketStreamCreateExtensionTest, MaxWindowBitsValueTooSmall) { |
| 574 CreateAndConnectWithExtensions( | 575 CreateAndConnectWithExtensions( |
| 575 "permessage-deflate; server_max_window_bits=7"); | 576 "permessage-deflate; server_max_window_bits=7"); |
| 576 EXPECT_FALSE(stream_); | 577 EXPECT_FALSE(stream_); |
| 577 EXPECT_TRUE(has_failed()); | 578 EXPECT_TRUE(has_failed()); |
| 578 EXPECT_EQ( | 579 EXPECT_EQ( |
| 579 "Error during WebSocket handshake: Received invalid " | 580 "Error during WebSocket handshake: Error in permessage-deflate: " |
| 580 "server_max_window_bits parameter", | 581 "Received invalid server_max_window_bits parameter", |
| 581 failure_message()); | 582 failure_message()); |
| 582 } | 583 } |
| 583 | 584 |
| 584 // *_max_window_bits must be <= 15 | 585 // *_max_window_bits must be <= 15 |
| 585 TEST_F(WebSocketStreamCreateExtensionTest, MaxWindowBitsValueTooBig) { | 586 TEST_F(WebSocketStreamCreateExtensionTest, MaxWindowBitsValueTooBig) { |
| 586 CreateAndConnectWithExtensions( | 587 CreateAndConnectWithExtensions( |
| 587 "permessage-deflate; client_max_window_bits=16"); | 588 "permessage-deflate; client_max_window_bits=16"); |
| 588 EXPECT_FALSE(stream_); | 589 EXPECT_FALSE(stream_); |
| 589 EXPECT_TRUE(has_failed()); | 590 EXPECT_TRUE(has_failed()); |
| 590 EXPECT_EQ( | 591 EXPECT_EQ( |
| 591 "Error during WebSocket handshake: Received invalid " | 592 "Error during WebSocket handshake: Error in permessage-deflate: " |
| 592 "client_max_window_bits parameter", | 593 "Received invalid client_max_window_bits parameter", |
| 593 failure_message()); | 594 failure_message()); |
| 594 } | 595 } |
| 595 | 596 |
| 596 // *_max_window_bits must not start with 0 | 597 // *_max_window_bits must not start with 0 |
| 597 TEST_F(WebSocketStreamCreateExtensionTest, MaxWindowBitsValueStartsWithZero) { | 598 TEST_F(WebSocketStreamCreateExtensionTest, MaxWindowBitsValueStartsWithZero) { |
| 598 CreateAndConnectWithExtensions( | 599 CreateAndConnectWithExtensions( |
| 599 "permessage-deflate; client_max_window_bits=08"); | 600 "permessage-deflate; client_max_window_bits=08"); |
| 600 EXPECT_FALSE(stream_); | 601 EXPECT_FALSE(stream_); |
| 601 EXPECT_TRUE(has_failed()); | 602 EXPECT_TRUE(has_failed()); |
| 602 EXPECT_EQ( | 603 EXPECT_EQ( |
| 603 "Error during WebSocket handshake: Received invalid " | 604 "Error during WebSocket handshake: Error in permessage-deflate: " |
| 604 "client_max_window_bits parameter", | 605 "Received invalid client_max_window_bits parameter", |
| 605 failure_message()); | 606 failure_message()); |
| 606 } | 607 } |
| 607 | 608 |
| 608 // *_max_window_bits must not start with + | 609 // *_max_window_bits must not start with + |
| 609 TEST_F(WebSocketStreamCreateExtensionTest, MaxWindowBitsValueStartsWithPlus) { | 610 TEST_F(WebSocketStreamCreateExtensionTest, MaxWindowBitsValueStartsWithPlus) { |
| 610 CreateAndConnectWithExtensions( | 611 CreateAndConnectWithExtensions( |
| 611 "permessage-deflate; server_max_window_bits=+9"); | 612 "permessage-deflate; server_max_window_bits=+9"); |
| 612 EXPECT_FALSE(stream_); | 613 EXPECT_FALSE(stream_); |
| 613 EXPECT_TRUE(has_failed()); | 614 EXPECT_TRUE(has_failed()); |
| 614 EXPECT_EQ( | 615 EXPECT_EQ( |
| 615 "Error during WebSocket handshake: Received invalid " | 616 "Error during WebSocket handshake: Error in permessage-deflate: " |
| 616 "server_max_window_bits parameter", | 617 "Received invalid server_max_window_bits parameter", |
| 617 failure_message()); | 618 failure_message()); |
| 618 } | 619 } |
| 619 | 620 |
| 620 // TODO(ricea): Check that WebSocketDeflateStream is initialised with the | 621 // TODO(ricea): Check that WebSocketDeflateStream is initialised with the |
| 621 // arguments from the server. This is difficult because the data written to the | 622 // arguments from the server. This is difficult because the data written to the |
| 622 // socket is randomly masked. | 623 // socket is randomly masked. |
| 623 | 624 |
| 624 // Additional Sec-WebSocket-Accept headers should be rejected. | 625 // Additional Sec-WebSocket-Accept headers should be rejected. |
| 625 TEST_F(WebSocketStreamCreateTest, DoubleAccept) { | 626 TEST_F(WebSocketStreamCreateTest, DoubleAccept) { |
| 626 CreateAndConnectStandard( | 627 CreateAndConnectStandard( |
| (...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1000 socket_data->RunFor(2); | 1001 socket_data->RunFor(2); |
| 1001 EXPECT_TRUE(has_failed()); | 1002 EXPECT_TRUE(has_failed()); |
| 1002 EXPECT_FALSE(stream_); | 1003 EXPECT_FALSE(stream_); |
| 1003 EXPECT_FALSE(response_info_); | 1004 EXPECT_FALSE(response_info_); |
| 1004 EXPECT_EQ("Connection closed before receiving a handshake response", | 1005 EXPECT_EQ("Connection closed before receiving a handshake response", |
| 1005 failure_message()); | 1006 failure_message()); |
| 1006 } | 1007 } |
| 1007 | 1008 |
| 1008 } // namespace | 1009 } // namespace |
| 1009 } // namespace net | 1010 } // namespace net |
| OLD | NEW |