Chromium Code Reviews| 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 <math.h> // ceil | 5 #include <math.h> // ceil |
| 6 #include <vector> | 6 #include <vector> |
| 7 | 7 |
| 8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
| 9 #include "base/file_path.h" | 9 #include "base/file_path.h" |
| 10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
| (...skipping 4868 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4879 // did not complete correctly. | 4879 // did not complete correctly. |
| 4880 EXPECT_FALSE(response->auth_challenge.get() == NULL); | 4880 EXPECT_FALSE(response->auth_challenge.get() == NULL); |
| 4881 | 4881 |
| 4882 EXPECT_EQ(L"myserver:80", response->auth_challenge->host_and_port); | 4882 EXPECT_EQ(L"myserver:80", response->auth_challenge->host_and_port); |
| 4883 EXPECT_EQ(L"", response->auth_challenge->realm); | 4883 EXPECT_EQ(L"", response->auth_challenge->realm); |
| 4884 EXPECT_EQ(L"mock", response->auth_challenge->scheme); | 4884 EXPECT_EQ(L"mock", response->auth_challenge->scheme); |
| 4885 auth_handler->ResetResolveExpectation(); | 4885 auth_handler->ResetResolveExpectation(); |
| 4886 } | 4886 } |
| 4887 } | 4887 } |
| 4888 | 4888 |
| 4889 struct TLSCompressionFailureSocketDataProvider : public SocketDataProvider { | |
|
wtc
2010/04/20 21:31:07
Why is this class defined as a 'struct'?
Nit: thi
| |
| 4890 public: | |
| 4891 TLSCompressionFailureSocketDataProvider(bool fail_all) | |
| 4892 : fail_all_(fail_all) { | |
| 4893 } | |
| 4894 | |
| 4895 virtual MockRead GetNextRead() { | |
| 4896 if (fail_all_) | |
| 4897 return MockRead(false /* async */, ERR_SSL_DECOMPRESSION_FAILURE_ALERT); | |
| 4898 | |
| 4899 return MockRead(false /* async */, | |
| 4900 "HTTP/1.1 200 OK\r\nContent-Length: 3\r\n\r\nok.\r\n"); | |
| 4901 } | |
| 4902 | |
| 4903 virtual MockWriteResult OnWrite(const std::string& data) { | |
| 4904 return MockWriteResult(false /* async */, data.size()); | |
| 4905 } | |
| 4906 | |
| 4907 void Reset() { | |
| 4908 } | |
| 4909 | |
| 4910 private: | |
| 4911 const bool fail_all_; | |
| 4912 }; | |
| 4913 | |
| 4914 // Test that we restart a connection when we see a decompression failure from | |
| 4915 // the peer during the handshake. (In the real world we'll restart with SSLv3 | |
| 4916 // and we won't offer DEFLATE in that case.) | |
| 4917 TEST_F(HttpNetworkTransactionTest, RestartAfterTLSDecompressionFailure) { | |
| 4918 HttpRequestInfo request; | |
| 4919 request.method = "GET"; | |
| 4920 request.url = GURL("https://tlsdecompressionfailure.example.com/"); | |
| 4921 request.load_flags = 0; | |
| 4922 | |
| 4923 SessionDependencies session_deps; | |
| 4924 TLSCompressionFailureSocketDataProvider socket_data_provider1( | |
| 4925 false /* fail all reads */); | |
| 4926 TLSCompressionFailureSocketDataProvider socket_data_provider2(false); | |
| 4927 SSLSocketDataProvider ssl_socket_data_provider1( | |
| 4928 false, ERR_SSL_DECOMPRESSION_FAILURE_ALERT); | |
| 4929 SSLSocketDataProvider ssl_socket_data_provider2(false, OK); | |
| 4930 session_deps.socket_factory.AddSocketDataProvider(&socket_data_provider1); | |
| 4931 session_deps.socket_factory.AddSocketDataProvider(&socket_data_provider2); | |
| 4932 session_deps.socket_factory.AddSSLSocketDataProvider( | |
| 4933 &ssl_socket_data_provider1); | |
| 4934 session_deps.socket_factory.AddSSLSocketDataProvider( | |
| 4935 &ssl_socket_data_provider2); | |
| 4936 | |
| 4937 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); | |
| 4938 scoped_ptr<HttpTransaction> trans(new HttpNetworkTransaction(session)); | |
| 4939 TestCompletionCallback callback; | |
| 4940 | |
| 4941 int rv = trans->Start(&request, &callback, NULL); | |
| 4942 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 4943 EXPECT_EQ(OK, callback.WaitForResult()); | |
| 4944 | |
| 4945 const HttpResponseInfo* response = trans->GetResponseInfo(); | |
| 4946 ASSERT_TRUE(response != NULL); | |
| 4947 ASSERT_TRUE(response->headers != NULL); | |
| 4948 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); | |
| 4949 | |
| 4950 std::string response_data; | |
| 4951 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); | |
| 4952 EXPECT_EQ("ok.", response_data); | |
| 4953 } | |
| 4954 | |
| 4955 // Test that we restart a connection if we get a decompression failure from the | |
| 4956 // peer while reading the first bytes from the connection. This occurs when the | |
| 4957 // peer cannot handle DEFLATE but we're using False Start, so we don't notice | |
| 4958 // in the handshake. | |
| 4959 TEST_F(HttpNetworkTransactionTest, | |
| 4960 RestartAfterTLSDecompressionFailureWithFalseStart) { | |
| 4961 HttpRequestInfo request; | |
| 4962 request.method = "GET"; | |
| 4963 request.url = GURL("https://tlsdecompressionfailure2.example.com/"); | |
| 4964 request.load_flags = 0; | |
| 4965 | |
| 4966 SessionDependencies session_deps; | |
| 4967 TLSCompressionFailureSocketDataProvider socket_data_provider1( | |
| 4968 true /* fail all reads */); | |
| 4969 TLSCompressionFailureSocketDataProvider socket_data_provider2(false); | |
| 4970 SSLSocketDataProvider ssl_socket_data_provider1(false, OK); | |
| 4971 SSLSocketDataProvider ssl_socket_data_provider2(false, OK); | |
| 4972 session_deps.socket_factory.AddSocketDataProvider(&socket_data_provider1); | |
| 4973 session_deps.socket_factory.AddSocketDataProvider(&socket_data_provider2); | |
| 4974 session_deps.socket_factory.AddSSLSocketDataProvider( | |
| 4975 &ssl_socket_data_provider1); | |
| 4976 session_deps.socket_factory.AddSSLSocketDataProvider( | |
| 4977 &ssl_socket_data_provider2); | |
| 4978 | |
| 4979 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); | |
| 4980 scoped_ptr<HttpTransaction> trans(new HttpNetworkTransaction(session)); | |
| 4981 TestCompletionCallback callback; | |
| 4982 | |
| 4983 int rv = trans->Start(&request, &callback, NULL); | |
| 4984 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 4985 EXPECT_EQ(OK, callback.WaitForResult()); | |
| 4986 | |
| 4987 const HttpResponseInfo* response = trans->GetResponseInfo(); | |
| 4988 ASSERT_TRUE(response != NULL); | |
| 4989 ASSERT_TRUE(response->headers != NULL); | |
| 4990 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); | |
| 4991 | |
| 4992 std::string response_data; | |
| 4993 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); | |
| 4994 EXPECT_EQ("ok.", response_data); | |
| 4995 } | |
| 4996 | |
| 4889 } // namespace net | 4997 } // namespace net |
| OLD | NEW |