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/socket/ssl_client_socket.h" | 5 #include "net/socket/ssl_client_socket.h" |
6 | 6 |
7 #include "base/callback_helpers.h" | 7 #include "base/callback_helpers.h" |
8 #include "base/memory/ref_counted.h" | 8 #include "base/memory/ref_counted.h" |
9 #include "base/run_loop.h" | 9 #include "base/run_loop.h" |
10 #include "base/time/time.h" | 10 #include "base/time/time.h" |
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
269 int buf_len, | 269 int buf_len, |
270 const CompletionCallback& callback) override; | 270 const CompletionCallback& callback) override; |
271 virtual int Write(IOBuffer* buf, | 271 virtual int Write(IOBuffer* buf, |
272 int buf_len, | 272 int buf_len, |
273 const CompletionCallback& callback) override; | 273 const CompletionCallback& callback) override; |
274 | 274 |
275 // Sets the next Read() call and all future calls to return |error|. | 275 // Sets the next Read() call and all future calls to return |error|. |
276 // If there is already a pending asynchronous read, the configured error | 276 // If there is already a pending asynchronous read, the configured error |
277 // will not be returned until that asynchronous read has completed and Read() | 277 // will not be returned until that asynchronous read has completed and Read() |
278 // is called again. | 278 // is called again. |
279 void SetNextReadError(Error error) { | 279 void SetNextReadError(int error) { |
280 DCHECK_GE(0, error); | 280 DCHECK_GE(0, error); |
281 have_read_error_ = true; | 281 have_read_error_ = true; |
282 pending_read_error_ = error; | 282 pending_read_error_ = error; |
283 } | 283 } |
284 | 284 |
285 // Sets the next Write() call and all future calls to return |error|. | 285 // Sets the next Write() call and all future calls to return |error|. |
286 // If there is already a pending asynchronous write, the configured error | 286 // If there is already a pending asynchronous write, the configured error |
287 // will not be returned until that asynchronous write has completed and | 287 // will not be returned until that asynchronous write has completed and |
288 // Write() is called again. | 288 // Write() is called again. |
289 void SetNextWriteError(Error error) { | 289 void SetNextWriteError(int error) { |
290 DCHECK_GE(0, error); | 290 DCHECK_GE(0, error); |
291 have_write_error_ = true; | 291 have_write_error_ = true; |
292 pending_write_error_ = error; | 292 pending_write_error_ = error; |
293 } | 293 } |
294 | 294 |
295 private: | 295 private: |
296 bool have_read_error_; | 296 bool have_read_error_; |
297 int pending_read_error_; | 297 int pending_read_error_; |
298 | 298 |
299 bool have_write_error_; | 299 bool have_write_error_; |
(...skipping 1506 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1806 // Should still read bytes despite the write error. | 1806 // Should still read bytes despite the write error. |
1807 EXPECT_LT(0, rv); | 1807 EXPECT_LT(0, rv); |
1808 #else | 1808 #else |
1809 // NSS attempts to flush the write buffer in PR_Read on an SSL socket before | 1809 // NSS attempts to flush the write buffer in PR_Read on an SSL socket before |
1810 // pumping the read state machine, unless configured with SSL_ENABLE_FDX, so | 1810 // pumping the read state machine, unless configured with SSL_ENABLE_FDX, so |
1811 // the write error stops future reads. | 1811 // the write error stops future reads. |
1812 EXPECT_EQ(ERR_CONNECTION_RESET, rv); | 1812 EXPECT_EQ(ERR_CONNECTION_RESET, rv); |
1813 #endif | 1813 #endif |
1814 } | 1814 } |
1815 | 1815 |
| 1816 // Tests that SSLClientSocket fails the handshake if the underlying |
| 1817 // transport is cleanly closed. |
| 1818 TEST_F(SSLClientSocketTest, Connect_WithZeroReturn) { |
| 1819 SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS, |
| 1820 SpawnedTestServer::kLocalhost, |
| 1821 base::FilePath()); |
| 1822 ASSERT_TRUE(test_server.Start()); |
| 1823 |
| 1824 AddressList addr; |
| 1825 ASSERT_TRUE(test_server.GetAddressList(&addr)); |
| 1826 |
| 1827 TestCompletionCallback callback; |
| 1828 scoped_ptr<StreamSocket> real_transport( |
| 1829 new TCPClientSocket(addr, NULL, NetLog::Source())); |
| 1830 scoped_ptr<SynchronousErrorStreamSocket> transport( |
| 1831 new SynchronousErrorStreamSocket(real_transport.Pass())); |
| 1832 int rv = callback.GetResult(transport->Connect(callback.callback())); |
| 1833 EXPECT_EQ(OK, rv); |
| 1834 |
| 1835 SynchronousErrorStreamSocket* raw_transport = transport.get(); |
| 1836 scoped_ptr<SSLClientSocket> sock( |
| 1837 CreateSSLClientSocket(transport.PassAs<StreamSocket>(), |
| 1838 test_server.host_port_pair(), |
| 1839 kDefaultSSLConfig)); |
| 1840 |
| 1841 raw_transport->SetNextReadError(0); |
| 1842 |
| 1843 rv = callback.GetResult(sock->Connect(callback.callback())); |
| 1844 EXPECT_EQ(ERR_CONNECTION_CLOSED, rv); |
| 1845 EXPECT_FALSE(sock->IsConnected()); |
| 1846 } |
| 1847 |
| 1848 // Tests that SSLClientSocket cleanly returns a Read of size 0 if the |
| 1849 // underlying socket is cleanly closed. |
| 1850 // This is a regression test for https://crbug.com/422246 |
| 1851 TEST_F(SSLClientSocketTest, Read_WithZeroReturn) { |
| 1852 SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS, |
| 1853 SpawnedTestServer::kLocalhost, |
| 1854 base::FilePath()); |
| 1855 ASSERT_TRUE(test_server.Start()); |
| 1856 |
| 1857 AddressList addr; |
| 1858 ASSERT_TRUE(test_server.GetAddressList(&addr)); |
| 1859 |
| 1860 TestCompletionCallback callback; |
| 1861 scoped_ptr<StreamSocket> real_transport( |
| 1862 new TCPClientSocket(addr, NULL, NetLog::Source())); |
| 1863 scoped_ptr<SynchronousErrorStreamSocket> transport( |
| 1864 new SynchronousErrorStreamSocket(real_transport.Pass())); |
| 1865 int rv = callback.GetResult(transport->Connect(callback.callback())); |
| 1866 EXPECT_EQ(OK, rv); |
| 1867 |
| 1868 // Disable TLS False Start to ensure the handshake has completed. |
| 1869 SSLConfig ssl_config; |
| 1870 ssl_config.false_start_enabled = false; |
| 1871 |
| 1872 SynchronousErrorStreamSocket* raw_transport = transport.get(); |
| 1873 scoped_ptr<SSLClientSocket> sock( |
| 1874 CreateSSLClientSocket(transport.PassAs<StreamSocket>(), |
| 1875 test_server.host_port_pair(), |
| 1876 ssl_config)); |
| 1877 |
| 1878 rv = callback.GetResult(sock->Connect(callback.callback())); |
| 1879 EXPECT_EQ(OK, rv); |
| 1880 EXPECT_TRUE(sock->IsConnected()); |
| 1881 |
| 1882 raw_transport->SetNextReadError(0); |
| 1883 scoped_refptr<IOBuffer> buf(new IOBuffer(4096)); |
| 1884 rv = callback.GetResult(sock->Read(buf.get(), 4096, callback.callback())); |
| 1885 EXPECT_EQ(0, rv); |
| 1886 } |
| 1887 |
1816 TEST_F(SSLClientSocketTest, Read_SmallChunks) { | 1888 TEST_F(SSLClientSocketTest, Read_SmallChunks) { |
1817 SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS, | 1889 SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS, |
1818 SpawnedTestServer::kLocalhost, | 1890 SpawnedTestServer::kLocalhost, |
1819 base::FilePath()); | 1891 base::FilePath()); |
1820 ASSERT_TRUE(test_server.Start()); | 1892 ASSERT_TRUE(test_server.Start()); |
1821 | 1893 |
1822 AddressList addr; | 1894 AddressList addr; |
1823 ASSERT_TRUE(test_server.GetAddressList(&addr)); | 1895 ASSERT_TRUE(test_server.GetAddressList(&addr)); |
1824 | 1896 |
1825 TestCompletionCallback callback; | 1897 TestCompletionCallback callback; |
(...skipping 1139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2965 ssl_config.channel_id_enabled = true; | 3037 ssl_config.channel_id_enabled = true; |
2966 | 3038 |
2967 int rv; | 3039 int rv; |
2968 ASSERT_TRUE(CreateAndConnectSSLClientSocket(ssl_config, &rv)); | 3040 ASSERT_TRUE(CreateAndConnectSSLClientSocket(ssl_config, &rv)); |
2969 | 3041 |
2970 EXPECT_EQ(ERR_UNEXPECTED, rv); | 3042 EXPECT_EQ(ERR_UNEXPECTED, rv); |
2971 EXPECT_FALSE(sock_->IsConnected()); | 3043 EXPECT_FALSE(sock_->IsConnected()); |
2972 } | 3044 } |
2973 | 3045 |
2974 } // namespace net | 3046 } // namespace net |
OLD | NEW |