| OLD | NEW |
| 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 // 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/err.h> | 10 #include <openssl/err.h> |
| (...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 341 const HostPortPair& host_and_port, | 341 const HostPortPair& host_and_port, |
| 342 const SSLConfig& ssl_config, | 342 const SSLConfig& ssl_config, |
| 343 const SSLClientSocketContext& context) | 343 const SSLClientSocketContext& context) |
| 344 : transport_send_busy_(false), | 344 : transport_send_busy_(false), |
| 345 transport_recv_busy_(false), | 345 transport_recv_busy_(false), |
| 346 transport_recv_eof_(false), | 346 transport_recv_eof_(false), |
| 347 weak_factory_(this), | 347 weak_factory_(this), |
| 348 pending_read_error_(kNoPendingReadResult), | 348 pending_read_error_(kNoPendingReadResult), |
| 349 transport_write_error_(OK), | 349 transport_write_error_(OK), |
| 350 completed_handshake_(false), | 350 completed_handshake_(false), |
| 351 was_used_to_convey_data_(false), |
| 351 client_auth_cert_needed_(false), | 352 client_auth_cert_needed_(false), |
| 352 cert_verifier_(context.cert_verifier), | 353 cert_verifier_(context.cert_verifier), |
| 353 server_bound_cert_service_(context.server_bound_cert_service), | 354 server_bound_cert_service_(context.server_bound_cert_service), |
| 354 ssl_(NULL), | 355 ssl_(NULL), |
| 355 transport_bio_(NULL), | 356 transport_bio_(NULL), |
| 356 transport_(transport_socket.Pass()), | 357 transport_(transport_socket.Pass()), |
| 357 host_and_port_(host_and_port), | 358 host_and_port_(host_and_port), |
| 358 ssl_config_(ssl_config), | 359 ssl_config_(ssl_config), |
| 359 ssl_session_cache_shard_(context.ssl_session_cache_shard), | 360 ssl_session_cache_shard_(context.ssl_session_cache_shard), |
| 360 trying_cached_session_(false), | 361 trying_cached_session_(false), |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 530 | 531 |
| 531 void SSLClientSocketOpenSSL::SetOmniboxSpeculation() { | 532 void SSLClientSocketOpenSSL::SetOmniboxSpeculation() { |
| 532 if (transport_.get() && transport_->socket()) { | 533 if (transport_.get() && transport_->socket()) { |
| 533 transport_->socket()->SetOmniboxSpeculation(); | 534 transport_->socket()->SetOmniboxSpeculation(); |
| 534 } else { | 535 } else { |
| 535 NOTREACHED(); | 536 NOTREACHED(); |
| 536 } | 537 } |
| 537 } | 538 } |
| 538 | 539 |
| 539 bool SSLClientSocketOpenSSL::WasEverUsed() const { | 540 bool SSLClientSocketOpenSSL::WasEverUsed() const { |
| 540 if (transport_.get() && transport_->socket()) | 541 return was_used_to_convey_data_; |
| 541 return transport_->socket()->WasEverUsed(); | |
| 542 | |
| 543 NOTREACHED(); | |
| 544 return false; | |
| 545 } | 542 } |
| 546 | 543 |
| 547 bool SSLClientSocketOpenSSL::UsingTCPFastOpen() const { | 544 bool SSLClientSocketOpenSSL::UsingTCPFastOpen() const { |
| 548 if (transport_.get() && transport_->socket()) | 545 if (transport_.get() && transport_->socket()) |
| 549 return transport_->socket()->UsingTCPFastOpen(); | 546 return transport_->socket()->UsingTCPFastOpen(); |
| 550 | 547 |
| 551 NOTREACHED(); | 548 NOTREACHED(); |
| 552 return false; | 549 return false; |
| 553 } | 550 } |
| 554 | 551 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 605 int buf_len, | 602 int buf_len, |
| 606 const CompletionCallback& callback) { | 603 const CompletionCallback& callback) { |
| 607 user_read_buf_ = buf; | 604 user_read_buf_ = buf; |
| 608 user_read_buf_len_ = buf_len; | 605 user_read_buf_len_ = buf_len; |
| 609 | 606 |
| 610 int rv = DoReadLoop(OK); | 607 int rv = DoReadLoop(OK); |
| 611 | 608 |
| 612 if (rv == ERR_IO_PENDING) { | 609 if (rv == ERR_IO_PENDING) { |
| 613 user_read_callback_ = callback; | 610 user_read_callback_ = callback; |
| 614 } else { | 611 } else { |
| 612 if (rv > 0) |
| 613 was_used_to_convey_data_ = true; |
| 615 user_read_buf_ = NULL; | 614 user_read_buf_ = NULL; |
| 616 user_read_buf_len_ = 0; | 615 user_read_buf_len_ = 0; |
| 617 } | 616 } |
| 618 | 617 |
| 619 return rv; | 618 return rv; |
| 620 } | 619 } |
| 621 | 620 |
| 622 int SSLClientSocketOpenSSL::Write(IOBuffer* buf, | 621 int SSLClientSocketOpenSSL::Write(IOBuffer* buf, |
| 623 int buf_len, | 622 int buf_len, |
| 624 const CompletionCallback& callback) { | 623 const CompletionCallback& callback) { |
| 625 user_write_buf_ = buf; | 624 user_write_buf_ = buf; |
| 626 user_write_buf_len_ = buf_len; | 625 user_write_buf_len_ = buf_len; |
| 627 | 626 |
| 628 int rv = DoWriteLoop(OK); | 627 int rv = DoWriteLoop(OK); |
| 629 | 628 |
| 630 if (rv == ERR_IO_PENDING) { | 629 if (rv == ERR_IO_PENDING) { |
| 631 user_write_callback_ = callback; | 630 user_write_callback_ = callback; |
| 632 } else { | 631 } else { |
| 632 if (rv > 0) |
| 633 was_used_to_convey_data_ = true; |
| 633 user_write_buf_ = NULL; | 634 user_write_buf_ = NULL; |
| 634 user_write_buf_len_ = 0; | 635 user_write_buf_len_ = 0; |
| 635 } | 636 } |
| 636 | 637 |
| 637 return rv; | 638 return rv; |
| 638 } | 639 } |
| 639 | 640 |
| 640 bool SSLClientSocketOpenSSL::SetReceiveBufferSize(int32 size) { | 641 bool SSLClientSocketOpenSSL::SetReceiveBufferSize(int32 size) { |
| 641 return transport_->socket()->SetReceiveBufferSize(size); | 642 return transport_->socket()->SetReceiveBufferSize(size); |
| 642 } | 643 } |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 762 if (IsChannelIDEnabled(ssl_config_, server_bound_cert_service_)) { | 763 if (IsChannelIDEnabled(ssl_config_, server_bound_cert_service_)) { |
| 763 SSL_enable_tls_channel_id(ssl_); | 764 SSL_enable_tls_channel_id(ssl_); |
| 764 } | 765 } |
| 765 | 766 |
| 766 return true; | 767 return true; |
| 767 } | 768 } |
| 768 | 769 |
| 769 void SSLClientSocketOpenSSL::DoReadCallback(int rv) { | 770 void SSLClientSocketOpenSSL::DoReadCallback(int rv) { |
| 770 // Since Run may result in Read being called, clear |user_read_callback_| | 771 // Since Run may result in Read being called, clear |user_read_callback_| |
| 771 // up front. | 772 // up front. |
| 773 if (rv > 0) |
| 774 was_used_to_convey_data_ = true; |
| 772 user_read_buf_ = NULL; | 775 user_read_buf_ = NULL; |
| 773 user_read_buf_len_ = 0; | 776 user_read_buf_len_ = 0; |
| 774 base::ResetAndReturn(&user_read_callback_).Run(rv); | 777 base::ResetAndReturn(&user_read_callback_).Run(rv); |
| 775 } | 778 } |
| 776 | 779 |
| 777 void SSLClientSocketOpenSSL::DoWriteCallback(int rv) { | 780 void SSLClientSocketOpenSSL::DoWriteCallback(int rv) { |
| 778 // Since Run may result in Write being called, clear |user_write_callback_| | 781 // Since Run may result in Write being called, clear |user_write_callback_| |
| 779 // up front. | 782 // up front. |
| 783 if (rv > 0) |
| 784 was_used_to_convey_data_ = true; |
| 780 user_write_buf_ = NULL; | 785 user_write_buf_ = NULL; |
| 781 user_write_buf_len_ = 0; | 786 user_write_buf_len_ = 0; |
| 782 base::ResetAndReturn(&user_write_callback_).Run(rv); | 787 base::ResetAndReturn(&user_write_callback_).Run(rv); |
| 783 } | 788 } |
| 784 | 789 |
| 785 bool SSLClientSocketOpenSSL::DoTransportIO() { | 790 bool SSLClientSocketOpenSSL::DoTransportIO() { |
| 786 bool network_moved = false; | 791 bool network_moved = false; |
| 787 int rv; | 792 int rv; |
| 788 // Read and write as much data as possible. The loop is necessary because | 793 // Read and write as much data as possible. The loop is necessary because |
| 789 // Write() may return synchronously. | 794 // Write() may return synchronously. |
| (...skipping 628 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1418 } | 1423 } |
| 1419 | 1424 |
| 1420 npn_proto_.assign(reinterpret_cast<const char*>(*out), *outlen); | 1425 npn_proto_.assign(reinterpret_cast<const char*>(*out), *outlen); |
| 1421 server_protos_.assign(reinterpret_cast<const char*>(in), inlen); | 1426 server_protos_.assign(reinterpret_cast<const char*>(in), inlen); |
| 1422 DVLOG(2) << "next protocol: '" << npn_proto_ << "' status: " << npn_status_; | 1427 DVLOG(2) << "next protocol: '" << npn_proto_ << "' status: " << npn_status_; |
| 1423 #endif | 1428 #endif |
| 1424 return SSL_TLSEXT_ERR_OK; | 1429 return SSL_TLSEXT_ERR_OK; |
| 1425 } | 1430 } |
| 1426 | 1431 |
| 1427 } // namespace net | 1432 } // namespace net |
| OLD | NEW |