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

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

Issue 8801005: base::Bind: Convert Socket::Read. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: 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 #include "net/socket/ssl_client_socket_win.h" 5 #include "net/socket/ssl_client_socket_win.h"
6 6
7 #include <schnlsp.h> 7 #include <schnlsp.h>
8 #include <map> 8 #include <map>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after
391 handshake_io_callback_(this, 391 handshake_io_callback_(this,
392 &SSLClientSocketWin::OnHandshakeIOComplete)), 392 &SSLClientSocketWin::OnHandshakeIOComplete)),
393 ALLOW_THIS_IN_INITIALIZER_LIST( 393 ALLOW_THIS_IN_INITIALIZER_LIST(
394 read_callback_(this, &SSLClientSocketWin::OnReadComplete)), 394 read_callback_(this, &SSLClientSocketWin::OnReadComplete)),
395 ALLOW_THIS_IN_INITIALIZER_LIST( 395 ALLOW_THIS_IN_INITIALIZER_LIST(
396 write_callback_(this, &SSLClientSocketWin::OnWriteComplete)), 396 write_callback_(this, &SSLClientSocketWin::OnWriteComplete)),
397 transport_(transport_socket), 397 transport_(transport_socket),
398 host_and_port_(host_and_port), 398 host_and_port_(host_and_port),
399 ssl_config_(ssl_config), 399 ssl_config_(ssl_config),
400 old_user_connect_callback_(NULL), 400 old_user_connect_callback_(NULL),
401 user_read_callback_(NULL), 401 old_user_read_callback_(NULL),
402 user_read_buf_len_(0), 402 user_read_buf_len_(0),
403 user_write_callback_(NULL), 403 user_write_callback_(NULL),
404 user_write_buf_len_(0), 404 user_write_buf_len_(0),
405 next_state_(STATE_NONE), 405 next_state_(STATE_NONE),
406 cert_verifier_(context.cert_verifier), 406 cert_verifier_(context.cert_verifier),
407 creds_(NULL), 407 creds_(NULL),
408 isc_status_(SEC_E_OK), 408 isc_status_(SEC_E_OK),
409 payload_send_buffer_len_(0), 409 payload_send_buffer_len_(0),
410 bytes_sent_(0), 410 bytes_sent_(0),
411 decrypted_ptr_(NULL), 411 decrypted_ptr_(NULL),
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after
777 if (transport_.get() && transport_->socket()) { 777 if (transport_.get() && transport_->socket()) {
778 return transport_->socket()->GetConnectTimeMicros(); 778 return transport_->socket()->GetConnectTimeMicros();
779 } 779 }
780 NOTREACHED(); 780 NOTREACHED();
781 return base::TimeDelta::FromMicroseconds(-1); 781 return base::TimeDelta::FromMicroseconds(-1);
782 } 782 }
783 783
784 int SSLClientSocketWin::Read(IOBuffer* buf, int buf_len, 784 int SSLClientSocketWin::Read(IOBuffer* buf, int buf_len,
785 OldCompletionCallback* callback) { 785 OldCompletionCallback* callback) {
786 DCHECK(completed_handshake()); 786 DCHECK(completed_handshake());
787 DCHECK(!user_read_callback_); 787 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null());
788 788
789 // If we have surplus decrypted plaintext, satisfy the Read with it without 789 // If we have surplus decrypted plaintext, satisfy the Read with it without
790 // reading more ciphertext from the transport socket. 790 // reading more ciphertext from the transport socket.
791 if (bytes_decrypted_ != 0) {
792 int len = std::min(buf_len, bytes_decrypted_);
793 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, len,
794 decrypted_ptr_);
795 memcpy(buf->data(), decrypted_ptr_, len);
796 decrypted_ptr_ += len;
797 bytes_decrypted_ -= len;
798 if (bytes_decrypted_ == 0) {
799 decrypted_ptr_ = NULL;
800 if (bytes_received_ != 0) {
801 memmove(recv_buffer_.get(), received_ptr_, bytes_received_);
802 received_ptr_ = recv_buffer_.get();
803 }
804 }
805 return len;
806 }
807
808 DCHECK(!user_read_buf_);
809 // http://crbug.com/16371: We're seeing |buf->data()| return NULL. See if the
810 // user is passing in an IOBuffer with a NULL |data_|.
811 CHECK(buf);
812 CHECK(buf->data());
813 user_read_buf_ = buf;
814 user_read_buf_len_ = buf_len;
815
816 int rv = DoPayloadRead();
817 if (rv == ERR_IO_PENDING) {
818 old_user_read_callback_ = callback;
819 } else {
820 user_read_buf_ = NULL;
821 user_read_buf_len_ = 0;
822 }
823 return rv;
824 }
825 int SSLClientSocketWin::Read(IOBuffer* buf, int buf_len,
826 const CompletionCallback& callback) {
827 DCHECK(completed_handshake());
828 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null());
829
830 // If we have surplus decrypted plaintext, satisfy the Read with it without
831 // reading more ciphertext from the transport socket.
791 if (bytes_decrypted_ != 0) { 832 if (bytes_decrypted_ != 0) {
792 int len = std::min(buf_len, bytes_decrypted_); 833 int len = std::min(buf_len, bytes_decrypted_);
793 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, len, 834 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, len,
794 decrypted_ptr_); 835 decrypted_ptr_);
795 memcpy(buf->data(), decrypted_ptr_, len); 836 memcpy(buf->data(), decrypted_ptr_, len);
796 decrypted_ptr_ += len; 837 decrypted_ptr_ += len;
797 bytes_decrypted_ -= len; 838 bytes_decrypted_ -= len;
798 if (bytes_decrypted_ == 0) { 839 if (bytes_decrypted_ == 0) {
799 decrypted_ptr_ = NULL; 840 decrypted_ptr_ = NULL;
800 if (bytes_received_ != 0) { 841 if (bytes_received_ != 0) {
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
857 void SSLClientSocketWin::OnHandshakeIOComplete(int result) { 898 void SSLClientSocketWin::OnHandshakeIOComplete(int result) {
858 int rv = DoLoop(result); 899 int rv = DoLoop(result);
859 900
860 // The SSL handshake has some round trips. We need to notify the caller of 901 // The SSL handshake has some round trips. We need to notify the caller of
861 // success or any error, other than waiting for IO. 902 // success or any error, other than waiting for IO.
862 if (rv != ERR_IO_PENDING) { 903 if (rv != ERR_IO_PENDING) {
863 // If there is no connect callback available to call, we are renegotiating 904 // If there is no connect callback available to call, we are renegotiating
864 // (which occurs because we are in the middle of a Read when the 905 // (which occurs because we are in the middle of a Read when the
865 // renegotiation process starts). So we complete the Read here. 906 // renegotiation process starts). So we complete the Read here.
866 if (!old_user_connect_callback_ && user_connect_callback_.is_null()) { 907 if (!old_user_connect_callback_ && user_connect_callback_.is_null()) {
867 OldCompletionCallback* c = user_read_callback_; 908 if (old_user_read_callback_) {
868 user_read_callback_ = NULL; 909 OldCompletionCallback* c = old_user_read_callback_;
869 user_read_buf_ = NULL; 910 old_user_read_callback_ = NULL;
870 user_read_buf_len_ = 0; 911 user_read_buf_ = NULL;
871 c->Run(rv); 912 user_read_buf_len_ = 0;
913 c->Run(rv);
914 } else {
915 CompletionCallback c = user_read_callback_;
916 user_read_callback_.Reset();
917 user_read_buf_ = NULL;
918 user_read_buf_len_ = 0;
919 c.Run(rv);
920 }
872 return; 921 return;
873 } 922 }
874 net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT, NULL); 923 net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT, NULL);
875 if (old_user_connect_callback_) { 924 if (old_user_connect_callback_) {
876 OldCompletionCallback* c = old_user_connect_callback_; 925 OldCompletionCallback* c = old_user_connect_callback_;
877 old_user_connect_callback_ = NULL; 926 old_user_connect_callback_ = NULL;
878 c->Run(rv); 927 c->Run(rv);
879 } else { 928 } else {
880 CompletionCallback c = user_connect_callback_; 929 CompletionCallback c = user_connect_callback_;
881 user_connect_callback_.Reset(); 930 user_connect_callback_.Reset();
882 c.Run(rv); 931 c.Run(rv);
883 } 932 }
884 } 933 }
885 } 934 }
886 935
887 void SSLClientSocketWin::OnReadComplete(int result) { 936 void SSLClientSocketWin::OnReadComplete(int result) {
888 DCHECK(completed_handshake()); 937 DCHECK(completed_handshake());
889 938
890 result = DoPayloadReadComplete(result); 939 result = DoPayloadReadComplete(result);
891 if (result > 0) 940 if (result > 0)
892 result = DoPayloadDecrypt(); 941 result = DoPayloadDecrypt();
893 if (result != ERR_IO_PENDING) { 942 if (result != ERR_IO_PENDING) {
894 DCHECK(user_read_callback_); 943 DCHECK(old_user_read_callback_ || !user_read_callback_.is_null());
895 OldCompletionCallback* c = user_read_callback_; 944 if (old_user_read_callback_) {
896 user_read_callback_ = NULL; 945 OldCompletionCallback* c = old_user_read_callback_;
897 user_read_buf_ = NULL; 946 old_user_read_callback_ = NULL;
898 user_read_buf_len_ = 0; 947 user_read_buf_ = NULL;
899 c->Run(result); 948 user_read_buf_len_ = 0;
949 c->Run(result);
950 } else {
951 CompletionCallback c = user_read_callback_;
952 user_read_callback_.Reset();
953 user_read_buf_ = NULL;
954 user_read_buf_len_ = 0;
955 c.Run(result);
956 }
900 } 957 }
901 } 958 }
902 959
903 void SSLClientSocketWin::OnWriteComplete(int result) { 960 void SSLClientSocketWin::OnWriteComplete(int result) {
904 DCHECK(completed_handshake()); 961 DCHECK(completed_handshake());
905 962
906 int rv = DoPayloadWriteComplete(result); 963 int rv = DoPayloadWriteComplete(result);
907 if (rv != ERR_IO_PENDING) { 964 if (rv != ERR_IO_PENDING) {
908 DCHECK(user_write_callback_); 965 DCHECK(user_write_callback_);
909 OldCompletionCallback* c = user_write_callback_; 966 OldCompletionCallback* c = user_write_callback_;
(...skipping 660 matching lines...) Expand 10 before | Expand all | Expand 10 after
1570 next_state_ = STATE_VERIFY_CERT; 1627 next_state_ = STATE_VERIFY_CERT;
1571 } 1628 }
1572 CertFreeCertificateContext(server_cert_handle); 1629 CertFreeCertificateContext(server_cert_handle);
1573 return OK; 1630 return OK;
1574 } 1631 }
1575 1632
1576 // Called when a renegotiation is completed. |result| is the verification 1633 // Called when a renegotiation is completed. |result| is the verification
1577 // result of the server certificate received during renegotiation. 1634 // result of the server certificate received during renegotiation.
1578 void SSLClientSocketWin::DidCompleteRenegotiation() { 1635 void SSLClientSocketWin::DidCompleteRenegotiation() {
1579 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); 1636 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null());
1580 DCHECK(user_read_callback_); 1637 DCHECK(old_user_read_callback_ || !user_read_callback_.is_null());
1581 renegotiating_ = false; 1638 renegotiating_ = false;
1582 next_state_ = STATE_COMPLETED_RENEGOTIATION; 1639 next_state_ = STATE_COMPLETED_RENEGOTIATION;
1583 } 1640 }
1584 1641
1585 void SSLClientSocketWin::LogConnectionTypeMetrics() const { 1642 void SSLClientSocketWin::LogConnectionTypeMetrics() const {
1586 UpdateConnectionTypeHistograms(CONNECTION_SSL); 1643 UpdateConnectionTypeHistograms(CONNECTION_SSL);
1587 if (server_cert_verify_result_.has_md5) 1644 if (server_cert_verify_result_.has_md5)
1588 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD5); 1645 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD5);
1589 if (server_cert_verify_result_.has_md2) 1646 if (server_cert_verify_result_.has_md2)
1590 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD2); 1647 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD2);
1591 if (server_cert_verify_result_.has_md4) 1648 if (server_cert_verify_result_.has_md4)
1592 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD4); 1649 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD4);
1593 if (server_cert_verify_result_.has_md5_ca) 1650 if (server_cert_verify_result_.has_md5_ca)
1594 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD5_CA); 1651 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD5_CA);
1595 if (server_cert_verify_result_.has_md2_ca) 1652 if (server_cert_verify_result_.has_md2_ca)
1596 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD2_CA); 1653 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD2_CA);
1597 } 1654 }
1598 1655
1599 void SSLClientSocketWin::FreeSendBuffer() { 1656 void SSLClientSocketWin::FreeSendBuffer() {
1600 SECURITY_STATUS status = FreeContextBuffer(send_buffer_.pvBuffer); 1657 SECURITY_STATUS status = FreeContextBuffer(send_buffer_.pvBuffer);
1601 DCHECK(status == SEC_E_OK); 1658 DCHECK(status == SEC_E_OK);
1602 memset(&send_buffer_, 0, sizeof(send_buffer_)); 1659 memset(&send_buffer_, 0, sizeof(send_buffer_));
1603 } 1660 }
1604 1661
1605 } // namespace net 1662 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698