| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <stdarg.h> | 8 #include <stdarg.h> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 9452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9463 if (rv == ERR_IO_PENDING) | 9463 if (rv == ERR_IO_PENDING) |
| 9464 rv = callback.WaitForResult(); | 9464 rv = callback.WaitForResult(); |
| 9465 EXPECT_EQ(3, rv); | 9465 EXPECT_EQ(3, rv); |
| 9466 rv = trans_compete->Read(io_buf, io_buf->size(), callback.callback()); | 9466 rv = trans_compete->Read(io_buf, io_buf->size(), callback.callback()); |
| 9467 EXPECT_EQ(0, rv); | 9467 EXPECT_EQ(0, rv); |
| 9468 | 9468 |
| 9469 // Finally, the socket is released to the group. | 9469 // Finally, the socket is released to the group. |
| 9470 EXPECT_EQ(1, transport_pool->IdleSocketCountInGroup(kSocketGroup)); | 9470 EXPECT_EQ(1, transport_pool->IdleSocketCountInGroup(kSocketGroup)); |
| 9471 } | 9471 } |
| 9472 | 9472 |
| 9473 class TLSDecompressionFailureSocketDataProvider : public SocketDataProvider { | |
| 9474 public: | |
| 9475 explicit TLSDecompressionFailureSocketDataProvider(bool fail_all) | |
| 9476 : fail_all_(fail_all) { | |
| 9477 } | |
| 9478 | |
| 9479 virtual MockRead GetNextRead() OVERRIDE { | |
| 9480 if (fail_all_) | |
| 9481 return MockRead(SYNCHRONOUS, ERR_SSL_DECOMPRESSION_FAILURE_ALERT); | |
| 9482 | |
| 9483 return MockRead(SYNCHRONOUS, | |
| 9484 "HTTP/1.1 200 OK\r\nContent-Length: 3\r\n\r\nok.\r\n"); | |
| 9485 } | |
| 9486 | |
| 9487 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { | |
| 9488 return MockWriteResult(SYNCHRONOUS /* async */, data.size()); | |
| 9489 } | |
| 9490 | |
| 9491 virtual void Reset() OVERRIDE { | |
| 9492 } | |
| 9493 | |
| 9494 private: | |
| 9495 const bool fail_all_; | |
| 9496 }; | |
| 9497 | |
| 9498 // Test that we restart a connection when we see a decompression failure from | |
| 9499 // the peer during the handshake. (In the real world we'll restart with SSLv3 | |
| 9500 // and we won't offer DEFLATE in that case.) | |
| 9501 TEST_F(HttpNetworkTransactionSpdy3Test, RestartAfterTLSDecompressionFailure) { | |
| 9502 HttpRequestInfo request; | |
| 9503 request.method = "GET"; | |
| 9504 request.url = GURL("https://tlsdecompressionfailure.example.com/"); | |
| 9505 request.load_flags = 0; | |
| 9506 | |
| 9507 SpdySessionDependencies session_deps; | |
| 9508 TLSDecompressionFailureSocketDataProvider socket_data_provider1( | |
| 9509 false /* fail all reads */); | |
| 9510 TLSDecompressionFailureSocketDataProvider socket_data_provider2(false); | |
| 9511 SSLSocketDataProvider ssl_socket_data_provider1( | |
| 9512 SYNCHRONOUS, ERR_SSL_DECOMPRESSION_FAILURE_ALERT); | |
| 9513 SSLSocketDataProvider ssl_socket_data_provider2(SYNCHRONOUS, OK); | |
| 9514 session_deps.socket_factory->AddSocketDataProvider(&socket_data_provider1); | |
| 9515 session_deps.socket_factory->AddSocketDataProvider(&socket_data_provider2); | |
| 9516 session_deps.socket_factory->AddSSLSocketDataProvider( | |
| 9517 &ssl_socket_data_provider1); | |
| 9518 session_deps.socket_factory->AddSSLSocketDataProvider( | |
| 9519 &ssl_socket_data_provider2); | |
| 9520 | |
| 9521 // Work around http://crbug.com/37454 | |
| 9522 StaticSocketDataProvider bug37454_connection; | |
| 9523 bug37454_connection.set_connect_data(MockConnect(ASYNC, ERR_UNEXPECTED)); | |
| 9524 session_deps.socket_factory->AddSocketDataProvider(&bug37454_connection); | |
| 9525 | |
| 9526 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); | |
| 9527 scoped_ptr<HttpTransaction> trans( | |
| 9528 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | |
| 9529 TestCompletionCallback callback; | |
| 9530 | |
| 9531 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | |
| 9532 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 9533 EXPECT_EQ(OK, callback.WaitForResult()); | |
| 9534 | |
| 9535 const HttpResponseInfo* response = trans->GetResponseInfo(); | |
| 9536 ASSERT_TRUE(response != NULL); | |
| 9537 ASSERT_TRUE(response->headers != NULL); | |
| 9538 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); | |
| 9539 | |
| 9540 std::string response_data; | |
| 9541 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); | |
| 9542 EXPECT_EQ("ok.", response_data); | |
| 9543 } | |
| 9544 | |
| 9545 // Test that we restart a connection if we get a decompression failure from the | |
| 9546 // peer while reading the first bytes from the connection. This occurs when the | |
| 9547 // peer cannot handle DEFLATE but we're using False Start, so we don't notice | |
| 9548 // in the handshake. | |
| 9549 TEST_F(HttpNetworkTransactionSpdy3Test, | |
| 9550 RestartAfterTLSDecompressionFailureWithFalseStart) { | |
| 9551 HttpRequestInfo request; | |
| 9552 request.method = "GET"; | |
| 9553 request.url = GURL("https://tlsdecompressionfailure2.example.com/"); | |
| 9554 request.load_flags = 0; | |
| 9555 | |
| 9556 SpdySessionDependencies session_deps; | |
| 9557 TLSDecompressionFailureSocketDataProvider socket_data_provider1( | |
| 9558 true /* fail all reads */); | |
| 9559 TLSDecompressionFailureSocketDataProvider socket_data_provider2(false); | |
| 9560 SSLSocketDataProvider ssl_socket_data_provider1(SYNCHRONOUS, OK); | |
| 9561 SSLSocketDataProvider ssl_socket_data_provider2(SYNCHRONOUS, OK); | |
| 9562 session_deps.socket_factory->AddSocketDataProvider(&socket_data_provider1); | |
| 9563 session_deps.socket_factory->AddSocketDataProvider(&socket_data_provider2); | |
| 9564 session_deps.socket_factory->AddSSLSocketDataProvider( | |
| 9565 &ssl_socket_data_provider1); | |
| 9566 session_deps.socket_factory->AddSSLSocketDataProvider( | |
| 9567 &ssl_socket_data_provider2); | |
| 9568 | |
| 9569 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); | |
| 9570 scoped_ptr<HttpTransaction> trans( | |
| 9571 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | |
| 9572 TestCompletionCallback callback; | |
| 9573 | |
| 9574 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | |
| 9575 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 9576 EXPECT_EQ(OK, callback.WaitForResult()); | |
| 9577 | |
| 9578 const HttpResponseInfo* response = trans->GetResponseInfo(); | |
| 9579 ASSERT_TRUE(response != NULL); | |
| 9580 ASSERT_TRUE(response->headers != NULL); | |
| 9581 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); | |
| 9582 | |
| 9583 std::string response_data; | |
| 9584 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); | |
| 9585 EXPECT_EQ("ok.", response_data); | |
| 9586 } | |
| 9587 | |
| 9588 // This tests the case that a request is issued via http instead of spdy after | 9473 // This tests the case that a request is issued via http instead of spdy after |
| 9589 // npn is negotiated. | 9474 // npn is negotiated. |
| 9590 TEST_F(HttpNetworkTransactionSpdy3Test, NpnWithHttpOverSSL) { | 9475 TEST_F(HttpNetworkTransactionSpdy3Test, NpnWithHttpOverSSL) { |
| 9591 HttpStreamFactory::set_use_alternate_protocols(true); | 9476 HttpStreamFactory::set_use_alternate_protocols(true); |
| 9592 HttpStreamFactory::SetNextProtos( | 9477 HttpStreamFactory::SetNextProtos( |
| 9593 MakeNextProtos("http/1.1", "http1.1", NULL)); | 9478 MakeNextProtos("http/1.1", "http1.1", NULL)); |
| 9594 SpdySessionDependencies session_deps; | 9479 SpdySessionDependencies session_deps; |
| 9595 HttpRequestInfo request; | 9480 HttpRequestInfo request; |
| 9596 request.method = "GET"; | 9481 request.method = "GET"; |
| 9597 request.url = GURL("https://www.google.com/"); | 9482 request.url = GURL("https://www.google.com/"); |
| (...skipping 1711 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11309 trans2.Start(&request2, callback2.callback(), BoundNetLog())); | 11194 trans2.Start(&request2, callback2.callback(), BoundNetLog())); |
| 11310 MessageLoop::current()->RunUntilIdle(); | 11195 MessageLoop::current()->RunUntilIdle(); |
| 11311 data2->RunFor(3); | 11196 data2->RunFor(3); |
| 11312 | 11197 |
| 11313 ASSERT_TRUE(callback2.have_result()); | 11198 ASSERT_TRUE(callback2.have_result()); |
| 11314 EXPECT_EQ(OK, callback2.WaitForResult()); | 11199 EXPECT_EQ(OK, callback2.WaitForResult()); |
| 11315 EXPECT_TRUE(trans2.GetResponseInfo()->was_fetched_via_spdy); | 11200 EXPECT_TRUE(trans2.GetResponseInfo()->was_fetched_via_spdy); |
| 11316 } | 11201 } |
| 11317 | 11202 |
| 11318 } // namespace net | 11203 } // namespace net |
| OLD | NEW |