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

Side by Side Diff: net/socket/ssl_client_socket_mac.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: rebased 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
« no previous file with comments | « net/socket/ssl_client_socket_mac.h ('k') | net/socket/ssl_client_socket_nss.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 #include "net/socket/ssl_client_socket_mac.h" 5 #include "net/socket/ssl_client_socket_mac.h"
6 6
7 #include <CoreServices/CoreServices.h> 7 #include <CoreServices/CoreServices.h>
8 #include <netdb.h> 8 #include <netdb.h>
9 #include <sys/socket.h> 9 #include <sys/socket.h>
10 #include <sys/types.h> 10 #include <sys/types.h>
(...skipping 506 matching lines...) Expand 10 before | Expand all | Expand 10 after
517 } 517 }
518 518
519 } // namespace 519 } // namespace
520 520
521 //----------------------------------------------------------------------------- 521 //-----------------------------------------------------------------------------
522 522
523 SSLClientSocketMac::SSLClientSocketMac(ClientSocketHandle* transport_socket, 523 SSLClientSocketMac::SSLClientSocketMac(ClientSocketHandle* transport_socket,
524 const HostPortPair& host_and_port, 524 const HostPortPair& host_and_port,
525 const SSLConfig& ssl_config, 525 const SSLConfig& ssl_config,
526 const SSLClientSocketContext& context) 526 const SSLClientSocketContext& context)
527 : transport_read_callback_(this, 527 : transport_(transport_socket),
528 &SSLClientSocketMac::OnTransportReadComplete),
529 transport_write_callback_(this,
530 &SSLClientSocketMac::OnTransportWriteComplete),
531 transport_(transport_socket),
532 host_and_port_(host_and_port), 528 host_and_port_(host_and_port),
533 ssl_config_(ssl_config), 529 ssl_config_(ssl_config),
534 old_user_connect_callback_(NULL),
535 old_user_read_callback_(NULL),
536 user_write_callback_(NULL),
537 user_read_buf_len_(0), 530 user_read_buf_len_(0),
538 user_write_buf_len_(0), 531 user_write_buf_len_(0),
539 next_handshake_state_(STATE_NONE), 532 next_handshake_state_(STATE_NONE),
540 cert_verifier_(context.cert_verifier), 533 cert_verifier_(context.cert_verifier),
541 renegotiating_(false), 534 renegotiating_(false),
542 client_cert_requested_(false), 535 client_cert_requested_(false),
543 ssl_context_(NULL), 536 ssl_context_(NULL),
544 bytes_read_after_renegotiation_(0), 537 bytes_read_after_renegotiation_(0),
545 pending_send_error_(OK), 538 pending_send_error_(OK),
546 net_log_(transport_socket->socket()->NetLog()) { 539 net_log_(transport_socket->socket()->NetLog()) {
547 // Sort the list of ciphers to disable, since disabling ciphers on Mac 540 // Sort the list of ciphers to disable, since disabling ciphers on Mac
548 // requires subtracting from a list of enabled ciphers while maintaining 541 // requires subtracting from a list of enabled ciphers while maintaining
549 // ordering, as opposed to merely needing to iterate them as with NSS. 542 // ordering, as opposed to merely needing to iterate them as with NSS.
550 sort(ssl_config_.disabled_cipher_suites.begin(), 543 sort(ssl_config_.disabled_cipher_suites.begin(),
551 ssl_config_.disabled_cipher_suites.end()); 544 ssl_config_.disabled_cipher_suites.end());
552 } 545 }
553 546
554 SSLClientSocketMac::~SSLClientSocketMac() { 547 SSLClientSocketMac::~SSLClientSocketMac() {
555 Disconnect(); 548 Disconnect();
556 } 549 }
557 550
558 int SSLClientSocketMac::Connect(OldCompletionCallback* callback) { 551 int SSLClientSocketMac::Connect(const CompletionCallback& callback) {
559 DCHECK(transport_.get()); 552 DCHECK(transport_.get());
560 DCHECK(next_handshake_state_ == STATE_NONE); 553 DCHECK(next_handshake_state_ == STATE_NONE);
561 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); 554 DCHECK(user_connect_callback_.is_null());
562 555
563 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); 556 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL);
564 557
565 int rv = InitializeSSLContext();
566 if (rv != OK) {
567 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv);
568 return rv;
569 }
570
571 next_handshake_state_ = STATE_HANDSHAKE;
572 rv = DoHandshakeLoop(OK);
573 if (rv == ERR_IO_PENDING) {
574 old_user_connect_callback_ = callback;
575 } else {
576 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv);
577 }
578 return rv;
579 }
580 int SSLClientSocketMac::Connect(const CompletionCallback& callback) {
581 DCHECK(transport_.get());
582 DCHECK(next_handshake_state_ == STATE_NONE);
583 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null());
584
585 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL);
586
587 int rv = InitializeSSLContext(); 558 int rv = InitializeSSLContext();
588 if (rv != OK) { 559 if (rv != OK) {
589 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); 560 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv);
590 return rv; 561 return rv;
591 } 562 }
592 563
593 next_handshake_state_ = STATE_HANDSHAKE; 564 next_handshake_state_ = STATE_HANDSHAKE;
594 rv = DoHandshakeLoop(OK); 565 rv = DoHandshakeLoop(OK);
595 if (rv == ERR_IO_PENDING) { 566 if (rv == ERR_IO_PENDING) {
596 user_connect_callback_ = callback; 567 user_connect_callback_ = callback;
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
691 662
692 base::TimeDelta SSLClientSocketMac::GetConnectTimeMicros() const { 663 base::TimeDelta SSLClientSocketMac::GetConnectTimeMicros() const {
693 if (transport_.get() && transport_->socket()) { 664 if (transport_.get() && transport_->socket()) {
694 return transport_->socket()->GetConnectTimeMicros(); 665 return transport_->socket()->GetConnectTimeMicros();
695 } 666 }
696 NOTREACHED(); 667 NOTREACHED();
697 return base::TimeDelta::FromMicroseconds(-1); 668 return base::TimeDelta::FromMicroseconds(-1);
698 } 669 }
699 670
700 int SSLClientSocketMac::Read(IOBuffer* buf, int buf_len, 671 int SSLClientSocketMac::Read(IOBuffer* buf, int buf_len,
701 OldCompletionCallback* callback) { 672 const CompletionCallback& callback) {
702 DCHECK(completed_handshake()); 673 DCHECK(completed_handshake());
703 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null()); 674 DCHECK(user_read_callback_.is_null());
704 DCHECK(!user_read_buf_); 675 DCHECK(!user_read_buf_);
705 676
706 user_read_buf_ = buf; 677 user_read_buf_ = buf;
707 user_read_buf_len_ = buf_len;
708
709 int rv = DoPayloadRead();
710 if (rv == ERR_IO_PENDING) {
711 old_user_read_callback_ = callback;
712 } else {
713 user_read_buf_ = NULL;
714 user_read_buf_len_ = 0;
715 }
716 return rv;
717 }
718 int SSLClientSocketMac::Read(IOBuffer* buf, int buf_len,
719 const CompletionCallback& callback) {
720 DCHECK(completed_handshake());
721 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null());
722 DCHECK(!user_read_buf_);
723
724 user_read_buf_ = buf;
725 user_read_buf_len_ = buf_len; 678 user_read_buf_len_ = buf_len;
726 679
727 int rv = DoPayloadRead(); 680 int rv = DoPayloadRead();
728 if (rv == ERR_IO_PENDING) { 681 if (rv == ERR_IO_PENDING) {
729 user_read_callback_ = callback; 682 user_read_callback_ = callback;
730 } else { 683 } else {
731 user_read_buf_ = NULL; 684 user_read_buf_ = NULL;
732 user_read_buf_len_ = 0; 685 user_read_buf_len_ = 0;
733 } 686 }
734 return rv; 687 return rv;
735 } 688 }
736 689
737 int SSLClientSocketMac::Write(IOBuffer* buf, int buf_len, 690 int SSLClientSocketMac::Write(IOBuffer* buf, int buf_len,
738 OldCompletionCallback* callback) { 691 const CompletionCallback& callback) {
739 DCHECK(completed_handshake()); 692 DCHECK(completed_handshake());
740 DCHECK(!user_write_callback_); 693 DCHECK(user_write_callback_.is_null());
741 DCHECK(!user_write_buf_); 694 DCHECK(!user_write_buf_);
742 695
743 user_write_buf_ = buf; 696 user_write_buf_ = buf;
744 user_write_buf_len_ = buf_len; 697 user_write_buf_len_ = buf_len;
745 698
746 int rv = DoPayloadWrite(); 699 int rv = DoPayloadWrite();
747 if (rv == ERR_IO_PENDING) { 700 if (rv == ERR_IO_PENDING) {
748 user_write_callback_ = callback; 701 user_write_callback_ = callback;
749 } else { 702 } else {
750 user_write_buf_ = NULL; 703 user_write_buf_ = NULL;
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
929 // own copy. 882 // own copy.
930 status = SSLSetPeerID(ssl_context_, peer_id.data(), peer_id.length()); 883 status = SSLSetPeerID(ssl_context_, peer_id.data(), peer_id.length());
931 if (status) 884 if (status)
932 return NetErrorFromOSStatus(status); 885 return NetErrorFromOSStatus(status);
933 886
934 return OK; 887 return OK;
935 } 888 }
936 889
937 void SSLClientSocketMac::DoConnectCallback(int rv) { 890 void SSLClientSocketMac::DoConnectCallback(int rv) {
938 DCHECK(rv != ERR_IO_PENDING); 891 DCHECK(rv != ERR_IO_PENDING);
939 DCHECK(old_user_connect_callback_ || !user_connect_callback_.is_null()); 892 DCHECK(!user_connect_callback_.is_null());
940 893
941 if (old_user_connect_callback_) { 894 CompletionCallback c = user_connect_callback_;
942 OldCompletionCallback* c = old_user_connect_callback_; 895 user_connect_callback_.Reset();
943 old_user_connect_callback_ = NULL; 896 c.Run(rv > OK ? OK : rv);
944 c->Run(rv > OK ? OK : rv);
945 } else {
946 CompletionCallback c = user_connect_callback_;
947 user_connect_callback_.Reset();
948 c.Run(rv > OK ? OK : rv);
949 }
950 } 897 }
951 898
952 void SSLClientSocketMac::DoReadCallback(int rv) { 899 void SSLClientSocketMac::DoReadCallback(int rv) {
953 DCHECK(rv != ERR_IO_PENDING); 900 DCHECK(rv != ERR_IO_PENDING);
954 DCHECK(old_user_read_callback_ || !user_read_callback_.is_null()); 901 DCHECK(!user_read_callback_.is_null());
955 902
956 // Since Run may result in Read being called, clear user_read_callback_ up 903 // Since Run may result in Read being called, clear user_read_callback_ up
957 // front. 904 // front.
958 if (old_user_read_callback_) { 905 CompletionCallback c = user_read_callback_;
959 OldCompletionCallback* c = old_user_read_callback_; 906 user_read_callback_.Reset();
960 old_user_read_callback_ = NULL; 907 user_read_buf_ = NULL;
961 user_read_buf_ = NULL; 908 user_read_buf_len_ = 0;
962 user_read_buf_len_ = 0; 909 c.Run(rv);
963 c->Run(rv);
964 } else {
965 CompletionCallback c = user_read_callback_;
966 user_read_callback_.Reset();
967 user_read_buf_ = NULL;
968 user_read_buf_len_ = 0;
969 c.Run(rv);
970 }
971 } 910 }
972 911
973 void SSLClientSocketMac::DoWriteCallback(int rv) { 912 void SSLClientSocketMac::DoWriteCallback(int rv) {
974 DCHECK(rv != ERR_IO_PENDING); 913 DCHECK(rv != ERR_IO_PENDING);
975 DCHECK(user_write_callback_); 914 DCHECK(!user_write_callback_.is_null());
976 915
977 // Since Run may result in Write being called, clear user_write_callback_ up 916 // Since Run may result in Write being called, clear user_write_callback_ up
978 // front. 917 // front.
979 OldCompletionCallback* c = user_write_callback_; 918 CompletionCallback c = user_write_callback_;
980 user_write_callback_ = NULL; 919 user_write_callback_.Reset();
981 user_write_buf_ = NULL; 920 user_write_buf_ = NULL;
982 user_write_buf_len_ = 0; 921 user_write_buf_len_ = 0;
983 c->Run(rv); 922 c.Run(rv);
984 } 923 }
985 924
986 void SSLClientSocketMac::OnHandshakeIOComplete(int result) { 925 void SSLClientSocketMac::OnHandshakeIOComplete(int result) {
987 int rv = DoHandshakeLoop(result); 926 int rv = DoHandshakeLoop(result);
988 if (rv != ERR_IO_PENDING) { 927 if (rv != ERR_IO_PENDING) {
989 // If there is no connect callback available to call, we are 928 // If there is no connect callback available to call, we are
990 // renegotiating (which occurs because we are in the middle of a Read 929 // renegotiating (which occurs because we are in the middle of a Read
991 // when the renegotiation process starts). So we complete the Read 930 // when the renegotiation process starts). So we complete the Read
992 // here. 931 // here.
993 if (!old_user_connect_callback_ && user_connect_callback_.is_null()) { 932 if (user_connect_callback_.is_null()) {
994 DoReadCallback(rv); 933 DoReadCallback(rv);
995 return; 934 return;
996 } 935 }
997 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); 936 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv);
998 DoConnectCallback(rv); 937 DoConnectCallback(rv);
999 } 938 }
1000 } 939 }
1001 940
1002 void SSLClientSocketMac::OnTransportReadComplete(int result) { 941 void SSLClientSocketMac::OnTransportReadComplete(int result) {
1003 if (result > 0) { 942 if (result > 0) {
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after
1321 // The user had a read in progress, which was interrupted by the 1260 // The user had a read in progress, which was interrupted by the
1322 // renegotiation. Return the application data that was processed after the 1261 // renegotiation. Return the application data that was processed after the
1323 // handshake completed. 1262 // handshake completed.
1324 next_handshake_state_ = STATE_COMPLETED_HANDSHAKE; 1263 next_handshake_state_ = STATE_COMPLETED_HANDSHAKE;
1325 if (result != OK) 1264 if (result != OK)
1326 return result; 1265 return result;
1327 return bytes_read_after_renegotiation_; 1266 return bytes_read_after_renegotiation_;
1328 } 1267 }
1329 1268
1330 void SSLClientSocketMac::DidCompleteRenegotiation() { 1269 void SSLClientSocketMac::DidCompleteRenegotiation() {
1331 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); 1270 DCHECK(user_connect_callback_.is_null());
1332 renegotiating_ = false; 1271 renegotiating_ = false;
1333 next_handshake_state_ = STATE_COMPLETED_RENEGOTIATION; 1272 next_handshake_state_ = STATE_COMPLETED_RENEGOTIATION;
1334 } 1273 }
1335 1274
1336 int SSLClientSocketMac::DidCompleteHandshake() { 1275 int SSLClientSocketMac::DidCompleteHandshake() {
1337 DCHECK(!server_cert_ || renegotiating_); 1276 DCHECK(!server_cert_ || renegotiating_);
1338 VLOG(1) << "Handshake completed, next verify cert"; 1277 VLOG(1) << "Handshake completed, next verify cert";
1339 1278
1340 scoped_refptr<X509Certificate> new_server_cert( 1279 scoped_refptr<X509Certificate> new_server_cert(
1341 GetServerCert(ssl_context_)); 1280 GetServerCert(ssl_context_));
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
1401 us->renegotiating_ = true; 1340 us->renegotiating_ = true;
1402 return errSSLWouldBlock; 1341 return errSSLWouldBlock;
1403 } 1342 }
1404 } 1343 }
1405 1344
1406 size_t total_read = us->recv_buffer_.size(); 1345 size_t total_read = us->recv_buffer_.size();
1407 1346
1408 int rv = 1; // any old value to spin the loop below 1347 int rv = 1; // any old value to spin the loop below
1409 while (rv > 0 && total_read < *data_length) { 1348 while (rv > 0 && total_read < *data_length) {
1410 us->read_io_buf_ = new IOBuffer(*data_length - total_read); 1349 us->read_io_buf_ = new IOBuffer(*data_length - total_read);
1411 rv = us->transport_->socket()->Read(us->read_io_buf_, 1350 rv = us->transport_->socket()->Read(
1412 *data_length - total_read, 1351 us->read_io_buf_,
1413 &us->transport_read_callback_); 1352 *data_length - total_read,
1353 base::Bind(&SSLClientSocketMac::OnTransportReadComplete,
1354 base::Unretained(us)));
1414 1355
1415 if (rv >= 0) { 1356 if (rv >= 0) {
1416 us->recv_buffer_.insert(us->recv_buffer_.end(), 1357 us->recv_buffer_.insert(us->recv_buffer_.end(),
1417 us->read_io_buf_->data(), 1358 us->read_io_buf_->data(),
1418 us->read_io_buf_->data() + rv); 1359 us->read_io_buf_->data() + rv);
1419 us->read_io_buf_ = NULL; 1360 us->read_io_buf_ = NULL;
1420 total_read += rv; 1361 total_read += rv;
1421 } 1362 }
1422 } 1363 }
1423 1364
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1463 // new data when it sees that data remains in the buffer after removing the 1404 // new data when it sees that data remains in the buffer after removing the
1464 // sent data. As always, lie to our caller. 1405 // sent data. As always, lie to our caller.
1465 return noErr; 1406 return noErr;
1466 } 1407 }
1467 1408
1468 int rv; 1409 int rv;
1469 do { 1410 do {
1470 us->write_io_buf_ = new IOBuffer(us->send_buffer_.size()); 1411 us->write_io_buf_ = new IOBuffer(us->send_buffer_.size());
1471 memcpy(us->write_io_buf_->data(), &us->send_buffer_[0], 1412 memcpy(us->write_io_buf_->data(), &us->send_buffer_[0],
1472 us->send_buffer_.size()); 1413 us->send_buffer_.size());
1473 rv = us->transport_->socket()->Write(us->write_io_buf_, 1414 rv = us->transport_->socket()->Write(
1474 us->send_buffer_.size(), 1415 us->write_io_buf_,
1475 &us->transport_write_callback_); 1416 us->send_buffer_.size(),
1417 base::Bind(&SSLClientSocketMac::OnTransportWriteComplete,
1418 base::Unretained(us)));
1476 if (rv > 0) { 1419 if (rv > 0) {
1477 us->send_buffer_.erase(us->send_buffer_.begin(), 1420 us->send_buffer_.erase(us->send_buffer_.begin(),
1478 us->send_buffer_.begin() + rv); 1421 us->send_buffer_.begin() + rv);
1479 us->write_io_buf_ = NULL; 1422 us->write_io_buf_ = NULL;
1480 } 1423 }
1481 } while (rv > 0 && !us->send_buffer_.empty()); 1424 } while (rv > 0 && !us->send_buffer_.empty());
1482 1425
1483 if (rv < 0 && rv != ERR_IO_PENDING) { 1426 if (rv < 0 && rv != ERR_IO_PENDING) {
1484 us->write_io_buf_ = NULL; 1427 us->write_io_buf_ = NULL;
1485 return OSStatusFromNetError(rv); 1428 return OSStatusFromNetError(rv);
1486 } 1429 }
1487 1430
1488 // always lie to our caller 1431 // always lie to our caller
1489 return noErr; 1432 return noErr;
1490 } 1433 }
1491 1434
1492 } // namespace net 1435 } // namespace net
OLDNEW
« no previous file with comments | « net/socket/ssl_client_socket_mac.h ('k') | net/socket/ssl_client_socket_nss.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698