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

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

Issue 8824006: Migrate net/socket/socket.h, net/socket/stream_socket.h to base::Bind(). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: small win fix Created 9 years 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 // This file includes code SSLClientSocketNSS::DoVerifyCertComplete() derived 5 // This file includes code SSLClientSocketNSS::DoVerifyCertComplete() derived
6 // from AuthCertificateCallback() in 6 // from AuthCertificateCallback() in
7 // mozilla/security/manager/ssl/src/nsNSSCallbacks.cpp. 7 // mozilla/security/manager/ssl/src/nsNSSCallbacks.cpp.
8 8
9 /* ***** BEGIN LICENSE BLOCK ***** 9 /* ***** BEGIN LICENSE BLOCK *****
10 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 10 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after
425 return r; 425 return r;
426 } 426 }
427 427
428 } // namespace 428 } // namespace
429 429
430 SSLClientSocketNSS::SSLClientSocketNSS(ClientSocketHandle* transport_socket, 430 SSLClientSocketNSS::SSLClientSocketNSS(ClientSocketHandle* transport_socket,
431 const HostPortPair& host_and_port, 431 const HostPortPair& host_and_port,
432 const SSLConfig& ssl_config, 432 const SSLConfig& ssl_config,
433 SSLHostInfo* ssl_host_info, 433 SSLHostInfo* ssl_host_info,
434 const SSLClientSocketContext& context) 434 const SSLClientSocketContext& context)
435 : ALLOW_THIS_IN_INITIALIZER_LIST(buffer_send_callback_( 435 : transport_send_busy_(false),
436 this, &SSLClientSocketNSS::BufferSendComplete)),
437 ALLOW_THIS_IN_INITIALIZER_LIST(buffer_recv_callback_(
438 this, &SSLClientSocketNSS::BufferRecvComplete)),
439 transport_send_busy_(false),
440 transport_recv_busy_(false), 436 transport_recv_busy_(false),
441 corked_(false), 437 corked_(false),
442 ALLOW_THIS_IN_INITIALIZER_LIST(handshake_io_callback_(
443 base::Bind(&SSLClientSocketNSS::OnHandshakeIOComplete,
444 base::Unretained(this)))),
445 transport_(transport_socket), 438 transport_(transport_socket),
446 host_and_port_(host_and_port), 439 host_and_port_(host_and_port),
447 ssl_config_(ssl_config), 440 ssl_config_(ssl_config),
448 old_user_connect_callback_(NULL),
449 old_user_read_callback_(NULL),
450 user_write_callback_(NULL),
451 user_read_buf_len_(0), 441 user_read_buf_len_(0),
452 user_write_buf_len_(0), 442 user_write_buf_len_(0),
453 server_cert_nss_(NULL), 443 server_cert_nss_(NULL),
454 server_cert_verify_result_(NULL), 444 server_cert_verify_result_(NULL),
455 ssl_connection_status_(0), 445 ssl_connection_status_(0),
456 client_auth_cert_needed_(false), 446 client_auth_cert_needed_(false),
457 cert_verifier_(context.cert_verifier), 447 cert_verifier_(context.cert_verifier),
458 ob_cert_xtn_negotiated_(false), 448 ob_cert_xtn_negotiated_(false),
459 origin_bound_cert_service_(context.origin_bound_cert_service), 449 origin_bound_cert_service_(context.origin_bound_cert_service),
460 ob_cert_request_handle_(NULL), 450 ob_cert_request_handle_(NULL),
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
564 } 554 }
565 555
566 SSLClientSocket::NextProtoStatus 556 SSLClientSocket::NextProtoStatus
567 SSLClientSocketNSS::GetNextProto(std::string* proto, 557 SSLClientSocketNSS::GetNextProto(std::string* proto,
568 std::string* server_protos) { 558 std::string* server_protos) {
569 *proto = next_proto_; 559 *proto = next_proto_;
570 *server_protos = server_protos_; 560 *server_protos = server_protos_;
571 return next_proto_status_; 561 return next_proto_status_;
572 } 562 }
573 563
574 int SSLClientSocketNSS::Connect(OldCompletionCallback* callback) {
575 EnterFunction("");
576 DCHECK(transport_.get());
577 DCHECK(next_handshake_state_ == STATE_NONE);
578 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null());
579 DCHECK(!user_write_callback_);
580 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null());
581 DCHECK(!user_read_buf_);
582 DCHECK(!user_write_buf_);
583
584 EnsureThreadIdAssigned();
585
586 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL);
587
588 int rv = Init();
589 if (rv != OK) {
590 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv);
591 return rv;
592 }
593
594 rv = InitializeSSLOptions();
595 if (rv != OK) {
596 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv);
597 return rv;
598 }
599
600 rv = InitializeSSLPeerName();
601 if (rv != OK) {
602 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv);
603 return rv;
604 }
605
606 if (ssl_config_.cached_info_enabled && ssl_host_info_.get()) {
607 GotoState(STATE_LOAD_SSL_HOST_INFO);
608 } else {
609 GotoState(STATE_HANDSHAKE);
610 }
611
612 rv = DoHandshakeLoop(OK);
613 if (rv == ERR_IO_PENDING) {
614 old_user_connect_callback_ = callback;
615 } else {
616 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv);
617 }
618
619 LeaveFunction("");
620 return rv > OK ? OK : rv;
621 }
622 int SSLClientSocketNSS::Connect(const CompletionCallback& callback) { 564 int SSLClientSocketNSS::Connect(const CompletionCallback& callback) {
623 EnterFunction(""); 565 EnterFunction("");
624 DCHECK(transport_.get()); 566 DCHECK(transport_.get());
625 DCHECK(next_handshake_state_ == STATE_NONE); 567 DCHECK(next_handshake_state_ == STATE_NONE);
626 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null()); 568 DCHECK(user_read_callback_.is_null());
627 DCHECK(!user_write_callback_); 569 DCHECK(user_write_callback_.is_null());
628 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); 570 DCHECK(user_connect_callback_.is_null());
629 DCHECK(!user_read_buf_); 571 DCHECK(!user_read_buf_);
630 DCHECK(!user_write_buf_); 572 DCHECK(!user_write_buf_);
631 573
632 EnsureThreadIdAssigned(); 574 EnsureThreadIdAssigned();
633 575
634 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); 576 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL);
635 577
636 int rv = Init(); 578 int rv = Init();
637 if (rv != OK) { 579 if (rv != OK) {
638 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); 580 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv);
(...skipping 27 matching lines...) Expand all
666 608
667 LeaveFunction(""); 609 LeaveFunction("");
668 return rv > OK ? OK : rv; 610 return rv > OK ? OK : rv;
669 } 611 }
670 612
671 void SSLClientSocketNSS::Disconnect() { 613 void SSLClientSocketNSS::Disconnect() {
672 EnterFunction(""); 614 EnterFunction("");
673 615
674 CHECK(CalledOnValidThread()); 616 CHECK(CalledOnValidThread());
675 617
676 // Shut down anything that may call us back (through buffer_send_callback_, 618 // Shut down anything that may call us back.
677 // buffer_recv_callback, or handshake_io_callback_).
678 verifier_.reset(); 619 verifier_.reset();
679 transport_->socket()->Disconnect(); 620 transport_->socket()->Disconnect();
680 621
681 if (ob_cert_request_handle_ != NULL) { 622 if (ob_cert_request_handle_ != NULL) {
682 origin_bound_cert_service_->CancelRequest(ob_cert_request_handle_); 623 origin_bound_cert_service_->CancelRequest(ob_cert_request_handle_);
683 ob_cert_request_handle_ = NULL; 624 ob_cert_request_handle_ = NULL;
684 } 625 }
685 626
686 // TODO(wtc): Send SSL close_notify alert. 627 // TODO(wtc): Send SSL close_notify alert.
687 if (nss_fd_ != NULL) { 628 if (nss_fd_ != NULL) {
688 PR_Close(nss_fd_); 629 PR_Close(nss_fd_);
689 nss_fd_ = NULL; 630 nss_fd_ = NULL;
690 } 631 }
691 632
692 // Reset object state 633 // Reset object state.
634 user_connect_callback_.Reset();
635 user_read_callback_.Reset();
636 user_write_callback_.Reset();
693 transport_send_busy_ = false; 637 transport_send_busy_ = false;
694 transport_recv_busy_ = false; 638 transport_recv_busy_ = false;
695 old_user_connect_callback_ = NULL;
696 user_connect_callback_.Reset();
697 old_user_read_callback_ = NULL;
698 user_read_callback_.Reset();
699 user_write_callback_ = NULL;
700 user_read_buf_ = NULL; 639 user_read_buf_ = NULL;
701 user_read_buf_len_ = 0; 640 user_read_buf_len_ = 0;
702 user_write_buf_ = NULL; 641 user_write_buf_ = NULL;
703 user_write_buf_len_ = 0; 642 user_write_buf_len_ = 0;
704 server_cert_ = NULL; 643 server_cert_ = NULL;
705 if (server_cert_nss_) { 644 if (server_cert_nss_) {
706 CERT_DestroyCertificate(server_cert_nss_); 645 CERT_DestroyCertificate(server_cert_nss_);
707 server_cert_nss_ = NULL; 646 server_cert_nss_ = NULL;
708 } 647 }
709 local_server_cert_verify_result_.Reset(); 648 local_server_cert_verify_result_.Reset();
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
804 743
805 base::TimeDelta SSLClientSocketNSS::GetConnectTimeMicros() const { 744 base::TimeDelta SSLClientSocketNSS::GetConnectTimeMicros() const {
806 if (transport_.get() && transport_->socket()) { 745 if (transport_.get() && transport_->socket()) {
807 return transport_->socket()->GetConnectTimeMicros(); 746 return transport_->socket()->GetConnectTimeMicros();
808 } 747 }
809 NOTREACHED(); 748 NOTREACHED();
810 return base::TimeDelta::FromMicroseconds(-1); 749 return base::TimeDelta::FromMicroseconds(-1);
811 } 750 }
812 751
813 int SSLClientSocketNSS::Read(IOBuffer* buf, int buf_len, 752 int SSLClientSocketNSS::Read(IOBuffer* buf, int buf_len,
814 OldCompletionCallback* callback) {
815 EnterFunction(buf_len);
816 DCHECK(completed_handshake_);
817 DCHECK(next_handshake_state_ == STATE_NONE);
818 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null());
819 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null());
820 DCHECK(!user_read_buf_);
821 DCHECK(nss_bufs_);
822
823 user_read_buf_ = buf;
824 user_read_buf_len_ = buf_len;
825
826 int rv = DoReadLoop(OK);
827
828 if (rv == ERR_IO_PENDING) {
829 old_user_read_callback_ = callback;
830 } else {
831 user_read_buf_ = NULL;
832 user_read_buf_len_ = 0;
833 }
834 LeaveFunction(rv);
835 return rv;
836 }
837 int SSLClientSocketNSS::Read(IOBuffer* buf, int buf_len,
838 const CompletionCallback& callback) { 753 const CompletionCallback& callback) {
839 EnterFunction(buf_len); 754 EnterFunction(buf_len);
840 DCHECK(completed_handshake_); 755 DCHECK(completed_handshake_);
841 DCHECK(next_handshake_state_ == STATE_NONE); 756 DCHECK(next_handshake_state_ == STATE_NONE);
842 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null()); 757 DCHECK(user_read_callback_.is_null());
843 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); 758 DCHECK(user_connect_callback_.is_null());
844 DCHECK(!user_read_buf_); 759 DCHECK(!user_read_buf_);
845 DCHECK(nss_bufs_); 760 DCHECK(nss_bufs_);
846 761
847 user_read_buf_ = buf; 762 user_read_buf_ = buf;
848 user_read_buf_len_ = buf_len; 763 user_read_buf_len_ = buf_len;
849 764
850 int rv = DoReadLoop(OK); 765 int rv = DoReadLoop(OK);
851 766
852 if (rv == ERR_IO_PENDING) { 767 if (rv == ERR_IO_PENDING) {
853 user_read_callback_ = callback; 768 user_read_callback_ = callback;
854 } else { 769 } else {
855 user_read_buf_ = NULL; 770 user_read_buf_ = NULL;
856 user_read_buf_len_ = 0; 771 user_read_buf_len_ = 0;
857 } 772 }
858 LeaveFunction(rv); 773 LeaveFunction(rv);
859 return rv; 774 return rv;
860 } 775 }
861 776
862 int SSLClientSocketNSS::Write(IOBuffer* buf, int buf_len, 777 int SSLClientSocketNSS::Write(IOBuffer* buf, int buf_len,
863 OldCompletionCallback* callback) { 778 const CompletionCallback& callback) {
864 EnterFunction(buf_len); 779 EnterFunction(buf_len);
865 DCHECK(completed_handshake_); 780 DCHECK(completed_handshake_);
866 DCHECK(next_handshake_state_ == STATE_NONE); 781 DCHECK(next_handshake_state_ == STATE_NONE);
867 DCHECK(!user_write_callback_); 782 DCHECK(user_write_callback_.is_null());
868 DCHECK(!old_user_connect_callback_); 783 DCHECK(user_connect_callback_.is_null());
869 DCHECK(!user_write_buf_); 784 DCHECK(!user_write_buf_);
870 DCHECK(nss_bufs_); 785 DCHECK(nss_bufs_);
871 786
872 user_write_buf_ = buf; 787 user_write_buf_ = buf;
873 user_write_buf_len_ = buf_len; 788 user_write_buf_len_ = buf_len;
874 789
875 if (corked_) { 790 if (corked_) {
876 corked_ = false; 791 corked_ = false;
877 uncork_timer_.Reset(); 792 uncork_timer_.Reset();
878 } 793 }
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after
1217 } 1132 }
1218 #endif 1133 #endif
1219 1134
1220 if (ssl_config_.ssl3_fallback) 1135 if (ssl_config_.ssl3_fallback)
1221 ssl_connection_status_ |= SSL_CONNECTION_SSL3_FALLBACK; 1136 ssl_connection_status_ |= SSL_CONNECTION_SSL3_FALLBACK;
1222 } 1137 }
1223 1138
1224 void SSLClientSocketNSS::DoReadCallback(int rv) { 1139 void SSLClientSocketNSS::DoReadCallback(int rv) {
1225 EnterFunction(rv); 1140 EnterFunction(rv);
1226 DCHECK(rv != ERR_IO_PENDING); 1141 DCHECK(rv != ERR_IO_PENDING);
1227 DCHECK(old_user_read_callback_ || user_read_callback_.is_null()); 1142 DCHECK(!user_read_callback_.is_null());
1228 1143
1229 // Since Run may result in Read being called, clear |old_user_read_callback_| 1144 // Since Run may result in Read being called, clear |user_read_callback_|
1230 // up front. 1145 // up front.
1231 if (old_user_read_callback_) { 1146 CompletionCallback c = user_read_callback_;
1232 OldCompletionCallback* c = old_user_read_callback_; 1147 user_read_callback_.Reset();
1233 old_user_read_callback_ = NULL; 1148 user_read_buf_ = NULL;
1234 user_read_buf_ = NULL; 1149 user_read_buf_len_ = 0;
1235 user_read_buf_len_ = 0; 1150 c.Run(rv);
1236 c->Run(rv);
1237 } else {
1238 CompletionCallback c = user_read_callback_;
1239 user_read_callback_.Reset();
1240 user_read_buf_ = NULL;
1241 user_read_buf_len_ = 0;
1242 c.Run(rv);
1243 }
1244 LeaveFunction(""); 1151 LeaveFunction("");
1245 } 1152 }
1246 1153
1247 void SSLClientSocketNSS::DoWriteCallback(int rv) { 1154 void SSLClientSocketNSS::DoWriteCallback(int rv) {
1248 EnterFunction(rv); 1155 EnterFunction(rv);
1249 DCHECK(rv != ERR_IO_PENDING); 1156 DCHECK(rv != ERR_IO_PENDING);
1250 DCHECK(user_write_callback_); 1157 DCHECK(!user_write_callback_.is_null());
1251 1158
1252 // Since Run may result in Write being called, clear |user_write_callback_| 1159 // Since Run may result in Write being called, clear |user_write_callback_|
1253 // up front. 1160 // up front.
1254 OldCompletionCallback* c = user_write_callback_; 1161 CompletionCallback c = user_write_callback_;
1255 user_write_callback_ = NULL; 1162 user_write_callback_.Reset();
1256 user_write_buf_ = NULL; 1163 user_write_buf_ = NULL;
1257 user_write_buf_len_ = 0; 1164 user_write_buf_len_ = 0;
1258 c->Run(rv); 1165 c.Run(rv);
1259 LeaveFunction(""); 1166 LeaveFunction("");
1260 } 1167 }
1261 1168
1262 // As part of Connect(), the SSLClientSocketNSS object performs an SSL 1169 // As part of Connect(), the SSLClientSocketNSS object performs an SSL
1263 // handshake. This requires network IO, which in turn calls 1170 // handshake. This requires network IO, which in turn calls
1264 // BufferRecvComplete() with a non-zero byte count. This byte count eventually 1171 // BufferRecvComplete() with a non-zero byte count. This byte count eventually
1265 // winds its way through the state machine and ends up being passed to the 1172 // winds its way through the state machine and ends up being passed to the
1266 // callback. For Read() and Write(), that's what we want. But for Connect(), 1173 // callback. For Read() and Write(), that's what we want. But for Connect(),
1267 // the caller expects OK (i.e. 0) for success. 1174 // the caller expects OK (i.e. 0) for success.
1268 // 1175 //
1269 void SSLClientSocketNSS::DoConnectCallback(int rv) { 1176 void SSLClientSocketNSS::DoConnectCallback(int rv) {
1270 EnterFunction(rv); 1177 EnterFunction(rv);
1271 DCHECK_NE(rv, ERR_IO_PENDING); 1178 DCHECK_NE(rv, ERR_IO_PENDING);
1272 DCHECK(old_user_connect_callback_ || !user_connect_callback_.is_null()); 1179 DCHECK(!user_connect_callback_.is_null());
1273 1180
1274 if (old_user_connect_callback_) { 1181 CompletionCallback c = user_connect_callback_;
1275 OldCompletionCallback* c = old_user_connect_callback_; 1182 user_connect_callback_.Reset();
1276 old_user_connect_callback_ = NULL; 1183 c.Run(rv > OK ? OK : rv);
1277 c->Run(rv > OK ? OK : rv);
1278 } else {
1279 CompletionCallback c = user_connect_callback_;
1280 user_connect_callback_.Reset();
1281 c.Run(rv > OK ? OK : rv);
1282 }
1283 LeaveFunction(""); 1184 LeaveFunction("");
1284 } 1185 }
1285 1186
1286 void SSLClientSocketNSS::OnHandshakeIOComplete(int result) { 1187 void SSLClientSocketNSS::OnHandshakeIOComplete(int result) {
1287 EnterFunction(result); 1188 EnterFunction(result);
1288 int rv = DoHandshakeLoop(result); 1189 int rv = DoHandshakeLoop(result);
1289 if (rv != ERR_IO_PENDING) { 1190 if (rv != ERR_IO_PENDING) {
1290 net_log_.EndEventWithNetErrorCode(net::NetLog::TYPE_SSL_CONNECT, rv); 1191 net_log_.EndEventWithNetErrorCode(net::NetLog::TYPE_SSL_CONNECT, rv);
1291 DoConnectCallback(rv); 1192 DoConnectCallback(rv);
1292 } 1193 }
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
1477 1378
1478 rv = SSL_SetPredictedPeerCertificates(nss_fd_, certs.get(), certs_in.size()); 1379 rv = SSL_SetPredictedPeerCertificates(nss_fd_, certs.get(), certs_in.size());
1479 DestroyCertificates(&certs[0], certs_in.size()); 1380 DestroyCertificates(&certs[0], certs_in.size());
1480 DCHECK_EQ(SECSuccess, rv); 1381 DCHECK_EQ(SECSuccess, rv);
1481 1382
1482 return true; 1383 return true;
1483 } 1384 }
1484 1385
1485 int SSLClientSocketNSS::DoLoadSSLHostInfo() { 1386 int SSLClientSocketNSS::DoLoadSSLHostInfo() {
1486 EnterFunction(""); 1387 EnterFunction("");
1487 int rv = ssl_host_info_->WaitForDataReady(handshake_io_callback_); 1388 int rv = ssl_host_info_->WaitForDataReady(
1389 base::Bind(&SSLClientSocketNSS::OnHandshakeIOComplete,
1390 base::Unretained(this)));
1488 GotoState(STATE_HANDSHAKE); 1391 GotoState(STATE_HANDSHAKE);
1489 1392
1490 if (rv == OK) { 1393 if (rv == OK) {
1491 if (!LoadSSLHostInfo()) 1394 if (!LoadSSLHostInfo())
1492 LOG(WARNING) << "LoadSSLHostInfo failed: " << host_and_port_.ToString(); 1395 LOG(WARNING) << "LoadSSLHostInfo failed: " << host_and_port_.ToString();
1493 } else { 1396 } else {
1494 DCHECK_EQ(ERR_IO_PENDING, rv); 1397 DCHECK_EQ(ERR_IO_PENDING, rv);
1495 GotoState(STATE_LOAD_SSL_HOST_INFO); 1398 GotoState(STATE_LOAD_SSL_HOST_INFO);
1496 } 1399 }
1497 1400
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after
1786 // chain. So, if the prediction was correct, we should wait for that 1689 // chain. So, if the prediction was correct, we should wait for that
1787 // verification to finish rather than start our own. 1690 // verification to finish rather than start our own.
1788 net_log_.AddEvent(NetLog::TYPE_SSL_VERIFICATION_MERGED, NULL); 1691 net_log_.AddEvent(NetLog::TYPE_SSL_VERIFICATION_MERGED, NULL);
1789 UMA_HISTOGRAM_ENUMERATION("Net.SSLVerificationMerged", 1 /* true */, 2); 1692 UMA_HISTOGRAM_ENUMERATION("Net.SSLVerificationMerged", 1 /* true */, 2);
1790 base::TimeTicks end_time = ssl_host_info_->verification_end_time(); 1693 base::TimeTicks end_time = ssl_host_info_->verification_end_time();
1791 if (end_time.is_null()) 1694 if (end_time.is_null())
1792 end_time = base::TimeTicks::Now(); 1695 end_time = base::TimeTicks::Now();
1793 UMA_HISTOGRAM_TIMES("Net.SSLVerificationMergedMsSaved", 1696 UMA_HISTOGRAM_TIMES("Net.SSLVerificationMergedMsSaved",
1794 end_time - ssl_host_info_->verification_start_time()); 1697 end_time - ssl_host_info_->verification_start_time());
1795 server_cert_verify_result_ = &ssl_host_info_->cert_verify_result(); 1698 server_cert_verify_result_ = &ssl_host_info_->cert_verify_result();
1796 return ssl_host_info_->WaitForCertVerification(handshake_io_callback_); 1699 return ssl_host_info_->WaitForCertVerification(
1700 base::Bind(&SSLClientSocketNSS::OnHandshakeIOComplete,
1701 base::Unretained(this)));
1797 } else { 1702 } else {
1798 UMA_HISTOGRAM_ENUMERATION("Net.SSLVerificationMerged", 0 /* false */, 2); 1703 UMA_HISTOGRAM_ENUMERATION("Net.SSLVerificationMerged", 0 /* false */, 2);
1799 } 1704 }
1800 1705
1801 int flags = 0; 1706 int flags = 0;
1802 if (ssl_config_.rev_checking_enabled) 1707 if (ssl_config_.rev_checking_enabled)
1803 flags |= X509Certificate::VERIFY_REV_CHECKING_ENABLED; 1708 flags |= X509Certificate::VERIFY_REV_CHECKING_ENABLED;
1804 if (ssl_config_.verify_ev_cert) 1709 if (ssl_config_.verify_ev_cert)
1805 flags |= X509Certificate::VERIFY_EV_CERT; 1710 flags |= X509Certificate::VERIFY_EV_CERT;
1806 verifier_.reset(new SingleRequestCertVerifier(cert_verifier_)); 1711 verifier_.reset(new SingleRequestCertVerifier(cert_verifier_));
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
1889 // http://crbug.com/15630 for more info. 1794 // http://crbug.com/15630 for more info.
1890 1795
1891 // TODO(hclam): Skip logging if server cert was expected to be bad because 1796 // TODO(hclam): Skip logging if server cert was expected to be bad because
1892 // |server_cert_verify_results_| doesn't contain all the information about 1797 // |server_cert_verify_results_| doesn't contain all the information about
1893 // the cert. 1798 // the cert.
1894 if (result == OK) 1799 if (result == OK)
1895 LogConnectionTypeMetrics(); 1800 LogConnectionTypeMetrics();
1896 1801
1897 completed_handshake_ = true; 1802 completed_handshake_ = true;
1898 1803
1899 if (old_user_read_callback_ || !user_read_callback_.is_null()) { 1804 if (!user_read_callback_.is_null()) {
1900 int rv = DoReadLoop(OK); 1805 int rv = DoReadLoop(OK);
1901 if (rv != ERR_IO_PENDING) 1806 if (rv != ERR_IO_PENDING)
1902 DoReadCallback(rv); 1807 DoReadCallback(rv);
1903 } 1808 }
1904 1809
1905 // Exit DoHandshakeLoop and return the result to the caller to Connect. 1810 // Exit DoHandshakeLoop and return the result to the caller to Connect.
1906 DCHECK(next_handshake_state_ == STATE_NONE); 1811 DCHECK(next_handshake_state_ == STATE_NONE);
1907 return result; 1812 return result;
1908 } 1813 }
1909 1814
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
2065 const unsigned int len = len1 + len2; 1970 const unsigned int len = len1 + len2;
2066 1971
2067 if (corked_ && len < kRecvBufferSize / 2) 1972 if (corked_ && len < kRecvBufferSize / 2)
2068 return 0; 1973 return 0;
2069 1974
2070 int rv = 0; 1975 int rv = 0;
2071 if (len) { 1976 if (len) {
2072 scoped_refptr<IOBuffer> send_buffer(new IOBuffer(len)); 1977 scoped_refptr<IOBuffer> send_buffer(new IOBuffer(len));
2073 memcpy(send_buffer->data(), buf1, len1); 1978 memcpy(send_buffer->data(), buf1, len1);
2074 memcpy(send_buffer->data() + len1, buf2, len2); 1979 memcpy(send_buffer->data() + len1, buf2, len2);
2075 rv = transport_->socket()->Write(send_buffer, len, 1980 rv = transport_->socket()->Write(
2076 &buffer_send_callback_); 1981 send_buffer, len,
1982 base::Bind(&SSLClientSocketNSS::BufferSendComplete,
1983 base::Unretained(this)));
2077 if (rv == ERR_IO_PENDING) { 1984 if (rv == ERR_IO_PENDING) {
2078 transport_send_busy_ = true; 1985 transport_send_busy_ = true;
2079 } else { 1986 } else {
2080 memio_PutWriteResult(nss_bufs_, MapErrorToNSS(rv)); 1987 memio_PutWriteResult(nss_bufs_, MapErrorToNSS(rv));
2081 } 1988 }
2082 } 1989 }
2083 1990
2084 LeaveFunction(rv); 1991 LeaveFunction(rv);
2085 return rv; 1992 return rv;
2086 } 1993 }
(...skipping 11 matching lines...) Expand all
2098 2005
2099 char *buf; 2006 char *buf;
2100 int nb = memio_GetReadParams(nss_bufs_, &buf); 2007 int nb = memio_GetReadParams(nss_bufs_, &buf);
2101 EnterFunction(nb); 2008 EnterFunction(nb);
2102 int rv; 2009 int rv;
2103 if (!nb) { 2010 if (!nb) {
2104 // buffer too full to read into, so no I/O possible at moment 2011 // buffer too full to read into, so no I/O possible at moment
2105 rv = ERR_IO_PENDING; 2012 rv = ERR_IO_PENDING;
2106 } else { 2013 } else {
2107 recv_buffer_ = new IOBuffer(nb); 2014 recv_buffer_ = new IOBuffer(nb);
2108 rv = transport_->socket()->Read(recv_buffer_, nb, &buffer_recv_callback_); 2015 rv = transport_->socket()->Read(
2016 recv_buffer_, nb,
2017 base::Bind(&SSLClientSocketNSS::BufferRecvComplete,
2018 base::Unretained(this)));
2109 if (rv == ERR_IO_PENDING) { 2019 if (rv == ERR_IO_PENDING) {
2110 transport_recv_busy_ = true; 2020 transport_recv_busy_ = true;
2111 } else { 2021 } else {
2112 if (rv > 0) 2022 if (rv > 0)
2113 memcpy(buf, recv_buffer_->data(), rv); 2023 memcpy(buf, recv_buffer_->data(), rv);
2114 memio_PutReadResult(nss_bufs_, MapErrorToNSS(rv)); 2024 memio_PutReadResult(nss_bufs_, MapErrorToNSS(rv));
2115 recv_buffer_ = NULL; 2025 recv_buffer_ = NULL;
2116 } 2026 }
2117 } 2027 }
2118 LeaveFunction(rv); 2028 LeaveFunction(rv);
(...skipping 635 matching lines...) Expand 10 before | Expand all | Expand 10 after
2754 valid_thread_id_ = base::PlatformThread::CurrentId(); 2664 valid_thread_id_ = base::PlatformThread::CurrentId();
2755 } 2665 }
2756 2666
2757 bool SSLClientSocketNSS::CalledOnValidThread() const { 2667 bool SSLClientSocketNSS::CalledOnValidThread() const {
2758 EnsureThreadIdAssigned(); 2668 EnsureThreadIdAssigned();
2759 base::AutoLock auto_lock(lock_); 2669 base::AutoLock auto_lock(lock_);
2760 return valid_thread_id_ == base::PlatformThread::CurrentId(); 2670 return valid_thread_id_ == base::PlatformThread::CurrentId();
2761 } 2671 }
2762 2672
2763 } // namespace net 2673 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698