Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(263)

Side by Side Diff: net/socket/ssl_client_socket_unittest.cc

Issue 353713005: Implements new, more robust design for communicating between SSLConnectJobs. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Updated tests for client sockets to confirm use of completion callback and switched messenger to us… Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "net/base/address_list.h" 10 #include "net/base/address_list.h"
(...skipping 574 matching lines...) Expand 10 before | Expand all | Expand 10 after
585 OVERRIDE {} 585 OVERRIDE {}
586 virtual int GetCertCount() OVERRIDE { return 0; } 586 virtual int GetCertCount() OVERRIDE { return 0; }
587 virtual void SetForceKeepSessionState() OVERRIDE {} 587 virtual void SetForceKeepSessionState() OVERRIDE {}
588 }; 588 };
589 589
590 class SSLClientSocketTest : public PlatformTest { 590 class SSLClientSocketTest : public PlatformTest {
591 public: 591 public:
592 SSLClientSocketTest() 592 SSLClientSocketTest()
593 : socket_factory_(ClientSocketFactory::GetDefaultFactory()), 593 : socket_factory_(ClientSocketFactory::GetDefaultFactory()),
594 cert_verifier_(new MockCertVerifier), 594 cert_verifier_(new MockCertVerifier),
595 transport_security_state_(new TransportSecurityState) { 595 transport_security_state_(new TransportSecurityState),
596 ran_completion_callback_(false) {
596 cert_verifier_->set_default_result(OK); 597 cert_verifier_->set_default_result(OK);
597 context_.cert_verifier = cert_verifier_.get(); 598 context_.cert_verifier = cert_verifier_.get();
598 context_.transport_security_state = transport_security_state_.get(); 599 context_.transport_security_state = transport_security_state_.get();
599 } 600 }
600 601
602 void RecordCompletionCallbackRun() { ran_completion_callback_ = true; }
wtc 2014/07/30 21:56:57 In ssl_client_socket_openssl_unittest.cc, this met
603
601 protected: 604 protected:
602 // Sets up a TCP connection to a HTTPS server. To actually do the SSL 605 // Sets up a TCP connection to a HTTPS server. To actually do the SSL
603 // handshake, follow up with call to CreateAndConnectSSLClientSocket() below. 606 // handshake, follow up with call to CreateAndConnectSSLClientSocket() below.
604 bool ConnectToTestServer(SpawnedTestServer::SSLOptions& ssl_options) { 607 bool ConnectToTestServer(SpawnedTestServer::SSLOptions& ssl_options) {
605 test_server_.reset(new SpawnedTestServer( 608 test_server_.reset(new SpawnedTestServer(
606 SpawnedTestServer::TYPE_HTTPS, ssl_options, base::FilePath())); 609 SpawnedTestServer::TYPE_HTTPS, ssl_options, base::FilePath()));
607 if (!test_server_->Start()) { 610 if (!test_server_->Start()) {
608 LOG(ERROR) << "Could not start SpawnedTestServer"; 611 LOG(ERROR) << "Could not start SpawnedTestServer";
609 return false; 612 return false;
610 } 613 }
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
653 *result = callback_.GetResult(sock_->Connect(callback_.callback())); 656 *result = callback_.GetResult(sock_->Connect(callback_.callback()));
654 return true; 657 return true;
655 } 658 }
656 659
657 ClientSocketFactory* socket_factory_; 660 ClientSocketFactory* socket_factory_;
658 scoped_ptr<MockCertVerifier> cert_verifier_; 661 scoped_ptr<MockCertVerifier> cert_verifier_;
659 scoped_ptr<TransportSecurityState> transport_security_state_; 662 scoped_ptr<TransportSecurityState> transport_security_state_;
660 SSLClientSocketContext context_; 663 SSLClientSocketContext context_;
661 scoped_ptr<SSLClientSocket> sock_; 664 scoped_ptr<SSLClientSocket> sock_;
662 CapturingNetLog log_; 665 CapturingNetLog log_;
666 bool ran_completion_callback_;
wtc 2014/07/30 21:56:58 Same here: this member should be renamed "ran_hand
663 667
664 private: 668 private:
665 scoped_ptr<StreamSocket> transport_; 669 scoped_ptr<StreamSocket> transport_;
666 scoped_ptr<SpawnedTestServer> test_server_; 670 scoped_ptr<SpawnedTestServer> test_server_;
667 TestCompletionCallback callback_; 671 TestCompletionCallback callback_;
668 AddressList addr_; 672 AddressList addr_;
669 }; 673 };
670 674
671 // Verifies the correctness of GetSSLCertRequestInfo. 675 // Verifies the correctness of GetSSLCertRequestInfo.
672 class SSLClientSocketCertRequestInfoTest : public SSLClientSocketTest { 676 class SSLClientSocketCertRequestInfoTest : public SSLClientSocketTest {
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after
935 CapturingNetLog log; 939 CapturingNetLog log;
936 scoped_ptr<StreamSocket> transport( 940 scoped_ptr<StreamSocket> transport(
937 new TCPClientSocket(addr, &log, NetLog::Source())); 941 new TCPClientSocket(addr, &log, NetLog::Source()));
938 int rv = transport->Connect(callback.callback()); 942 int rv = transport->Connect(callback.callback());
939 if (rv == ERR_IO_PENDING) 943 if (rv == ERR_IO_PENDING)
940 rv = callback.WaitForResult(); 944 rv = callback.WaitForResult();
941 EXPECT_EQ(OK, rv); 945 EXPECT_EQ(OK, rv);
942 946
943 scoped_ptr<SSLClientSocket> sock(CreateSSLClientSocket( 947 scoped_ptr<SSLClientSocket> sock(CreateSSLClientSocket(
944 transport.Pass(), test_server.host_port_pair(), kDefaultSSLConfig)); 948 transport.Pass(), test_server.host_port_pair(), kDefaultSSLConfig));
945 949
wtc 2014/07/30 21:56:58 Why don't you call sock->SetHandshakeCompletionCal
946 EXPECT_FALSE(sock->IsConnected());
wtc 2014/07/30 21:56:57 Why did you delete this EXPECT_FALSE?
947
948 rv = sock->Connect(callback.callback()); 950 rv = sock->Connect(callback.callback());
949 951
950 CapturingNetLog::CapturedEntryList entries; 952 CapturingNetLog::CapturedEntryList entries;
951 log.GetEntries(&entries); 953 log.GetEntries(&entries);
952 EXPECT_TRUE(LogContainsBeginEvent(entries, 5, NetLog::TYPE_SSL_CONNECT)); 954 EXPECT_TRUE(LogContainsBeginEvent(entries, 5, NetLog::TYPE_SSL_CONNECT));
953 if (rv == ERR_IO_PENDING) 955 if (rv == ERR_IO_PENDING)
954 rv = callback.WaitForResult(); 956 rv = callback.WaitForResult();
955 957
956 EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, rv); 958 EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, rv);
957 959
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
1160 // Disable TLS False Start to avoid handshake non-determinism. 1162 // Disable TLS False Start to avoid handshake non-determinism.
1161 SSLConfig ssl_config; 1163 SSLConfig ssl_config;
1162 ssl_config.false_start_enabled = false; 1164 ssl_config.false_start_enabled = false;
1163 1165
1164 SynchronousErrorStreamSocket* raw_transport = transport.get(); 1166 SynchronousErrorStreamSocket* raw_transport = transport.get();
1165 scoped_ptr<SSLClientSocket> sock( 1167 scoped_ptr<SSLClientSocket> sock(
1166 CreateSSLClientSocket(transport.PassAs<StreamSocket>(), 1168 CreateSSLClientSocket(transport.PassAs<StreamSocket>(),
1167 test_server.host_port_pair(), 1169 test_server.host_port_pair(),
1168 ssl_config)); 1170 ssl_config));
1169 1171
1172 #if defined(USE_OPENSSL)
1173 sock->SetHandshakeCompletionCallback(
1174 base::Bind(&SSLClientSocketTest::RecordCompletionCallbackRun,
1175 base::Unretained(this)));
1176 #endif
1177
1170 rv = callback.GetResult(sock->Connect(callback.callback())); 1178 rv = callback.GetResult(sock->Connect(callback.callback()));
1171 EXPECT_EQ(OK, rv); 1179 EXPECT_EQ(OK, rv);
1172 EXPECT_TRUE(sock->IsConnected()); 1180 EXPECT_TRUE(sock->IsConnected());
1173 1181
1174 const char request_text[] = "GET / HTTP/1.0\r\n\r\n"; 1182 const char request_text[] = "GET / HTTP/1.0\r\n\r\n";
1175 static const int kRequestTextSize = 1183 static const int kRequestTextSize =
1176 static_cast<int>(arraysize(request_text) - 1); 1184 static_cast<int>(arraysize(request_text) - 1);
1177 scoped_refptr<IOBuffer> request_buffer(new IOBuffer(kRequestTextSize)); 1185 scoped_refptr<IOBuffer> request_buffer(new IOBuffer(kRequestTextSize));
1178 memcpy(request_buffer->data(), request_text, kRequestTextSize); 1186 memcpy(request_buffer->data(), request_text, kRequestTextSize);
1179 1187
(...skipping 10 matching lines...) Expand all
1190 // rv != ERR_IO_PENDING is insufficient, as ERR_IO_PENDING is a legitimate 1198 // rv != ERR_IO_PENDING is insufficient, as ERR_IO_PENDING is a legitimate
1191 // result when using a dedicated task runner for NSS. 1199 // result when using a dedicated task runner for NSS.
1192 rv = callback.GetResult(sock->Read(buf.get(), 4096, callback.callback())); 1200 rv = callback.GetResult(sock->Read(buf.get(), 4096, callback.callback()));
1193 1201
1194 #if !defined(USE_OPENSSL) 1202 #if !defined(USE_OPENSSL)
1195 // SSLClientSocketNSS records the error exactly 1203 // SSLClientSocketNSS records the error exactly
1196 EXPECT_EQ(ERR_CONNECTION_RESET, rv); 1204 EXPECT_EQ(ERR_CONNECTION_RESET, rv);
1197 #else 1205 #else
1198 // SSLClientSocketOpenSSL treats any errors as a simple EOF. 1206 // SSLClientSocketOpenSSL treats any errors as a simple EOF.
1199 EXPECT_EQ(0, rv); 1207 EXPECT_EQ(0, rv);
1208 EXPECT_TRUE(ran_completion_callback_);
1200 #endif 1209 #endif
1201 } 1210 }
1202 1211
1203 // Tests that the SSLClientSocket properly handles when the underlying transport 1212 // Tests that the SSLClientSocket properly handles when the underlying transport
1204 // asynchronously returns an error code while writing data - such as if an 1213 // asynchronously returns an error code while writing data - such as if an
1205 // intermediary terminates the socket connection uncleanly. 1214 // intermediary terminates the socket connection uncleanly.
1206 // This is a regression test for http://crbug.com/249848 1215 // This is a regression test for http://crbug.com/249848
1207 TEST_F(SSLClientSocketTest, Write_WithSynchronousError) { 1216 TEST_F(SSLClientSocketTest, Write_WithSynchronousError) {
1208 SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS, 1217 SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS,
1209 SpawnedTestServer::kLocalhost, 1218 SpawnedTestServer::kLocalhost,
(...skipping 19 matching lines...) Expand all
1229 1238
1230 // Disable TLS False Start to avoid handshake non-determinism. 1239 // Disable TLS False Start to avoid handshake non-determinism.
1231 SSLConfig ssl_config; 1240 SSLConfig ssl_config;
1232 ssl_config.false_start_enabled = false; 1241 ssl_config.false_start_enabled = false;
1233 1242
1234 scoped_ptr<SSLClientSocket> sock( 1243 scoped_ptr<SSLClientSocket> sock(
1235 CreateSSLClientSocket(transport.PassAs<StreamSocket>(), 1244 CreateSSLClientSocket(transport.PassAs<StreamSocket>(),
1236 test_server.host_port_pair(), 1245 test_server.host_port_pair(),
1237 ssl_config)); 1246 ssl_config));
1238 1247
1248 #if defined(USE_OPENSSL)
1249 sock->SetHandshakeCompletionCallback(
1250 base::Bind(&SSLClientSocketTest::RecordCompletionCallbackRun,
1251 base::Unretained(this)));
1252 #endif
1253
1239 rv = callback.GetResult(sock->Connect(callback.callback())); 1254 rv = callback.GetResult(sock->Connect(callback.callback()));
1240 EXPECT_EQ(OK, rv); 1255 EXPECT_EQ(OK, rv);
1241 EXPECT_TRUE(sock->IsConnected()); 1256 EXPECT_TRUE(sock->IsConnected());
1242 1257
1243 const char request_text[] = "GET / HTTP/1.0\r\n\r\n"; 1258 const char request_text[] = "GET / HTTP/1.0\r\n\r\n";
1244 static const int kRequestTextSize = 1259 static const int kRequestTextSize =
1245 static_cast<int>(arraysize(request_text) - 1); 1260 static_cast<int>(arraysize(request_text) - 1);
1246 scoped_refptr<IOBuffer> request_buffer(new IOBuffer(kRequestTextSize)); 1261 scoped_refptr<IOBuffer> request_buffer(new IOBuffer(kRequestTextSize));
1247 memcpy(request_buffer->data(), request_text, kRequestTextSize); 1262 memcpy(request_buffer->data(), request_text, kRequestTextSize);
1248 1263
(...skipping 22 matching lines...) Expand all
1271 // checking that rv != ERR_IO_PENDING is insufficient, as ERR_IO_PENDING 1286 // checking that rv != ERR_IO_PENDING is insufficient, as ERR_IO_PENDING
1272 // is a legitimate result when using a dedicated task runner for NSS. 1287 // is a legitimate result when using a dedicated task runner for NSS.
1273 rv = callback.GetResult(rv); 1288 rv = callback.GetResult(rv);
1274 1289
1275 #if !defined(USE_OPENSSL) 1290 #if !defined(USE_OPENSSL)
1276 // SSLClientSocketNSS records the error exactly 1291 // SSLClientSocketNSS records the error exactly
1277 EXPECT_EQ(ERR_CONNECTION_RESET, rv); 1292 EXPECT_EQ(ERR_CONNECTION_RESET, rv);
1278 #else 1293 #else
1279 // SSLClientSocketOpenSSL treats any errors as a simple EOF. 1294 // SSLClientSocketOpenSSL treats any errors as a simple EOF.
1280 EXPECT_EQ(0, rv); 1295 EXPECT_EQ(0, rv);
1296 EXPECT_TRUE(ran_completion_callback_);
1281 #endif 1297 #endif
1282 } 1298 }
1283 1299
1284 // Test the full duplex mode, with Read and Write pending at the same time. 1300 // Test the full duplex mode, with Read and Write pending at the same time.
1285 // This test also serves as a regression test for http://crbug.com/29815. 1301 // This test also serves as a regression test for http://crbug.com/29815.
1286 TEST_F(SSLClientSocketTest, Read_FullDuplex) { 1302 TEST_F(SSLClientSocketTest, Read_FullDuplex) {
1287 SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS, 1303 SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS,
1288 SpawnedTestServer::kLocalhost, 1304 SpawnedTestServer::kLocalhost,
1289 base::FilePath()); 1305 base::FilePath());
1290 ASSERT_TRUE(test_server.Start()); 1306 ASSERT_TRUE(test_server.Start());
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
1495 1511
1496 // Disable TLS False Start to avoid handshake non-determinism. 1512 // Disable TLS False Start to avoid handshake non-determinism.
1497 SSLConfig ssl_config; 1513 SSLConfig ssl_config;
1498 ssl_config.false_start_enabled = false; 1514 ssl_config.false_start_enabled = false;
1499 1515
1500 scoped_ptr<SSLClientSocket> sock( 1516 scoped_ptr<SSLClientSocket> sock(
1501 CreateSSLClientSocket(transport.PassAs<StreamSocket>(), 1517 CreateSSLClientSocket(transport.PassAs<StreamSocket>(),
1502 test_server.host_port_pair(), 1518 test_server.host_port_pair(),
1503 ssl_config)); 1519 ssl_config));
1504 1520
1521 #if defined(USE_OPENSSL)
1522 sock->SetHandshakeCompletionCallback(
1523 base::Bind(&SSLClientSocketTest::RecordCompletionCallbackRun,
1524 base::Unretained(this)));
1525 #endif
1526
1505 rv = callback.GetResult(sock->Connect(callback.callback())); 1527 rv = callback.GetResult(sock->Connect(callback.callback()));
1506 EXPECT_EQ(OK, rv); 1528 EXPECT_EQ(OK, rv);
1507 EXPECT_TRUE(sock->IsConnected()); 1529 EXPECT_TRUE(sock->IsConnected());
1508 1530
1509 // Send a request so there is something to read from the socket. 1531 // Send a request so there is something to read from the socket.
1510 const char request_text[] = "GET / HTTP/1.0\r\n\r\n"; 1532 const char request_text[] = "GET / HTTP/1.0\r\n\r\n";
1511 static const int kRequestTextSize = 1533 static const int kRequestTextSize =
1512 static_cast<int>(arraysize(request_text) - 1); 1534 static_cast<int>(arraysize(request_text) - 1);
1513 scoped_refptr<IOBuffer> request_buffer(new IOBuffer(kRequestTextSize)); 1535 scoped_refptr<IOBuffer> request_buffer(new IOBuffer(kRequestTextSize));
1514 memcpy(request_buffer->data(), request_text, kRequestTextSize); 1536 memcpy(request_buffer->data(), request_text, kRequestTextSize);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1553 ASSERT_LT(0, long_request_buffer->BytesRemaining()); 1575 ASSERT_LT(0, long_request_buffer->BytesRemaining());
1554 } 1576 }
1555 } while (rv > 0); 1577 } while (rv > 0);
1556 1578
1557 #if !defined(USE_OPENSSL) 1579 #if !defined(USE_OPENSSL)
1558 // NSS records the error exactly. 1580 // NSS records the error exactly.
1559 EXPECT_EQ(ERR_CONNECTION_RESET, rv); 1581 EXPECT_EQ(ERR_CONNECTION_RESET, rv);
1560 #else 1582 #else
1561 // OpenSSL treats the reset as a generic protocol error. 1583 // OpenSSL treats the reset as a generic protocol error.
1562 EXPECT_EQ(ERR_SSL_PROTOCOL_ERROR, rv); 1584 EXPECT_EQ(ERR_SSL_PROTOCOL_ERROR, rv);
1585 EXPECT_TRUE(ran_completion_callback_);
1563 #endif 1586 #endif
1564 1587
1565 // Release the read. Some bytes should go through. 1588 // Release the read. Some bytes should go through.
1566 raw_transport->UnblockReadResult(); 1589 raw_transport->UnblockReadResult();
1567 rv = read_callback.WaitForResult(); 1590 rv = read_callback.WaitForResult();
1568 1591
1569 // Per the fix for http://crbug.com/249848, write failures currently break 1592 // Per the fix for http://crbug.com/249848, write failures currently break
1570 // reads. Change this assertion if they're changed to not collide. 1593 // reads. Change this assertion if they're changed to not collide.
1571 EXPECT_EQ(ERR_CONNECTION_RESET, rv); 1594 EXPECT_EQ(ERR_CONNECTION_RESET, rv);
1572 } 1595 }
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
1827 scoped_ptr<StreamSocket> transport( 1850 scoped_ptr<StreamSocket> transport(
1828 new MockTCPClientSocket(addr, NULL, &data)); 1851 new MockTCPClientSocket(addr, NULL, &data));
1829 int rv = transport->Connect(callback.callback()); 1852 int rv = transport->Connect(callback.callback());
1830 if (rv == ERR_IO_PENDING) 1853 if (rv == ERR_IO_PENDING)
1831 rv = callback.WaitForResult(); 1854 rv = callback.WaitForResult();
1832 EXPECT_EQ(OK, rv); 1855 EXPECT_EQ(OK, rv);
1833 1856
1834 scoped_ptr<SSLClientSocket> sock(CreateSSLClientSocket( 1857 scoped_ptr<SSLClientSocket> sock(CreateSSLClientSocket(
1835 transport.Pass(), test_server.host_port_pair(), kDefaultSSLConfig)); 1858 transport.Pass(), test_server.host_port_pair(), kDefaultSSLConfig));
1836 1859
1860 #if defined(USE_OPENSSL)
1861 sock->SetHandshakeCompletionCallback(
1862 base::Bind(&SSLClientSocketTest::RecordCompletionCallbackRun,
1863 base::Unretained(this)));
1864 #endif
1865
1837 rv = sock->Connect(callback.callback()); 1866 rv = sock->Connect(callback.callback());
1838 if (rv == ERR_IO_PENDING) 1867 if (rv == ERR_IO_PENDING)
1839 rv = callback.WaitForResult(); 1868 rv = callback.WaitForResult();
1840 EXPECT_EQ(ERR_SSL_PROTOCOL_ERROR, rv); 1869 EXPECT_EQ(ERR_SSL_PROTOCOL_ERROR, rv);
1870 #if defined(USE_OPENSSL)
1871 EXPECT_TRUE(ran_completion_callback_);
1872 #endif
1841 } 1873 }
1842 1874
1843 TEST_F(SSLClientSocketTest, CipherSuiteDisables) { 1875 TEST_F(SSLClientSocketTest, CipherSuiteDisables) {
1844 // Rather than exhaustively disabling every RC4 ciphersuite defined at 1876 // Rather than exhaustively disabling every RC4 ciphersuite defined at
1845 // http://www.iana.org/assignments/tls-parameters/tls-parameters.xml, 1877 // http://www.iana.org/assignments/tls-parameters/tls-parameters.xml,
1846 // only disabling those cipher suites that the test server actually 1878 // only disabling those cipher suites that the test server actually
1847 // implements. 1879 // implements.
1848 const uint16 kCiphersToDisable[] = {0x0005, // TLS_RSA_WITH_RC4_128_SHA 1880 const uint16 kCiphersToDisable[] = {0x0005, // TLS_RSA_WITH_RC4_128_SHA
1849 }; 1881 };
1850 1882
(...skipping 668 matching lines...) Expand 10 before | Expand all | Expand 10 after
2519 2551
2520 // TODO(haavardm@opera.com): Due to differences in threading, Linux returns 2552 // TODO(haavardm@opera.com): Due to differences in threading, Linux returns
2521 // ERR_UNEXPECTED while Mac and Windows return ERR_PROTOCOL_ERROR. Accept all 2553 // ERR_UNEXPECTED while Mac and Windows return ERR_PROTOCOL_ERROR. Accept all
2522 // error codes for now. 2554 // error codes for now.
2523 // http://crbug.com/373670 2555 // http://crbug.com/373670
2524 EXPECT_NE(OK, rv); 2556 EXPECT_NE(OK, rv);
2525 EXPECT_FALSE(sock_->IsConnected()); 2557 EXPECT_FALSE(sock_->IsConnected());
2526 } 2558 }
2527 2559
2528 } // namespace net 2560 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698