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

Side by Side Diff: net/socket/ssl_client_socket_openssl.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_openssl.h ('k') | net/socket/ssl_client_socket_pool.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 // OpenSSL binding for SSLClientSocket. The class layout and general principle 5 // OpenSSL binding for SSLClientSocket. The class layout and general principle
6 // of operation is derived from SSLClientSocketNSS. 6 // of operation is derived from SSLClientSocketNSS.
7 7
8 #include "net/socket/ssl_client_socket_openssl.h" 8 #include "net/socket/ssl_client_socket_openssl.h"
9 9
10 #include <openssl/ssl.h> 10 #include <openssl/ssl.h>
(...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after
377 long clear_mask; 377 long clear_mask;
378 }; 378 };
379 379
380 } // namespace 380 } // namespace
381 381
382 SSLClientSocketOpenSSL::SSLClientSocketOpenSSL( 382 SSLClientSocketOpenSSL::SSLClientSocketOpenSSL(
383 ClientSocketHandle* transport_socket, 383 ClientSocketHandle* transport_socket,
384 const HostPortPair& host_and_port, 384 const HostPortPair& host_and_port,
385 const SSLConfig& ssl_config, 385 const SSLConfig& ssl_config,
386 const SSLClientSocketContext& context) 386 const SSLClientSocketContext& context)
387 : ALLOW_THIS_IN_INITIALIZER_LIST(buffer_send_callback_( 387 : transport_send_busy_(false),
388 this, &SSLClientSocketOpenSSL::BufferSendComplete)),
389 ALLOW_THIS_IN_INITIALIZER_LIST(buffer_recv_callback_(
390 this, &SSLClientSocketOpenSSL::BufferRecvComplete)),
391 transport_send_busy_(false),
392 transport_recv_busy_(false), 388 transport_recv_busy_(false),
393 old_user_connect_callback_(NULL),
394 old_user_read_callback_(NULL),
395 user_write_callback_(NULL),
396 completed_handshake_(false), 389 completed_handshake_(false),
397 client_auth_cert_needed_(false), 390 client_auth_cert_needed_(false),
398 cert_verifier_(context.cert_verifier), 391 cert_verifier_(context.cert_verifier),
399 ssl_(NULL), 392 ssl_(NULL),
400 transport_bio_(NULL), 393 transport_bio_(NULL),
401 transport_(transport_socket), 394 transport_(transport_socket),
402 host_and_port_(host_and_port), 395 host_and_port_(host_and_port),
403 ssl_config_(ssl_config), 396 ssl_config_(ssl_config),
404 trying_cached_session_(false), 397 trying_cached_session_(false),
405 npn_status_(kNextProtoUnsupported), 398 npn_status_(kNextProtoUnsupported),
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
607 SSLClientSocket::NextProtoStatus SSLClientSocketOpenSSL::GetNextProto( 600 SSLClientSocket::NextProtoStatus SSLClientSocketOpenSSL::GetNextProto(
608 std::string* proto, std::string* server_protos) { 601 std::string* proto, std::string* server_protos) {
609 *proto = npn_proto_; 602 *proto = npn_proto_;
610 *server_protos = server_protos_; 603 *server_protos = server_protos_;
611 return npn_status_; 604 return npn_status_;
612 } 605 }
613 606
614 void SSLClientSocketOpenSSL::DoReadCallback(int rv) { 607 void SSLClientSocketOpenSSL::DoReadCallback(int rv) {
615 // Since Run may result in Read being called, clear |user_read_callback_| 608 // Since Run may result in Read being called, clear |user_read_callback_|
616 // up front. 609 // up front.
617 if (old_user_read_callback_) { 610 CompletionCallback c = user_read_callback_;
618 OldCompletionCallback* c = old_user_read_callback_; 611 user_read_callback_.Reset();
619 old_user_read_callback_ = NULL; 612 user_read_buf_ = NULL;
620 user_read_buf_ = NULL; 613 user_read_buf_len_ = 0;
621 user_read_buf_len_ = 0; 614 c.Run(rv);
622 c->Run(rv);
623 } else {
624 CompletionCallback c = user_read_callback_;
625 user_read_callback_.Reset();
626 user_read_buf_ = NULL;
627 user_read_buf_len_ = 0;
628 c.Run(rv);
629 }
630 } 615 }
631 616
632 void SSLClientSocketOpenSSL::DoWriteCallback(int rv) { 617 void SSLClientSocketOpenSSL::DoWriteCallback(int rv) {
633 // Since Run may result in Write being called, clear |user_write_callback_| 618 // Since Run may result in Write being called, clear |user_write_callback_|
634 // up front. 619 // up front.
635 OldCompletionCallback* c = user_write_callback_; 620 CompletionCallback c = user_write_callback_;
636 user_write_callback_ = NULL; 621 user_write_callback_.Reset();
637 user_write_buf_ = NULL; 622 user_write_buf_ = NULL;
638 user_write_buf_len_ = 0; 623 user_write_buf_len_ = 0;
639 c->Run(rv); 624 c.Run(rv);
640 } 625 }
641 626
642 // StreamSocket methods 627 // StreamSocket implementation.
643
644 int SSLClientSocketOpenSSL::Connect(OldCompletionCallback* callback) {
645 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL);
646
647 // Set up new ssl object.
648 if (!Init()) {
649 int result = ERR_UNEXPECTED;
650 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, result);
651 return result;
652 }
653
654 // Set SSL to client mode. Handshake happens in the loop below.
655 SSL_set_connect_state(ssl_);
656
657 GotoState(STATE_HANDSHAKE);
658 int rv = DoHandshakeLoop(net::OK);
659 if (rv == ERR_IO_PENDING) {
660 old_user_connect_callback_ = callback;
661 } else {
662 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv);
663 }
664
665 return rv > OK ? OK : rv;
666 }
667 int SSLClientSocketOpenSSL::Connect(const CompletionCallback& callback) { 628 int SSLClientSocketOpenSSL::Connect(const CompletionCallback& callback) {
668 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); 629 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL);
669 630
670 // Set up new ssl object. 631 // Set up new ssl object.
671 if (!Init()) { 632 if (!Init()) {
672 int result = ERR_UNEXPECTED; 633 int result = ERR_UNEXPECTED;
673 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, result); 634 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, result);
674 return result; 635 return result;
675 } 636 }
676 637
(...skipping 24 matching lines...) Expand all
701 // Shut down anything that may call us back. 662 // Shut down anything that may call us back.
702 verifier_.reset(); 663 verifier_.reset();
703 transport_->socket()->Disconnect(); 664 transport_->socket()->Disconnect();
704 665
705 // Null all callbacks, delete all buffers. 666 // Null all callbacks, delete all buffers.
706 transport_send_busy_ = false; 667 transport_send_busy_ = false;
707 send_buffer_ = NULL; 668 send_buffer_ = NULL;
708 transport_recv_busy_ = false; 669 transport_recv_busy_ = false;
709 recv_buffer_ = NULL; 670 recv_buffer_ = NULL;
710 671
711 old_user_connect_callback_ = NULL;
712 user_connect_callback_.Reset(); 672 user_connect_callback_.Reset();
713 old_user_read_callback_ = NULL;
714 user_read_callback_.Reset(); 673 user_read_callback_.Reset();
715 user_write_callback_ = NULL; 674 user_write_callback_.Reset();
716 user_read_buf_ = NULL; 675 user_read_buf_ = NULL;
717 user_read_buf_len_ = 0; 676 user_read_buf_len_ = 0;
718 user_write_buf_ = NULL; 677 user_write_buf_ = NULL;
719 user_write_buf_len_ = 0; 678 user_write_buf_len_ = 0;
720 679
721 server_cert_verify_result_.Reset(); 680 server_cert_verify_result_.Reset();
722 completed_handshake_ = false; 681 completed_handshake_ = false;
723 682
724 client_certs_.clear(); 683 client_certs_.clear();
725 client_auth_cert_needed_ = false; 684 client_auth_cert_needed_ = false;
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
964 if (max_read > 0) { 923 if (max_read > 0) {
965 send_buffer_ = new DrainableIOBuffer(new IOBuffer(max_read), max_read); 924 send_buffer_ = new DrainableIOBuffer(new IOBuffer(max_read), max_read);
966 int read_bytes = BIO_read(transport_bio_, send_buffer_->data(), max_read); 925 int read_bytes = BIO_read(transport_bio_, send_buffer_->data(), max_read);
967 DCHECK_GT(read_bytes, 0); 926 DCHECK_GT(read_bytes, 0);
968 CHECK_EQ(static_cast<int>(max_read), read_bytes); 927 CHECK_EQ(static_cast<int>(max_read), read_bytes);
969 } 928 }
970 } 929 }
971 930
972 int rv = 0; 931 int rv = 0;
973 while (send_buffer_) { 932 while (send_buffer_) {
974 rv = transport_->socket()->Write(send_buffer_, 933 rv = transport_->socket()->Write(
975 send_buffer_->BytesRemaining(), 934 send_buffer_,
976 &buffer_send_callback_); 935 send_buffer_->BytesRemaining(),
936 base::Bind(&SSLClientSocketOpenSSL::BufferSendComplete,
937 base::Unretained(this)));
977 if (rv == ERR_IO_PENDING) { 938 if (rv == ERR_IO_PENDING) {
978 transport_send_busy_ = true; 939 transport_send_busy_ = true;
979 return rv; 940 return rv;
980 } 941 }
981 TransportWriteComplete(rv); 942 TransportWriteComplete(rv);
982 } 943 }
983 return rv; 944 return rv;
984 } 945 }
985 946
986 void SSLClientSocketOpenSSL::BufferSendComplete(int result) { 947 void SSLClientSocketOpenSSL::BufferSendComplete(int result) {
(...skipping 23 matching lines...) Expand all
1010 return ERR_IO_PENDING; 971 return ERR_IO_PENDING;
1011 972
1012 size_t max_write = BIO_ctrl_get_write_guarantee(transport_bio_); 973 size_t max_write = BIO_ctrl_get_write_guarantee(transport_bio_);
1013 if (max_write > kMaxRecvBufferSize) 974 if (max_write > kMaxRecvBufferSize)
1014 max_write = kMaxRecvBufferSize; 975 max_write = kMaxRecvBufferSize;
1015 976
1016 if (!max_write) 977 if (!max_write)
1017 return ERR_IO_PENDING; 978 return ERR_IO_PENDING;
1018 979
1019 recv_buffer_ = new IOBuffer(max_write); 980 recv_buffer_ = new IOBuffer(max_write);
1020 int rv = transport_->socket()->Read(recv_buffer_, max_write, 981 int rv = transport_->socket()->Read(
1021 &buffer_recv_callback_); 982 recv_buffer_, max_write,
983 base::Bind(&SSLClientSocketOpenSSL::BufferRecvComplete,
984 base::Unretained(this)));
1022 if (rv == ERR_IO_PENDING) { 985 if (rv == ERR_IO_PENDING) {
1023 transport_recv_busy_ = true; 986 transport_recv_busy_ = true;
1024 } else { 987 } else {
1025 TransportReadComplete(rv); 988 TransportReadComplete(rv);
1026 } 989 }
1027 return rv; 990 return rv;
1028 } 991 }
1029 992
1030 void SSLClientSocketOpenSSL::BufferRecvComplete(int result) { 993 void SSLClientSocketOpenSSL::BufferRecvComplete(int result) {
1031 TransportReadComplete(result); 994 TransportReadComplete(result);
(...skipping 13 matching lines...) Expand all
1045 DCHECK(recv_buffer_); 1008 DCHECK(recv_buffer_);
1046 int ret = BIO_write(transport_bio_, recv_buffer_->data(), result); 1009 int ret = BIO_write(transport_bio_, recv_buffer_->data(), result);
1047 // A write into a memory BIO should always succeed. 1010 // A write into a memory BIO should always succeed.
1048 CHECK_EQ(result, ret); 1011 CHECK_EQ(result, ret);
1049 } 1012 }
1050 recv_buffer_ = NULL; 1013 recv_buffer_ = NULL;
1051 transport_recv_busy_ = false; 1014 transport_recv_busy_ = false;
1052 } 1015 }
1053 1016
1054 void SSLClientSocketOpenSSL::DoConnectCallback(int rv) { 1017 void SSLClientSocketOpenSSL::DoConnectCallback(int rv) {
1055 if (old_user_connect_callback_) { 1018 if (!user_connect_callback_.is_null()) {
1056 OldCompletionCallback* c = old_user_connect_callback_;
1057 old_user_connect_callback_ = NULL;
1058 c->Run(rv > OK ? OK : rv);
1059 } else {
1060 CompletionCallback c = user_connect_callback_; 1019 CompletionCallback c = user_connect_callback_;
1061 user_connect_callback_.Reset(); 1020 user_connect_callback_.Reset();
1062 c.Run(rv > OK ? OK : rv); 1021 c.Run(rv > OK ? OK : rv);
1063 } 1022 }
1064 } 1023 }
1065 1024
1066 void SSLClientSocketOpenSSL::OnHandshakeIOComplete(int result) { 1025 void SSLClientSocketOpenSSL::OnHandshakeIOComplete(int result) {
1067 int rv = DoHandshakeLoop(result); 1026 int rv = DoHandshakeLoop(result);
1068 if (rv != ERR_IO_PENDING) { 1027 if (rv != ERR_IO_PENDING) {
1069 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); 1028 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv);
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
1183 return transport_->socket()->GetConnectTimeMicros(); 1142 return transport_->socket()->GetConnectTimeMicros();
1184 1143
1185 NOTREACHED(); 1144 NOTREACHED();
1186 return base::TimeDelta::FromMicroseconds(-1); 1145 return base::TimeDelta::FromMicroseconds(-1);
1187 } 1146 }
1188 1147
1189 // Socket methods 1148 // Socket methods
1190 1149
1191 int SSLClientSocketOpenSSL::Read(IOBuffer* buf, 1150 int SSLClientSocketOpenSSL::Read(IOBuffer* buf,
1192 int buf_len, 1151 int buf_len,
1193 OldCompletionCallback* callback) {
1194 user_read_buf_ = buf;
1195 user_read_buf_len_ = buf_len;
1196
1197 int rv = DoReadLoop(OK);
1198
1199 if (rv == ERR_IO_PENDING) {
1200 old_user_read_callback_ = callback;
1201 } else {
1202 user_read_buf_ = NULL;
1203 user_read_buf_len_ = 0;
1204 }
1205
1206 return rv;
1207 }
1208 int SSLClientSocketOpenSSL::Read(IOBuffer* buf,
1209 int buf_len,
1210 const CompletionCallback& callback) { 1152 const CompletionCallback& callback) {
1211 user_read_buf_ = buf; 1153 user_read_buf_ = buf;
1212 user_read_buf_len_ = buf_len; 1154 user_read_buf_len_ = buf_len;
1213 1155
1214 int rv = DoReadLoop(OK); 1156 int rv = DoReadLoop(OK);
1215 1157
1216 if (rv == ERR_IO_PENDING) { 1158 if (rv == ERR_IO_PENDING) {
1217 user_read_callback_ = callback; 1159 user_read_callback_ = callback;
1218 } else { 1160 } else {
1219 user_read_buf_ = NULL; 1161 user_read_buf_ = NULL;
(...skipping 12 matching lines...) Expand all
1232 do { 1174 do {
1233 rv = DoPayloadRead(); 1175 rv = DoPayloadRead();
1234 network_moved = DoTransportIO(); 1176 network_moved = DoTransportIO();
1235 } while (rv == ERR_IO_PENDING && network_moved); 1177 } while (rv == ERR_IO_PENDING && network_moved);
1236 1178
1237 return rv; 1179 return rv;
1238 } 1180 }
1239 1181
1240 int SSLClientSocketOpenSSL::Write(IOBuffer* buf, 1182 int SSLClientSocketOpenSSL::Write(IOBuffer* buf,
1241 int buf_len, 1183 int buf_len,
1242 OldCompletionCallback* callback) { 1184 const CompletionCallback& callback) {
1243 user_write_buf_ = buf; 1185 user_write_buf_ = buf;
1244 user_write_buf_len_ = buf_len; 1186 user_write_buf_len_ = buf_len;
1245 1187
1246 int rv = DoWriteLoop(OK); 1188 int rv = DoWriteLoop(OK);
1247 1189
1248 if (rv == ERR_IO_PENDING) { 1190 if (rv == ERR_IO_PENDING) {
1249 user_write_callback_ = callback; 1191 user_write_callback_ = callback;
1250 } else { 1192 } else {
1251 user_write_buf_ = NULL; 1193 user_write_buf_ = NULL;
1252 user_write_buf_len_ = 0; 1194 user_write_buf_len_ = 0;
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1303 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_SENT, rv, 1245 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_SENT, rv,
1304 user_write_buf_->data()); 1246 user_write_buf_->data());
1305 return rv; 1247 return rv;
1306 } 1248 }
1307 1249
1308 int err = SSL_get_error(ssl_, rv); 1250 int err = SSL_get_error(ssl_, rv);
1309 return MapOpenSSLError(err, err_tracer); 1251 return MapOpenSSLError(err, err_tracer);
1310 } 1252 }
1311 1253
1312 } // namespace net 1254 } // namespace net
OLDNEW
« no previous file with comments | « net/socket/ssl_client_socket_openssl.h ('k') | net/socket/ssl_client_socket_pool.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698