| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/http/http_network_transaction.h" | 5 #include "net/http/http_network_transaction.h" |
| 6 | 6 |
| 7 #include <math.h> // ceil | 7 #include <math.h> // ceil |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
| (...skipping 6419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6430 alternate_protocols.HasAlternateProtocolFor(http_host_port_pair)); | 6430 alternate_protocols.HasAlternateProtocolFor(http_host_port_pair)); |
| 6431 | 6431 |
| 6432 EXPECT_EQ(OK, callback.WaitForResult()); | 6432 EXPECT_EQ(OK, callback.WaitForResult()); |
| 6433 | 6433 |
| 6434 const HttpResponseInfo* response = trans->GetResponseInfo(); | 6434 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| 6435 ASSERT_TRUE(response != NULL); | 6435 ASSERT_TRUE(response != NULL); |
| 6436 ASSERT_TRUE(response->headers != NULL); | 6436 ASSERT_TRUE(response->headers != NULL); |
| 6437 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); | 6437 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
| 6438 EXPECT_FALSE(response->was_fetched_via_spdy); | 6438 EXPECT_FALSE(response->was_fetched_via_spdy); |
| 6439 EXPECT_FALSE(response->was_npn_negotiated); | 6439 EXPECT_FALSE(response->was_npn_negotiated); |
| 6440 EXPECT_FALSE(response->was_alternate_protocol_available); | |
| 6441 | 6440 |
| 6442 std::string response_data; | 6441 std::string response_data; |
| 6443 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); | 6442 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); |
| 6444 EXPECT_EQ("hello world", response_data); | 6443 EXPECT_EQ("hello world", response_data); |
| 6445 | 6444 |
| 6446 ASSERT_TRUE(alternate_protocols.HasAlternateProtocolFor(http_host_port_pair)); | 6445 ASSERT_TRUE(alternate_protocols.HasAlternateProtocolFor(http_host_port_pair)); |
| 6447 const HttpAlternateProtocols::PortProtocolPair alternate = | 6446 const HttpAlternateProtocols::PortProtocolPair alternate = |
| 6448 alternate_protocols.GetAlternateProtocolFor(http_host_port_pair); | 6447 alternate_protocols.GetAlternateProtocolFor(http_host_port_pair); |
| 6449 HttpAlternateProtocols::PortProtocolPair expected_alternate; | 6448 HttpAlternateProtocols::PortProtocolPair expected_alternate; |
| 6450 expected_alternate.port = 443; | 6449 expected_alternate.port = 443; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 6471 | 6470 |
| 6472 MockRead data_reads[] = { | 6471 MockRead data_reads[] = { |
| 6473 MockRead("HTTP/1.1 200 OK\r\n\r\n"), | 6472 MockRead("HTTP/1.1 200 OK\r\n\r\n"), |
| 6474 MockRead("hello world"), | 6473 MockRead("hello world"), |
| 6475 MockRead(true, OK), | 6474 MockRead(true, OK), |
| 6476 }; | 6475 }; |
| 6477 StaticSocketDataProvider second_data( | 6476 StaticSocketDataProvider second_data( |
| 6478 data_reads, arraysize(data_reads), NULL, 0); | 6477 data_reads, arraysize(data_reads), NULL, 0); |
| 6479 session_deps.socket_factory.AddSocketDataProvider(&second_data); | 6478 session_deps.socket_factory.AddSocketDataProvider(&second_data); |
| 6480 | 6479 |
| 6481 // TODO(willchan): Delete this extra data provider. It's necessary due to a | |
| 6482 // ClientSocketPoolBaseHelper bug that starts up too many ConnectJobs: | |
| 6483 // http://crbug.com/37454. | |
| 6484 session_deps.socket_factory.AddSocketDataProvider(&second_data); | |
| 6485 | |
| 6486 TestCompletionCallback callback; | 6480 TestCompletionCallback callback; |
| 6487 | 6481 |
| 6488 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); | 6482 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); |
| 6489 | 6483 |
| 6490 HostPortPair http_host_port_pair("www.google.com", 80); | 6484 HostPortPair http_host_port_pair("www.google.com", 80); |
| 6491 HttpAlternateProtocols* alternate_protocols = | 6485 HttpAlternateProtocols* alternate_protocols = |
| 6492 session->mutable_alternate_protocols(); | 6486 session->mutable_alternate_protocols(); |
| 6493 alternate_protocols->SetAlternateProtocolFor( | 6487 alternate_protocols->SetAlternateProtocolFor( |
| 6494 http_host_port_pair, 1234 /* port is ignored by MockConnect anyway */, | 6488 http_host_port_pair, 1234 /* port is ignored by MockConnect anyway */, |
| 6495 HttpAlternateProtocols::NPN_SPDY_2); | 6489 HttpAlternateProtocols::NPN_SPDY_2); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 6510 EXPECT_EQ("hello world", response_data); | 6504 EXPECT_EQ("hello world", response_data); |
| 6511 | 6505 |
| 6512 ASSERT_TRUE( | 6506 ASSERT_TRUE( |
| 6513 alternate_protocols->HasAlternateProtocolFor(http_host_port_pair)); | 6507 alternate_protocols->HasAlternateProtocolFor(http_host_port_pair)); |
| 6514 const HttpAlternateProtocols::PortProtocolPair alternate = | 6508 const HttpAlternateProtocols::PortProtocolPair alternate = |
| 6515 alternate_protocols->GetAlternateProtocolFor(http_host_port_pair); | 6509 alternate_protocols->GetAlternateProtocolFor(http_host_port_pair); |
| 6516 EXPECT_EQ(HttpAlternateProtocols::BROKEN, alternate.protocol); | 6510 EXPECT_EQ(HttpAlternateProtocols::BROKEN, alternate.protocol); |
| 6517 HttpStreamFactory::set_use_alternate_protocols(false); | 6511 HttpStreamFactory::set_use_alternate_protocols(false); |
| 6518 } | 6512 } |
| 6519 | 6513 |
| 6520 // TODO(willchan): Redo this test to use TLS/NPN=>SPDY. Currently, the code | |
| 6521 // says that it does SPDY, but it just does the TLS handshake, but the NPN | |
| 6522 // response does not indicate SPDY, so we just do standard HTTPS over the port. | |
| 6523 // We should add code such that we don't fallback to HTTPS, but fallback to HTTP | |
| 6524 // on the original port. | |
| 6525 // TEST_F(HttpNetworkTransactionTest, UseAlternateProtocol) { | |
| 6526 // SessionDependencies session_deps; | |
| 6527 // | |
| 6528 // HttpRequestInfo request; | |
| 6529 // request.method = "GET"; | |
| 6530 // request.url = GURL("http://www.google.com/"); | |
| 6531 // request.load_flags = 0; | |
| 6532 // | |
| 6533 // MockRead data_reads[] = { | |
| 6534 // MockRead("HTTP/1.1 200 OK\r\n\r\n"), | |
| 6535 // MockRead("hello world"), | |
| 6536 // MockRead(true, OK), | |
| 6537 // }; | |
| 6538 // StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); | |
| 6539 // session_deps.socket_factory.AddSocketDataProvider(&data); | |
| 6540 // | |
| 6541 // SSLSocketDataProvider ssl(true, OK); | |
| 6542 // session_deps.socket_factory.AddSSLSocketDataProvider(&ssl); | |
| 6543 // | |
| 6544 // TestCompletionCallback callback; | |
| 6545 // | |
| 6546 // scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); | |
| 6547 // | |
| 6548 // HostPortPair http_host_port_pair; | |
| 6549 // http_host_port_pair.host = "www.google.com"; | |
| 6550 // http_host_port_pair.port = 80; | |
| 6551 // HttpAlternateProtocols* alternate_protocols = | |
| 6552 // session->mutable_alternate_protocols(); | |
| 6553 // alternate_protocols->SetAlternateProtocolFor( | |
| 6554 // http_host_port_pair, 1234 /* port is ignored */, | |
| 6555 // HttpAlternateProtocols::NPN_SPDY_1); | |
| 6556 // | |
| 6557 // scoped_ptr<HttpTransaction> trans(new HttpNetworkTransaction(session)); | |
| 6558 // | |
| 6559 // int rv = trans->Start(&request, &callback, BoundNetLog()); | |
| 6560 // EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 6561 // EXPECT_EQ(OK, callback.WaitForResult()); | |
| 6562 // | |
| 6563 // const HttpResponseInfo* response = trans->GetResponseInfo(); | |
| 6564 // ASSERT_TRUE(response != NULL); | |
| 6565 // ASSERT_TRUE(response->headers != NULL); | |
| 6566 // EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); | |
| 6567 // | |
| 6568 // std::string response_data; | |
| 6569 // ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); | |
| 6570 // EXPECT_EQ("hello world", response_data); | |
| 6571 // } | |
| 6572 | |
| 6573 TEST_F(HttpNetworkTransactionTest, FailNpnSpdyAndFallback) { | 6514 TEST_F(HttpNetworkTransactionTest, FailNpnSpdyAndFallback) { |
| 6574 HttpStreamFactory::set_use_alternate_protocols(true); | 6515 HttpStreamFactory::set_use_alternate_protocols(true); |
| 6575 HttpStreamFactory::set_next_protos(kExpectedNPNString); | 6516 HttpStreamFactory::set_next_protos(kExpectedNPNString); |
| 6576 SessionDependencies session_deps; | 6517 SessionDependencies session_deps; |
| 6577 | 6518 |
| 6578 HttpRequestInfo request; | 6519 HttpRequestInfo request; |
| 6579 request.method = "GET"; | 6520 request.method = "GET"; |
| 6580 request.url = GURL("http://www.google.com/"); | 6521 request.url = GURL("http://www.google.com/"); |
| 6581 request.load_flags = 0; | 6522 request.load_flags = 0; |
| 6582 | 6523 |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6662 MockRead(true, 0, 0), | 6603 MockRead(true, 0, 0), |
| 6663 }; | 6604 }; |
| 6664 | 6605 |
| 6665 scoped_refptr<DelayedSocketData> spdy_data( | 6606 scoped_refptr<DelayedSocketData> spdy_data( |
| 6666 new DelayedSocketData( | 6607 new DelayedSocketData( |
| 6667 1, // wait for one write to finish before reading. | 6608 1, // wait for one write to finish before reading. |
| 6668 spdy_reads, arraysize(spdy_reads), | 6609 spdy_reads, arraysize(spdy_reads), |
| 6669 spdy_writes, arraysize(spdy_writes))); | 6610 spdy_writes, arraysize(spdy_writes))); |
| 6670 session_deps.socket_factory.AddSocketDataProvider(spdy_data); | 6611 session_deps.socket_factory.AddSocketDataProvider(spdy_data); |
| 6671 | 6612 |
| 6613 MockConnect never_finishing_connect(false, ERR_IO_PENDING); |
| 6614 StaticSocketDataProvider hanging_non_alternate_protocol_socket( |
| 6615 NULL, 0, NULL, 0); |
| 6616 hanging_non_alternate_protocol_socket.set_connect_data( |
| 6617 never_finishing_connect); |
| 6618 session_deps.socket_factory.AddSocketDataProvider( |
| 6619 &hanging_non_alternate_protocol_socket); |
| 6620 |
| 6672 TestCompletionCallback callback; | 6621 TestCompletionCallback callback; |
| 6673 | 6622 |
| 6674 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); | 6623 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); |
| 6675 scoped_ptr<HttpNetworkTransaction> trans(new HttpNetworkTransaction(session)); | 6624 scoped_ptr<HttpNetworkTransaction> trans(new HttpNetworkTransaction(session)); |
| 6676 | 6625 |
| 6677 int rv = trans->Start(&request, &callback, BoundNetLog()); | 6626 int rv = trans->Start(&request, &callback, BoundNetLog()); |
| 6678 EXPECT_EQ(ERR_IO_PENDING, rv); | 6627 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 6679 EXPECT_EQ(OK, callback.WaitForResult()); | 6628 EXPECT_EQ(OK, callback.WaitForResult()); |
| 6680 | 6629 |
| 6681 const HttpResponseInfo* response = trans->GetResponseInfo(); | 6630 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 6692 rv = trans->Start(&request, &callback, BoundNetLog()); | 6641 rv = trans->Start(&request, &callback, BoundNetLog()); |
| 6693 EXPECT_EQ(ERR_IO_PENDING, rv); | 6642 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 6694 EXPECT_EQ(OK, callback.WaitForResult()); | 6643 EXPECT_EQ(OK, callback.WaitForResult()); |
| 6695 | 6644 |
| 6696 response = trans->GetResponseInfo(); | 6645 response = trans->GetResponseInfo(); |
| 6697 ASSERT_TRUE(response != NULL); | 6646 ASSERT_TRUE(response != NULL); |
| 6698 ASSERT_TRUE(response->headers != NULL); | 6647 ASSERT_TRUE(response->headers != NULL); |
| 6699 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); | 6648 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
| 6700 EXPECT_TRUE(response->was_fetched_via_spdy); | 6649 EXPECT_TRUE(response->was_fetched_via_spdy); |
| 6701 EXPECT_TRUE(response->was_npn_negotiated); | 6650 EXPECT_TRUE(response->was_npn_negotiated); |
| 6702 EXPECT_TRUE(response->was_alternate_protocol_available); | |
| 6703 | 6651 |
| 6704 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); | 6652 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); |
| 6705 EXPECT_EQ("hello!", response_data); | 6653 EXPECT_EQ("hello!", response_data); |
| 6706 | 6654 |
| 6707 HttpStreamFactory::set_next_protos(""); | 6655 HttpStreamFactory::set_next_protos(""); |
| 6708 HttpStreamFactory::set_use_alternate_protocols(false); | 6656 HttpStreamFactory::set_use_alternate_protocols(false); |
| 6709 } | 6657 } |
| 6710 | 6658 |
| 6659 TEST_F(HttpNetworkTransactionTest, AlternateProtocolWithSpdyLateBinding) { |
| 6660 HttpStreamFactory::set_use_alternate_protocols(true); |
| 6661 HttpStreamFactory::set_next_protos(kExpectedNPNString); |
| 6662 SessionDependencies session_deps; |
| 6663 |
| 6664 HttpRequestInfo request; |
| 6665 request.method = "GET"; |
| 6666 request.url = GURL("http://www.google.com/"); |
| 6667 request.load_flags = 0; |
| 6668 |
| 6669 MockRead data_reads[] = { |
| 6670 MockRead("HTTP/1.1 200 OK\r\n"), |
| 6671 MockRead(kAlternateProtocolHttpHeader), |
| 6672 MockRead("hello world"), |
| 6673 MockRead(true, OK), |
| 6674 }; |
| 6675 |
| 6676 StaticSocketDataProvider first_transaction( |
| 6677 data_reads, arraysize(data_reads), NULL, 0); |
| 6678 // Socket 1 is the HTTP transaction with the Alternate-Protocol header. |
| 6679 session_deps.socket_factory.AddSocketDataProvider(&first_transaction); |
| 6680 |
| 6681 MockConnect never_finishing_connect(false, ERR_IO_PENDING); |
| 6682 StaticSocketDataProvider hanging_socket( |
| 6683 NULL, 0, NULL, 0); |
| 6684 hanging_socket.set_connect_data(never_finishing_connect); |
| 6685 // Socket 2 and 3 are the hanging Alternate-Protocol and |
| 6686 // non-Alternate-Protocol jobs from the 2nd transaction. |
| 6687 session_deps.socket_factory.AddSocketDataProvider(&hanging_socket); |
| 6688 session_deps.socket_factory.AddSocketDataProvider(&hanging_socket); |
| 6689 |
| 6690 SSLSocketDataProvider ssl(true, OK); |
| 6691 ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated; |
| 6692 ssl.next_proto = "spdy/2"; |
| 6693 ssl.was_npn_negotiated = true; |
| 6694 session_deps.socket_factory.AddSSLSocketDataProvider(&ssl); |
| 6695 |
| 6696 scoped_ptr<spdy::SpdyFrame> req1(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
| 6697 scoped_ptr<spdy::SpdyFrame> req2(ConstructSpdyGet(NULL, 0, false, 3, LOWEST)); |
| 6698 MockWrite spdy_writes[] = { |
| 6699 CreateMockWrite(*req1), |
| 6700 CreateMockWrite(*req2), |
| 6701 }; |
| 6702 scoped_ptr<spdy::SpdyFrame> resp1(ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 6703 scoped_ptr<spdy::SpdyFrame> data1(ConstructSpdyBodyFrame(1, true)); |
| 6704 scoped_ptr<spdy::SpdyFrame> resp2(ConstructSpdyGetSynReply(NULL, 0, 3)); |
| 6705 scoped_ptr<spdy::SpdyFrame> data2(ConstructSpdyBodyFrame(3, true)); |
| 6706 MockRead spdy_reads[] = { |
| 6707 CreateMockRead(*resp1), |
| 6708 CreateMockRead(*data1), |
| 6709 CreateMockRead(*resp2), |
| 6710 CreateMockRead(*data2), |
| 6711 MockRead(true, 0, 0), |
| 6712 }; |
| 6713 |
| 6714 scoped_refptr<DelayedSocketData> spdy_data( |
| 6715 new DelayedSocketData( |
| 6716 2, // wait for writes to finish before reading. |
| 6717 spdy_reads, arraysize(spdy_reads), |
| 6718 spdy_writes, arraysize(spdy_writes))); |
| 6719 // Socket 4 is the successful Alternate-Protocol for transaction 3. |
| 6720 session_deps.socket_factory.AddSocketDataProvider(spdy_data); |
| 6721 |
| 6722 // Socket 5 is the unsuccessful non-Alternate-Protocol for transaction 3. |
| 6723 session_deps.socket_factory.AddSocketDataProvider(&hanging_socket); |
| 6724 |
| 6725 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); |
| 6726 TestCompletionCallback callback1; |
| 6727 HttpNetworkTransaction trans1(session); |
| 6728 |
| 6729 int rv = trans1.Start(&request, &callback1, BoundNetLog()); |
| 6730 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 6731 EXPECT_EQ(OK, callback1.WaitForResult()); |
| 6732 |
| 6733 const HttpResponseInfo* response = trans1.GetResponseInfo(); |
| 6734 ASSERT_TRUE(response != NULL); |
| 6735 ASSERT_TRUE(response->headers != NULL); |
| 6736 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
| 6737 |
| 6738 std::string response_data; |
| 6739 ASSERT_EQ(OK, ReadTransaction(&trans1, &response_data)); |
| 6740 EXPECT_EQ("hello world", response_data); |
| 6741 |
| 6742 TestCompletionCallback callback2; |
| 6743 HttpNetworkTransaction trans2(session); |
| 6744 rv = trans2.Start(&request, &callback2, BoundNetLog()); |
| 6745 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 6746 |
| 6747 TestCompletionCallback callback3; |
| 6748 HttpNetworkTransaction trans3(session); |
| 6749 rv = trans3.Start(&request, &callback3, BoundNetLog()); |
| 6750 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 6751 |
| 6752 EXPECT_EQ(OK, callback2.WaitForResult()); |
| 6753 EXPECT_EQ(OK, callback3.WaitForResult()); |
| 6754 |
| 6755 response = trans2.GetResponseInfo(); |
| 6756 ASSERT_TRUE(response != NULL); |
| 6757 ASSERT_TRUE(response->headers != NULL); |
| 6758 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
| 6759 EXPECT_TRUE(response->was_fetched_via_spdy); |
| 6760 EXPECT_TRUE(response->was_npn_negotiated); |
| 6761 ASSERT_EQ(OK, ReadTransaction(&trans2, &response_data)); |
| 6762 EXPECT_EQ("hello!", response_data); |
| 6763 |
| 6764 response = trans3.GetResponseInfo(); |
| 6765 ASSERT_TRUE(response != NULL); |
| 6766 ASSERT_TRUE(response->headers != NULL); |
| 6767 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
| 6768 EXPECT_TRUE(response->was_fetched_via_spdy); |
| 6769 EXPECT_TRUE(response->was_npn_negotiated); |
| 6770 ASSERT_EQ(OK, ReadTransaction(&trans3, &response_data)); |
| 6771 EXPECT_EQ("hello!", response_data); |
| 6772 |
| 6773 HttpStreamFactory::set_next_protos(""); |
| 6774 HttpStreamFactory::set_use_alternate_protocols(false); |
| 6775 } |
| 6776 |
| 6777 TEST_F(HttpNetworkTransactionTest, StallAlternateProtocolForNpnSpdy) { |
| 6778 HttpStreamFactory::set_use_alternate_protocols(true); |
| 6779 HttpStreamFactory::set_next_protos(kExpectedNPNString); |
| 6780 SessionDependencies session_deps; |
| 6781 |
| 6782 HttpRequestInfo request; |
| 6783 request.method = "GET"; |
| 6784 request.url = GURL("http://www.google.com/"); |
| 6785 request.load_flags = 0; |
| 6786 |
| 6787 MockRead data_reads[] = { |
| 6788 MockRead("HTTP/1.1 200 OK\r\n"), |
| 6789 MockRead(kAlternateProtocolHttpHeader), |
| 6790 MockRead("hello world"), |
| 6791 MockRead(true, OK), |
| 6792 }; |
| 6793 |
| 6794 StaticSocketDataProvider first_transaction( |
| 6795 data_reads, arraysize(data_reads), NULL, 0); |
| 6796 session_deps.socket_factory.AddSocketDataProvider(&first_transaction); |
| 6797 |
| 6798 SSLSocketDataProvider ssl(true, OK); |
| 6799 ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated; |
| 6800 ssl.next_proto = "spdy/2"; |
| 6801 ssl.was_npn_negotiated = true; |
| 6802 session_deps.socket_factory.AddSSLSocketDataProvider(&ssl); |
| 6803 |
| 6804 MockConnect never_finishing_connect(false, ERR_IO_PENDING); |
| 6805 StaticSocketDataProvider hanging_alternate_protocol_socket( |
| 6806 NULL, 0, NULL, 0); |
| 6807 hanging_alternate_protocol_socket.set_connect_data( |
| 6808 never_finishing_connect); |
| 6809 session_deps.socket_factory.AddSocketDataProvider( |
| 6810 &hanging_alternate_protocol_socket); |
| 6811 |
| 6812 // 2nd request is just a copy of the first one, over HTTP again. |
| 6813 session_deps.socket_factory.AddSocketDataProvider(&first_transaction); |
| 6814 |
| 6815 TestCompletionCallback callback; |
| 6816 |
| 6817 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); |
| 6818 scoped_ptr<HttpNetworkTransaction> trans(new HttpNetworkTransaction(session)); |
| 6819 |
| 6820 int rv = trans->Start(&request, &callback, BoundNetLog()); |
| 6821 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 6822 EXPECT_EQ(OK, callback.WaitForResult()); |
| 6823 |
| 6824 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| 6825 ASSERT_TRUE(response != NULL); |
| 6826 ASSERT_TRUE(response->headers != NULL); |
| 6827 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
| 6828 |
| 6829 std::string response_data; |
| 6830 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); |
| 6831 EXPECT_EQ("hello world", response_data); |
| 6832 |
| 6833 trans.reset(new HttpNetworkTransaction(session)); |
| 6834 |
| 6835 rv = trans->Start(&request, &callback, BoundNetLog()); |
| 6836 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 6837 EXPECT_EQ(OK, callback.WaitForResult()); |
| 6838 |
| 6839 response = trans->GetResponseInfo(); |
| 6840 ASSERT_TRUE(response != NULL); |
| 6841 ASSERT_TRUE(response->headers != NULL); |
| 6842 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
| 6843 EXPECT_FALSE(response->was_fetched_via_spdy); |
| 6844 EXPECT_FALSE(response->was_npn_negotiated); |
| 6845 |
| 6846 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); |
| 6847 EXPECT_EQ("hello world", response_data); |
| 6848 |
| 6849 HttpStreamFactory::set_next_protos(""); |
| 6850 HttpStreamFactory::set_use_alternate_protocols(false); |
| 6851 } |
| 6852 |
| 6711 class CapturingProxyResolver : public ProxyResolver { | 6853 class CapturingProxyResolver : public ProxyResolver { |
| 6712 public: | 6854 public: |
| 6713 CapturingProxyResolver() : ProxyResolver(false /* expects_pac_bytes */) {} | 6855 CapturingProxyResolver() : ProxyResolver(false /* expects_pac_bytes */) {} |
| 6714 virtual ~CapturingProxyResolver() {} | 6856 virtual ~CapturingProxyResolver() {} |
| 6715 | 6857 |
| 6716 virtual int GetProxyForURL(const GURL& url, | 6858 virtual int GetProxyForURL(const GURL& url, |
| 6717 ProxyInfo* results, | 6859 ProxyInfo* results, |
| 6718 CompletionCallback* callback, | 6860 CompletionCallback* callback, |
| 6719 RequestHandle* request, | 6861 RequestHandle* request, |
| 6720 const BoundNetLog& net_log) { | 6862 const BoundNetLog& net_log) { |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6800 CreateMockRead(*data.get(), 4), // 5 | 6942 CreateMockRead(*data.get(), 4), // 5 |
| 6801 MockRead(true, 0, 0, 4), // 6 | 6943 MockRead(true, 0, 0, 4), // 6 |
| 6802 }; | 6944 }; |
| 6803 | 6945 |
| 6804 scoped_refptr<OrderedSocketData> spdy_data( | 6946 scoped_refptr<OrderedSocketData> spdy_data( |
| 6805 new OrderedSocketData( | 6947 new OrderedSocketData( |
| 6806 spdy_reads, arraysize(spdy_reads), | 6948 spdy_reads, arraysize(spdy_reads), |
| 6807 spdy_writes, arraysize(spdy_writes))); | 6949 spdy_writes, arraysize(spdy_writes))); |
| 6808 session_deps.socket_factory.AddSocketDataProvider(spdy_data); | 6950 session_deps.socket_factory.AddSocketDataProvider(spdy_data); |
| 6809 | 6951 |
| 6952 MockConnect never_finishing_connect(false, ERR_IO_PENDING); |
| 6953 StaticSocketDataProvider hanging_non_alternate_protocol_socket( |
| 6954 NULL, 0, NULL, 0); |
| 6955 hanging_non_alternate_protocol_socket.set_connect_data( |
| 6956 never_finishing_connect); |
| 6957 session_deps.socket_factory.AddSocketDataProvider( |
| 6958 &hanging_non_alternate_protocol_socket); |
| 6959 |
| 6810 TestCompletionCallback callback; | 6960 TestCompletionCallback callback; |
| 6811 | 6961 |
| 6812 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); | 6962 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); |
| 6813 scoped_ptr<HttpNetworkTransaction> trans(new HttpNetworkTransaction(session)); | 6963 scoped_ptr<HttpNetworkTransaction> trans(new HttpNetworkTransaction(session)); |
| 6814 | 6964 |
| 6815 int rv = trans->Start(&request, &callback, BoundNetLog()); | 6965 int rv = trans->Start(&request, &callback, BoundNetLog()); |
| 6816 EXPECT_EQ(ERR_IO_PENDING, rv); | 6966 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 6817 EXPECT_EQ(OK, callback.WaitForResult()); | 6967 EXPECT_EQ(OK, callback.WaitForResult()); |
| 6818 | 6968 |
| 6819 const HttpResponseInfo* response = trans->GetResponseInfo(); | 6969 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 6835 | 6985 |
| 6836 response = trans->GetResponseInfo(); | 6986 response = trans->GetResponseInfo(); |
| 6837 ASSERT_TRUE(response != NULL); | 6987 ASSERT_TRUE(response != NULL); |
| 6838 ASSERT_TRUE(response->headers != NULL); | 6988 ASSERT_TRUE(response->headers != NULL); |
| 6839 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); | 6989 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
| 6840 EXPECT_TRUE(response->was_fetched_via_spdy); | 6990 EXPECT_TRUE(response->was_fetched_via_spdy); |
| 6841 EXPECT_TRUE(response->was_npn_negotiated); | 6991 EXPECT_TRUE(response->was_npn_negotiated); |
| 6842 | 6992 |
| 6843 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); | 6993 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); |
| 6844 EXPECT_EQ("hello!", response_data); | 6994 EXPECT_EQ("hello!", response_data); |
| 6845 ASSERT_EQ(2u, capturing_proxy_resolver->resolved().size()); | 6995 ASSERT_EQ(3u, capturing_proxy_resolver->resolved().size()); |
| 6846 EXPECT_EQ("http://www.google.com/", | 6996 EXPECT_EQ("http://www.google.com/", |
| 6847 capturing_proxy_resolver->resolved()[0].spec()); | 6997 capturing_proxy_resolver->resolved()[0].spec()); |
| 6848 EXPECT_EQ("https://www.google.com/", | 6998 EXPECT_EQ("https://www.google.com/", |
| 6849 capturing_proxy_resolver->resolved()[1].spec()); | 6999 capturing_proxy_resolver->resolved()[1].spec()); |
| 6850 | 7000 |
| 6851 HttpStreamFactory::set_next_protos(""); | 7001 HttpStreamFactory::set_next_protos(""); |
| 6852 HttpStreamFactory::set_use_alternate_protocols(false); | 7002 HttpStreamFactory::set_use_alternate_protocols(false); |
| 6853 } | 7003 } |
| 6854 | 7004 |
| 6855 TEST_F(HttpNetworkTransactionTest, | 7005 TEST_F(HttpNetworkTransactionTest, |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6951 rv = trans->Start(&request, &callback, BoundNetLog()); | 7101 rv = trans->Start(&request, &callback, BoundNetLog()); |
| 6952 EXPECT_EQ(ERR_IO_PENDING, rv); | 7102 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 6953 EXPECT_EQ(OK, callback.WaitForResult()); | 7103 EXPECT_EQ(OK, callback.WaitForResult()); |
| 6954 | 7104 |
| 6955 response = trans->GetResponseInfo(); | 7105 response = trans->GetResponseInfo(); |
| 6956 ASSERT_TRUE(response != NULL); | 7106 ASSERT_TRUE(response != NULL); |
| 6957 ASSERT_TRUE(response->headers != NULL); | 7107 ASSERT_TRUE(response->headers != NULL); |
| 6958 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); | 7108 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
| 6959 EXPECT_TRUE(response->was_fetched_via_spdy); | 7109 EXPECT_TRUE(response->was_fetched_via_spdy); |
| 6960 EXPECT_TRUE(response->was_npn_negotiated); | 7110 EXPECT_TRUE(response->was_npn_negotiated); |
| 6961 EXPECT_TRUE(response->was_alternate_protocol_available); | |
| 6962 | 7111 |
| 6963 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); | 7112 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); |
| 6964 EXPECT_EQ("hello!", response_data); | 7113 EXPECT_EQ("hello!", response_data); |
| 6965 | 7114 |
| 6966 HttpStreamFactory::set_next_protos(""); | 7115 HttpStreamFactory::set_next_protos(""); |
| 6967 HttpStreamFactory::set_use_alternate_protocols(false); | 7116 HttpStreamFactory::set_use_alternate_protocols(false); |
| 6968 } | 7117 } |
| 6969 | 7118 |
| 6970 // GenerateAuthToken is a mighty big test. | 7119 // GenerateAuthToken is a mighty big test. |
| 6971 // It tests all permutation of GenerateAuthToken behavior: | 7120 // It tests all permutation of GenerateAuthToken behavior: |
| (...skipping 750 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7722 ASSERT_TRUE(response != NULL); | 7871 ASSERT_TRUE(response != NULL); |
| 7723 ASSERT_TRUE(response->headers != NULL); | 7872 ASSERT_TRUE(response->headers != NULL); |
| 7724 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); | 7873 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
| 7725 | 7874 |
| 7726 std::string response_data; | 7875 std::string response_data; |
| 7727 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); | 7876 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); |
| 7728 EXPECT_EQ("hello world", response_data); | 7877 EXPECT_EQ("hello world", response_data); |
| 7729 | 7878 |
| 7730 EXPECT_FALSE(response->was_fetched_via_spdy); | 7879 EXPECT_FALSE(response->was_fetched_via_spdy); |
| 7731 EXPECT_TRUE(response->was_npn_negotiated); | 7880 EXPECT_TRUE(response->was_npn_negotiated); |
| 7732 EXPECT_FALSE(response->was_alternate_protocol_available); | |
| 7733 | 7881 |
| 7734 HttpStreamFactory::set_next_protos(""); | 7882 HttpStreamFactory::set_next_protos(""); |
| 7735 HttpStreamFactory::set_use_alternate_protocols(false); | 7883 HttpStreamFactory::set_use_alternate_protocols(false); |
| 7736 } | 7884 } |
| 7737 | 7885 |
| 7738 TEST_F(HttpNetworkTransactionTest, SpdyPostNPNServerHangup) { | 7886 TEST_F(HttpNetworkTransactionTest, SpdyPostNPNServerHangup) { |
| 7739 // Simulate the SSL handshake completing with an NPN negotiation | 7887 // Simulate the SSL handshake completing with an NPN negotiation |
| 7740 // followed by an immediate server closing of the socket. | 7888 // followed by an immediate server closing of the socket. |
| 7741 // Fix crash: http://crbug.com/46369 | 7889 // Fix crash: http://crbug.com/46369 |
| 7742 HttpStreamFactory::set_use_alternate_protocols(true); | 7890 HttpStreamFactory::set_use_alternate_protocols(true); |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7878 }; | 8026 }; |
| 7879 scoped_refptr<OrderedSocketData> data_2( | 8027 scoped_refptr<OrderedSocketData> data_2( |
| 7880 new OrderedSocketData(data_reads_2, arraysize(data_reads_2), | 8028 new OrderedSocketData(data_reads_2, arraysize(data_reads_2), |
| 7881 data_writes_2, arraysize(data_writes_2))); | 8029 data_writes_2, arraysize(data_writes_2))); |
| 7882 | 8030 |
| 7883 SSLSocketDataProvider ssl(true, OK); | 8031 SSLSocketDataProvider ssl(true, OK); |
| 7884 ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated; | 8032 ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated; |
| 7885 ssl.next_proto = "spdy/2"; | 8033 ssl.next_proto = "spdy/2"; |
| 7886 ssl.was_npn_negotiated = true; | 8034 ssl.was_npn_negotiated = true; |
| 7887 | 8035 |
| 8036 MockConnect never_finishing_connect(false, ERR_IO_PENDING); |
| 8037 StaticSocketDataProvider hanging_non_alternate_protocol_socket( |
| 8038 NULL, 0, NULL, 0); |
| 8039 hanging_non_alternate_protocol_socket.set_connect_data( |
| 8040 never_finishing_connect); |
| 8041 |
| 7888 session_deps.socket_factory.AddSocketDataProvider(&data_1); | 8042 session_deps.socket_factory.AddSocketDataProvider(&data_1); |
| 7889 session_deps.socket_factory.AddSocketDataProvider(data_2.get()); | 8043 session_deps.socket_factory.AddSocketDataProvider(data_2.get()); |
| 7890 session_deps.socket_factory.AddSSLSocketDataProvider(&ssl); | 8044 session_deps.socket_factory.AddSSLSocketDataProvider(&ssl); |
| 8045 session_deps.socket_factory.AddSocketDataProvider( |
| 8046 &hanging_non_alternate_protocol_socket); |
| 7891 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); | 8047 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); |
| 7892 | 8048 |
| 7893 // First round should work and provide the Alternate-Protocol state. | 8049 // First round should work and provide the Alternate-Protocol state. |
| 7894 TestCompletionCallback callback_1; | 8050 TestCompletionCallback callback_1; |
| 7895 scoped_ptr<HttpTransaction> trans_1(new HttpNetworkTransaction(session)); | 8051 scoped_ptr<HttpTransaction> trans_1(new HttpNetworkTransaction(session)); |
| 7896 int rv = trans_1->Start(&request, &callback_1, BoundNetLog()); | 8052 int rv = trans_1->Start(&request, &callback_1, BoundNetLog()); |
| 7897 EXPECT_EQ(ERR_IO_PENDING, rv); | 8053 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 7898 EXPECT_EQ(OK, callback_1.WaitForResult()); | 8054 EXPECT_EQ(OK, callback_1.WaitForResult()); |
| 7899 | 8055 |
| 7900 // Second round should attempt a tunnel connect and get an auth challenge. | 8056 // Second round should attempt a tunnel connect and get an auth challenge. |
| (...skipping 678 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8579 // Now that the new handshake has failed, ensure that the client | 8735 // Now that the new handshake has failed, ensure that the client |
| 8580 // certificate was removed from the client auth cache. | 8736 // certificate was removed from the client auth cache. |
| 8581 ASSERT_FALSE(session->ssl_client_auth_cache()->Lookup("proxy:70", | 8737 ASSERT_FALSE(session->ssl_client_auth_cache()->Lookup("proxy:70", |
| 8582 &client_cert)); | 8738 &client_cert)); |
| 8583 ASSERT_FALSE(session->ssl_client_auth_cache()->Lookup("www.example.com:443", | 8739 ASSERT_FALSE(session->ssl_client_auth_cache()->Lookup("www.example.com:443", |
| 8584 &client_cert)); | 8740 &client_cert)); |
| 8585 } | 8741 } |
| 8586 } | 8742 } |
| 8587 | 8743 |
| 8588 } // namespace net | 8744 } // namespace net |
| OLD | NEW |