OLD | NEW |
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 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 : ALLOW_THIS_IN_INITIALIZER_LIST(buffer_send_callback_( |
388 this, &SSLClientSocketOpenSSL::BufferSendComplete)), | 388 this, &SSLClientSocketOpenSSL::BufferSendComplete)), |
389 ALLOW_THIS_IN_INITIALIZER_LIST(buffer_recv_callback_( | 389 ALLOW_THIS_IN_INITIALIZER_LIST(buffer_recv_callback_( |
390 this, &SSLClientSocketOpenSSL::BufferRecvComplete)), | 390 this, &SSLClientSocketOpenSSL::BufferRecvComplete)), |
391 transport_send_busy_(false), | 391 transport_send_busy_(false), |
392 transport_recv_busy_(false), | 392 transport_recv_busy_(false), |
393 old_user_connect_callback_(NULL), | 393 old_user_connect_callback_(NULL), |
394 user_read_callback_(NULL), | 394 old_user_read_callback_(NULL), |
395 user_write_callback_(NULL), | 395 user_write_callback_(NULL), |
396 completed_handshake_(false), | 396 completed_handshake_(false), |
397 client_auth_cert_needed_(false), | 397 client_auth_cert_needed_(false), |
398 cert_verifier_(context.cert_verifier), | 398 cert_verifier_(context.cert_verifier), |
399 ssl_(NULL), | 399 ssl_(NULL), |
400 transport_bio_(NULL), | 400 transport_bio_(NULL), |
401 transport_(transport_socket), | 401 transport_(transport_socket), |
402 host_and_port_(host_and_port), | 402 host_and_port_(host_and_port), |
403 ssl_config_(ssl_config), | 403 ssl_config_(ssl_config), |
404 trying_cached_session_(false), | 404 trying_cached_session_(false), |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
607 SSLClientSocket::NextProtoStatus SSLClientSocketOpenSSL::GetNextProto( | 607 SSLClientSocket::NextProtoStatus SSLClientSocketOpenSSL::GetNextProto( |
608 std::string* proto, std::string* server_protos) { | 608 std::string* proto, std::string* server_protos) { |
609 *proto = npn_proto_; | 609 *proto = npn_proto_; |
610 *server_protos = server_protos_; | 610 *server_protos = server_protos_; |
611 return npn_status_; | 611 return npn_status_; |
612 } | 612 } |
613 | 613 |
614 void SSLClientSocketOpenSSL::DoReadCallback(int rv) { | 614 void SSLClientSocketOpenSSL::DoReadCallback(int rv) { |
615 // Since Run may result in Read being called, clear |user_read_callback_| | 615 // Since Run may result in Read being called, clear |user_read_callback_| |
616 // up front. | 616 // up front. |
617 OldCompletionCallback* c = user_read_callback_; | 617 if (old_user_read_callback_) { |
618 user_read_callback_ = NULL; | 618 OldCompletionCallback* c = old_user_read_callback_; |
619 user_read_buf_ = NULL; | 619 old_user_read_callback_ = NULL; |
620 user_read_buf_len_ = 0; | 620 user_read_buf_ = NULL; |
621 c->Run(rv); | 621 user_read_buf_len_ = 0; |
| 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 } |
622 } | 630 } |
623 | 631 |
624 void SSLClientSocketOpenSSL::DoWriteCallback(int rv) { | 632 void SSLClientSocketOpenSSL::DoWriteCallback(int rv) { |
625 // Since Run may result in Write being called, clear |user_write_callback_| | 633 // Since Run may result in Write being called, clear |user_write_callback_| |
626 // up front. | 634 // up front. |
627 OldCompletionCallback* c = user_write_callback_; | 635 OldCompletionCallback* c = user_write_callback_; |
628 user_write_callback_ = NULL; | 636 user_write_callback_ = NULL; |
629 user_write_buf_ = NULL; | 637 user_write_buf_ = NULL; |
630 user_write_buf_len_ = 0; | 638 user_write_buf_len_ = 0; |
631 c->Run(rv); | 639 c->Run(rv); |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
695 transport_->socket()->Disconnect(); | 703 transport_->socket()->Disconnect(); |
696 | 704 |
697 // Null all callbacks, delete all buffers. | 705 // Null all callbacks, delete all buffers. |
698 transport_send_busy_ = false; | 706 transport_send_busy_ = false; |
699 send_buffer_ = NULL; | 707 send_buffer_ = NULL; |
700 transport_recv_busy_ = false; | 708 transport_recv_busy_ = false; |
701 recv_buffer_ = NULL; | 709 recv_buffer_ = NULL; |
702 | 710 |
703 old_user_connect_callback_ = NULL; | 711 old_user_connect_callback_ = NULL; |
704 user_connect_callback_.Reset(); | 712 user_connect_callback_.Reset(); |
705 user_read_callback_ = NULL; | 713 old_user_read_callback_ = NULL; |
| 714 user_read_callback_.Reset(); |
706 user_write_callback_ = NULL; | 715 user_write_callback_ = NULL; |
707 user_read_buf_ = NULL; | 716 user_read_buf_ = NULL; |
708 user_read_buf_len_ = 0; | 717 user_read_buf_len_ = 0; |
709 user_write_buf_ = NULL; | 718 user_write_buf_ = NULL; |
710 user_write_buf_len_ = 0; | 719 user_write_buf_len_ = 0; |
711 | 720 |
712 server_cert_verify_result_.Reset(); | 721 server_cert_verify_result_.Reset(); |
713 completed_handshake_ = false; | 722 completed_handshake_ = false; |
714 | 723 |
715 client_certs_.clear(); | 724 client_certs_.clear(); |
(...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1181 | 1190 |
1182 int SSLClientSocketOpenSSL::Read(IOBuffer* buf, | 1191 int SSLClientSocketOpenSSL::Read(IOBuffer* buf, |
1183 int buf_len, | 1192 int buf_len, |
1184 OldCompletionCallback* callback) { | 1193 OldCompletionCallback* callback) { |
1185 user_read_buf_ = buf; | 1194 user_read_buf_ = buf; |
1186 user_read_buf_len_ = buf_len; | 1195 user_read_buf_len_ = buf_len; |
1187 | 1196 |
1188 int rv = DoReadLoop(OK); | 1197 int rv = DoReadLoop(OK); |
1189 | 1198 |
1190 if (rv == ERR_IO_PENDING) { | 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) { |
| 1211 user_read_buf_ = buf; |
| 1212 user_read_buf_len_ = buf_len; |
| 1213 |
| 1214 int rv = DoReadLoop(OK); |
| 1215 |
| 1216 if (rv == ERR_IO_PENDING) { |
1191 user_read_callback_ = callback; | 1217 user_read_callback_ = callback; |
1192 } else { | 1218 } else { |
1193 user_read_buf_ = NULL; | 1219 user_read_buf_ = NULL; |
1194 user_read_buf_len_ = 0; | 1220 user_read_buf_len_ = 0; |
1195 } | 1221 } |
1196 | 1222 |
1197 return rv; | 1223 return rv; |
1198 } | 1224 } |
1199 | 1225 |
1200 int SSLClientSocketOpenSSL::DoReadLoop(int result) { | 1226 int SSLClientSocketOpenSSL::DoReadLoop(int result) { |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1277 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_SENT, rv, | 1303 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_SENT, rv, |
1278 user_write_buf_->data()); | 1304 user_write_buf_->data()); |
1279 return rv; | 1305 return rv; |
1280 } | 1306 } |
1281 | 1307 |
1282 int err = SSL_get_error(ssl_, rv); | 1308 int err = SSL_get_error(ssl_, rv); |
1283 return MapOpenSSLError(err, err_tracer); | 1309 return MapOpenSSLError(err, err_tracer); |
1284 } | 1310 } |
1285 | 1311 |
1286 } // namespace net | 1312 } // namespace net |
OLD | NEW |