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 #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 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
380 // breakdown of the size: | 380 // breakdown of the size: |
381 // 5: SSL record header | 381 // 5: SSL record header |
382 // 16K: SSL record maximum size | 382 // 16K: SSL record maximum size |
383 // 64: >= SSL record trailer (16 or 20 have been observed) | 383 // 64: >= SSL record trailer (16 or 20 have been observed) |
384 static const int kRecvBufferSize = (5 + 16*1024 + 64); | 384 static const int kRecvBufferSize = (5 + 16*1024 + 64); |
385 | 385 |
386 SSLClientSocketWin::SSLClientSocketWin(ClientSocketHandle* transport_socket, | 386 SSLClientSocketWin::SSLClientSocketWin(ClientSocketHandle* transport_socket, |
387 const HostPortPair& host_and_port, | 387 const HostPortPair& host_and_port, |
388 const SSLConfig& ssl_config, | 388 const SSLConfig& ssl_config, |
389 const SSLClientSocketContext& context) | 389 const SSLClientSocketContext& context) |
390 : ALLOW_THIS_IN_INITIALIZER_LIST( | 390 : transport_(transport_socket), |
391 handshake_io_callback_(this, | |
392 &SSLClientSocketWin::OnHandshakeIOComplete)), | |
393 ALLOW_THIS_IN_INITIALIZER_LIST( | |
394 read_callback_(this, &SSLClientSocketWin::OnReadComplete)), | |
395 ALLOW_THIS_IN_INITIALIZER_LIST( | |
396 write_callback_(this, &SSLClientSocketWin::OnWriteComplete)), | |
397 transport_(transport_socket), | |
398 host_and_port_(host_and_port), | 391 host_and_port_(host_and_port), |
399 ssl_config_(ssl_config), | 392 ssl_config_(ssl_config), |
400 old_user_connect_callback_(NULL), | |
401 old_user_read_callback_(NULL), | |
402 user_read_buf_len_(0), | 393 user_read_buf_len_(0), |
403 user_write_callback_(NULL), | |
404 user_write_buf_len_(0), | 394 user_write_buf_len_(0), |
405 next_state_(STATE_NONE), | 395 next_state_(STATE_NONE), |
406 cert_verifier_(context.cert_verifier), | 396 cert_verifier_(context.cert_verifier), |
407 creds_(NULL), | 397 creds_(NULL), |
408 isc_status_(SEC_E_OK), | 398 isc_status_(SEC_E_OK), |
409 payload_send_buffer_len_(0), | 399 payload_send_buffer_len_(0), |
410 bytes_sent_(0), | 400 bytes_sent_(0), |
411 decrypted_ptr_(NULL), | 401 decrypted_ptr_(NULL), |
412 bytes_decrypted_(0), | 402 bytes_decrypted_(0), |
413 received_ptr_(NULL), | 403 received_ptr_(NULL), |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
555 } | 545 } |
556 | 546 |
557 SSLClientSocket::NextProtoStatus | 547 SSLClientSocket::NextProtoStatus |
558 SSLClientSocketWin::GetNextProto(std::string* proto, | 548 SSLClientSocketWin::GetNextProto(std::string* proto, |
559 std::string* server_protos) { | 549 std::string* server_protos) { |
560 proto->clear(); | 550 proto->clear(); |
561 server_protos->clear(); | 551 server_protos->clear(); |
562 return kNextProtoUnsupported; | 552 return kNextProtoUnsupported; |
563 } | 553 } |
564 | 554 |
565 int SSLClientSocketWin::Connect(OldCompletionCallback* callback) { | 555 int SSLClientSocketWin::Connect(const CompletionCallback& callback) { |
566 DCHECK(transport_.get()); | 556 DCHECK(transport_.get()); |
567 DCHECK(next_state_ == STATE_NONE); | 557 DCHECK(next_state_ == STATE_NONE); |
568 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); | 558 DCHECK(user_connect_callback_.is_null()); |
569 | 559 |
570 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); | 560 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); |
571 | 561 |
572 int rv = InitializeSSLContext(); | |
573 if (rv != OK) { | |
574 net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT, NULL); | |
575 return rv; | |
576 } | |
577 | |
578 writing_first_token_ = true; | |
579 next_state_ = STATE_HANDSHAKE_WRITE; | |
580 rv = DoLoop(OK); | |
581 if (rv == ERR_IO_PENDING) { | |
582 old_user_connect_callback_ = callback; | |
583 } else { | |
584 net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT, NULL); | |
585 } | |
586 return rv; | |
587 } | |
588 int SSLClientSocketWin::Connect(const CompletionCallback& callback) { | |
589 DCHECK(transport_.get()); | |
590 DCHECK(next_state_ == STATE_NONE); | |
591 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); | |
592 | |
593 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); | |
594 | |
595 int rv = InitializeSSLContext(); | 562 int rv = InitializeSSLContext(); |
596 if (rv != OK) { | 563 if (rv != OK) { |
597 net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT, NULL); | 564 net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT, NULL); |
598 return rv; | 565 return rv; |
599 } | 566 } |
600 | 567 |
601 writing_first_token_ = true; | 568 writing_first_token_ = true; |
602 next_state_ = STATE_HANDSHAKE_WRITE; | 569 next_state_ = STATE_HANDSHAKE_WRITE; |
603 rv = DoLoop(OK); | 570 rv = DoLoop(OK); |
604 if (rv == ERR_IO_PENDING) { | 571 if (rv == ERR_IO_PENDING) { |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
777 | 744 |
778 base::TimeDelta SSLClientSocketWin::GetConnectTimeMicros() const { | 745 base::TimeDelta SSLClientSocketWin::GetConnectTimeMicros() const { |
779 if (transport_.get() && transport_->socket()) { | 746 if (transport_.get() && transport_->socket()) { |
780 return transport_->socket()->GetConnectTimeMicros(); | 747 return transport_->socket()->GetConnectTimeMicros(); |
781 } | 748 } |
782 NOTREACHED(); | 749 NOTREACHED(); |
783 return base::TimeDelta::FromMicroseconds(-1); | 750 return base::TimeDelta::FromMicroseconds(-1); |
784 } | 751 } |
785 | 752 |
786 int SSLClientSocketWin::Read(IOBuffer* buf, int buf_len, | 753 int SSLClientSocketWin::Read(IOBuffer* buf, int buf_len, |
787 OldCompletionCallback* callback) { | 754 const CompletionCallback& callback) { |
788 DCHECK(completed_handshake()); | 755 DCHECK(completed_handshake()); |
789 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null()); | 756 DCHECK(user_read_callback_.is_null()); |
790 | 757 |
791 // If we have surplus decrypted plaintext, satisfy the Read with it without | 758 // If we have surplus decrypted plaintext, satisfy the Read with it without |
792 // reading more ciphertext from the transport socket. | 759 // reading more ciphertext from the transport socket. |
793 if (bytes_decrypted_ != 0) { | |
794 int len = std::min(buf_len, bytes_decrypted_); | |
795 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, len, | |
796 decrypted_ptr_); | |
797 memcpy(buf->data(), decrypted_ptr_, len); | |
798 decrypted_ptr_ += len; | |
799 bytes_decrypted_ -= len; | |
800 if (bytes_decrypted_ == 0) { | |
801 decrypted_ptr_ = NULL; | |
802 if (bytes_received_ != 0) { | |
803 memmove(recv_buffer_.get(), received_ptr_, bytes_received_); | |
804 received_ptr_ = recv_buffer_.get(); | |
805 } | |
806 } | |
807 return len; | |
808 } | |
809 | |
810 DCHECK(!user_read_buf_); | |
811 // http://crbug.com/16371: We're seeing |buf->data()| return NULL. See if the | |
812 // user is passing in an IOBuffer with a NULL |data_|. | |
813 CHECK(buf); | |
814 CHECK(buf->data()); | |
815 user_read_buf_ = buf; | |
816 user_read_buf_len_ = buf_len; | |
817 | |
818 int rv = DoPayloadRead(); | |
819 if (rv == ERR_IO_PENDING) { | |
820 old_user_read_callback_ = callback; | |
821 } else { | |
822 user_read_buf_ = NULL; | |
823 user_read_buf_len_ = 0; | |
824 } | |
825 return rv; | |
826 } | |
827 int SSLClientSocketWin::Read(IOBuffer* buf, int buf_len, | |
828 const CompletionCallback& callback) { | |
829 DCHECK(completed_handshake()); | |
830 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null()); | |
831 | |
832 // If we have surplus decrypted plaintext, satisfy the Read with it without | |
833 // reading more ciphertext from the transport socket. | |
834 if (bytes_decrypted_ != 0) { | 760 if (bytes_decrypted_ != 0) { |
835 int len = std::min(buf_len, bytes_decrypted_); | 761 int len = std::min(buf_len, bytes_decrypted_); |
836 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, len, | 762 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, len, |
837 decrypted_ptr_); | 763 decrypted_ptr_); |
838 memcpy(buf->data(), decrypted_ptr_, len); | 764 memcpy(buf->data(), decrypted_ptr_, len); |
839 decrypted_ptr_ += len; | 765 decrypted_ptr_ += len; |
840 bytes_decrypted_ -= len; | 766 bytes_decrypted_ -= len; |
841 if (bytes_decrypted_ == 0) { | 767 if (bytes_decrypted_ == 0) { |
842 decrypted_ptr_ = NULL; | 768 decrypted_ptr_ = NULL; |
843 if (bytes_received_ != 0) { | 769 if (bytes_received_ != 0) { |
(...skipping 16 matching lines...) Expand all Loading... |
860 if (rv == ERR_IO_PENDING) { | 786 if (rv == ERR_IO_PENDING) { |
861 user_read_callback_ = callback; | 787 user_read_callback_ = callback; |
862 } else { | 788 } else { |
863 user_read_buf_ = NULL; | 789 user_read_buf_ = NULL; |
864 user_read_buf_len_ = 0; | 790 user_read_buf_len_ = 0; |
865 } | 791 } |
866 return rv; | 792 return rv; |
867 } | 793 } |
868 | 794 |
869 int SSLClientSocketWin::Write(IOBuffer* buf, int buf_len, | 795 int SSLClientSocketWin::Write(IOBuffer* buf, int buf_len, |
870 OldCompletionCallback* callback) { | 796 const CompletionCallback& callback) { |
871 DCHECK(completed_handshake()); | 797 DCHECK(completed_handshake()); |
872 DCHECK(!user_write_callback_); | 798 DCHECK(user_write_callback_.is_null()); |
873 | 799 |
874 DCHECK(!user_write_buf_); | 800 DCHECK(!user_write_buf_); |
875 user_write_buf_ = buf; | 801 user_write_buf_ = buf; |
876 user_write_buf_len_ = buf_len; | 802 user_write_buf_len_ = buf_len; |
877 | 803 |
878 int rv = DoPayloadEncrypt(); | 804 int rv = DoPayloadEncrypt(); |
879 if (rv != OK) | 805 if (rv != OK) |
880 return rv; | 806 return rv; |
881 | 807 |
882 rv = DoPayloadWrite(); | 808 rv = DoPayloadWrite(); |
(...skipping 16 matching lines...) Expand all Loading... |
899 | 825 |
900 void SSLClientSocketWin::OnHandshakeIOComplete(int result) { | 826 void SSLClientSocketWin::OnHandshakeIOComplete(int result) { |
901 int rv = DoLoop(result); | 827 int rv = DoLoop(result); |
902 | 828 |
903 // The SSL handshake has some round trips. We need to notify the caller of | 829 // The SSL handshake has some round trips. We need to notify the caller of |
904 // success or any error, other than waiting for IO. | 830 // success or any error, other than waiting for IO. |
905 if (rv != ERR_IO_PENDING) { | 831 if (rv != ERR_IO_PENDING) { |
906 // If there is no connect callback available to call, we are renegotiating | 832 // If there is no connect callback available to call, we are renegotiating |
907 // (which occurs because we are in the middle of a Read when the | 833 // (which occurs because we are in the middle of a Read when the |
908 // renegotiation process starts). So we complete the Read here. | 834 // renegotiation process starts). So we complete the Read here. |
909 if (!old_user_connect_callback_ && user_connect_callback_.is_null()) { | 835 if (user_connect_callback_.is_null()) { |
910 if (old_user_read_callback_) { | 836 CompletionCallback c = user_read_callback_; |
911 OldCompletionCallback* c = old_user_read_callback_; | 837 user_read_callback_.Reset(); |
912 old_user_read_callback_ = NULL; | 838 user_read_buf_ = NULL; |
913 user_read_buf_ = NULL; | 839 user_read_buf_len_ = 0; |
914 user_read_buf_len_ = 0; | 840 c.Run(rv); |
915 c->Run(rv); | |
916 } else { | |
917 CompletionCallback c = user_read_callback_; | |
918 user_read_callback_.Reset(); | |
919 user_read_buf_ = NULL; | |
920 user_read_buf_len_ = 0; | |
921 c.Run(rv); | |
922 } | |
923 return; | 841 return; |
924 } | 842 } |
925 net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT, NULL); | 843 net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT, NULL); |
926 if (old_user_connect_callback_) { | 844 CompletionCallback c = user_connect_callback_; |
927 OldCompletionCallback* c = old_user_connect_callback_; | 845 user_connect_callback_.Reset(); |
928 old_user_connect_callback_ = NULL; | 846 c.Run(rv); |
929 c->Run(rv); | |
930 } else { | |
931 CompletionCallback c = user_connect_callback_; | |
932 user_connect_callback_.Reset(); | |
933 c.Run(rv); | |
934 } | |
935 } | 847 } |
936 } | 848 } |
937 | 849 |
938 void SSLClientSocketWin::OnReadComplete(int result) { | 850 void SSLClientSocketWin::OnReadComplete(int result) { |
939 DCHECK(completed_handshake()); | 851 DCHECK(completed_handshake()); |
940 | 852 |
941 result = DoPayloadReadComplete(result); | 853 result = DoPayloadReadComplete(result); |
942 if (result > 0) | 854 if (result > 0) |
943 result = DoPayloadDecrypt(); | 855 result = DoPayloadDecrypt(); |
944 if (result != ERR_IO_PENDING) { | 856 if (result != ERR_IO_PENDING) { |
945 DCHECK(old_user_read_callback_ || !user_read_callback_.is_null()); | 857 DCHECK(!user_read_callback_.is_null()); |
946 if (old_user_read_callback_) { | 858 CompletionCallback c = user_read_callback_; |
947 OldCompletionCallback* c = old_user_read_callback_; | 859 user_read_callback_.Reset(); |
948 old_user_read_callback_ = NULL; | 860 user_read_buf_ = NULL; |
949 user_read_buf_ = NULL; | 861 user_read_buf_len_ = 0; |
950 user_read_buf_len_ = 0; | 862 c.Run(result); |
951 c->Run(result); | |
952 } else { | |
953 CompletionCallback c = user_read_callback_; | |
954 user_read_callback_.Reset(); | |
955 user_read_buf_ = NULL; | |
956 user_read_buf_len_ = 0; | |
957 c.Run(result); | |
958 } | |
959 } | 863 } |
960 } | 864 } |
961 | 865 |
962 void SSLClientSocketWin::OnWriteComplete(int result) { | 866 void SSLClientSocketWin::OnWriteComplete(int result) { |
963 DCHECK(completed_handshake()); | 867 DCHECK(completed_handshake()); |
964 | 868 |
965 int rv = DoPayloadWriteComplete(result); | 869 int rv = DoPayloadWriteComplete(result); |
966 if (rv != ERR_IO_PENDING) { | 870 if (rv != ERR_IO_PENDING) { |
967 DCHECK(user_write_callback_); | 871 DCHECK(!user_write_callback_.is_null()); |
968 OldCompletionCallback* c = user_write_callback_; | 872 CompletionCallback c = user_write_callback_; |
969 user_write_callback_ = NULL; | 873 user_write_callback_.Reset(); |
970 user_write_buf_ = NULL; | 874 user_write_buf_ = NULL; |
971 user_write_buf_len_ = 0; | 875 user_write_buf_len_ = 0; |
972 c->Run(rv); | 876 c.Run(rv); |
973 } | 877 } |
974 } | 878 } |
975 | 879 |
976 | 880 |
977 int SSLClientSocketWin::DoLoop(int last_io_result) { | 881 int SSLClientSocketWin::DoLoop(int last_io_result) { |
978 DCHECK(next_state_ != STATE_NONE); | 882 DCHECK(next_state_ != STATE_NONE); |
979 int rv = last_io_result; | 883 int rv = last_io_result; |
980 do { | 884 do { |
981 State state = next_state_; | 885 State state = next_state_; |
982 next_state_ = STATE_NONE; | 886 next_state_ = STATE_NONE; |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1024 int buf_len = kRecvBufferSize - bytes_received_; | 928 int buf_len = kRecvBufferSize - bytes_received_; |
1025 | 929 |
1026 if (buf_len <= 0) { | 930 if (buf_len <= 0) { |
1027 LOG(DFATAL) << "Receive buffer is too small!"; | 931 LOG(DFATAL) << "Receive buffer is too small!"; |
1028 return ERR_UNEXPECTED; | 932 return ERR_UNEXPECTED; |
1029 } | 933 } |
1030 | 934 |
1031 DCHECK(!transport_read_buf_); | 935 DCHECK(!transport_read_buf_); |
1032 transport_read_buf_ = new IOBuffer(buf_len); | 936 transport_read_buf_ = new IOBuffer(buf_len); |
1033 | 937 |
1034 return transport_->socket()->Read(transport_read_buf_, buf_len, | 938 return transport_->socket()->Read( |
1035 &handshake_io_callback_); | 939 transport_read_buf_, buf_len, |
| 940 base::Bind(&SSLClientSocketWin::OnHandshakeIOComplete, |
| 941 base::Unretained(this))); |
1036 } | 942 } |
1037 | 943 |
1038 int SSLClientSocketWin::DoHandshakeReadComplete(int result) { | 944 int SSLClientSocketWin::DoHandshakeReadComplete(int result) { |
1039 if (result < 0) { | 945 if (result < 0) { |
1040 transport_read_buf_ = NULL; | 946 transport_read_buf_ = NULL; |
1041 return result; | 947 return result; |
1042 } | 948 } |
1043 | 949 |
1044 if (transport_read_buf_) { | 950 if (transport_read_buf_) { |
1045 // A transition to STATE_HANDSHAKE_READ_COMPLETE is set in multiple places, | 951 // A transition to STATE_HANDSHAKE_READ_COMPLETE is set in multiple places, |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1202 // We should have something to send. | 1108 // We should have something to send. |
1203 DCHECK(send_buffer_.pvBuffer); | 1109 DCHECK(send_buffer_.pvBuffer); |
1204 DCHECK(send_buffer_.cbBuffer > 0); | 1110 DCHECK(send_buffer_.cbBuffer > 0); |
1205 DCHECK(!transport_write_buf_); | 1111 DCHECK(!transport_write_buf_); |
1206 | 1112 |
1207 const char* buf = static_cast<char*>(send_buffer_.pvBuffer) + bytes_sent_; | 1113 const char* buf = static_cast<char*>(send_buffer_.pvBuffer) + bytes_sent_; |
1208 int buf_len = send_buffer_.cbBuffer - bytes_sent_; | 1114 int buf_len = send_buffer_.cbBuffer - bytes_sent_; |
1209 transport_write_buf_ = new IOBuffer(buf_len); | 1115 transport_write_buf_ = new IOBuffer(buf_len); |
1210 memcpy(transport_write_buf_->data(), buf, buf_len); | 1116 memcpy(transport_write_buf_->data(), buf, buf_len); |
1211 | 1117 |
1212 return transport_->socket()->Write(transport_write_buf_, buf_len, | 1118 return transport_->socket()->Write( |
1213 &handshake_io_callback_); | 1119 transport_write_buf_, buf_len, |
| 1120 base::Bind(&SSLClientSocketWin::OnHandshakeIOComplete, |
| 1121 base::Unretained(this))); |
1214 } | 1122 } |
1215 | 1123 |
1216 int SSLClientSocketWin::DoHandshakeWriteComplete(int result) { | 1124 int SSLClientSocketWin::DoHandshakeWriteComplete(int result) { |
1217 DCHECK(transport_write_buf_); | 1125 DCHECK(transport_write_buf_); |
1218 transport_write_buf_ = NULL; | 1126 transport_write_buf_ = NULL; |
1219 if (result < 0) | 1127 if (result < 0) |
1220 return result; | 1128 return result; |
1221 | 1129 |
1222 DCHECK(result != 0); | 1130 DCHECK(result != 0); |
1223 | 1131 |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1301 return ERR_FAILED; | 1209 return ERR_FAILED; |
1302 } | 1210 } |
1303 | 1211 |
1304 int rv; | 1212 int rv; |
1305 // If bytes_received_, we have some data from a previous read still ready | 1213 // If bytes_received_, we have some data from a previous read still ready |
1306 // for decoding. Otherwise, we need to issue a real read. | 1214 // for decoding. Otherwise, we need to issue a real read. |
1307 if (!bytes_received_ || need_more_data_) { | 1215 if (!bytes_received_ || need_more_data_) { |
1308 DCHECK(!transport_read_buf_); | 1216 DCHECK(!transport_read_buf_); |
1309 transport_read_buf_ = new IOBuffer(buf_len); | 1217 transport_read_buf_ = new IOBuffer(buf_len); |
1310 | 1218 |
1311 rv = transport_->socket()->Read(transport_read_buf_, buf_len, | 1219 rv = transport_->socket()->Read( |
1312 &read_callback_); | 1220 transport_read_buf_, buf_len, |
| 1221 base::Bind(&SSLClientSocketWin::OnReadComplete, |
| 1222 base::Unretained(this))); |
1313 if (rv != ERR_IO_PENDING) | 1223 if (rv != ERR_IO_PENDING) |
1314 rv = DoPayloadReadComplete(rv); | 1224 rv = DoPayloadReadComplete(rv); |
1315 if (rv <= 0) | 1225 if (rv <= 0) |
1316 return rv; | 1226 return rv; |
1317 } | 1227 } |
1318 | 1228 |
1319 // Decode what we've read. If there is not enough data to decode yet, | 1229 // Decode what we've read. If there is not enough data to decode yet, |
1320 // this may return ERR_IO_PENDING still. | 1230 // this may return ERR_IO_PENDING still. |
1321 return DoPayloadDecrypt(); | 1231 return DoPayloadDecrypt(); |
1322 } | 1232 } |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1544 // We should have something to send. | 1454 // We should have something to send. |
1545 DCHECK(payload_send_buffer_.get()); | 1455 DCHECK(payload_send_buffer_.get()); |
1546 DCHECK(payload_send_buffer_len_ > 0); | 1456 DCHECK(payload_send_buffer_len_ > 0); |
1547 DCHECK(!transport_write_buf_); | 1457 DCHECK(!transport_write_buf_); |
1548 | 1458 |
1549 const char* buf = payload_send_buffer_.get() + bytes_sent_; | 1459 const char* buf = payload_send_buffer_.get() + bytes_sent_; |
1550 int buf_len = payload_send_buffer_len_ - bytes_sent_; | 1460 int buf_len = payload_send_buffer_len_ - bytes_sent_; |
1551 transport_write_buf_ = new IOBuffer(buf_len); | 1461 transport_write_buf_ = new IOBuffer(buf_len); |
1552 memcpy(transport_write_buf_->data(), buf, buf_len); | 1462 memcpy(transport_write_buf_->data(), buf, buf_len); |
1553 | 1463 |
1554 int rv = transport_->socket()->Write(transport_write_buf_, buf_len, | 1464 int rv = transport_->socket()->Write( |
1555 &write_callback_); | 1465 transport_write_buf_, buf_len, |
| 1466 base::Bind(&SSLClientSocketWin::OnWriteComplete, |
| 1467 base::Unretained(this))); |
1556 if (rv != ERR_IO_PENDING) | 1468 if (rv != ERR_IO_PENDING) |
1557 rv = DoPayloadWriteComplete(rv); | 1469 rv = DoPayloadWriteComplete(rv); |
1558 return rv; | 1470 return rv; |
1559 } | 1471 } |
1560 | 1472 |
1561 int SSLClientSocketWin::DoPayloadWriteComplete(int result) { | 1473 int SSLClientSocketWin::DoPayloadWriteComplete(int result) { |
1562 DCHECK(transport_write_buf_); | 1474 DCHECK(transport_write_buf_); |
1563 transport_write_buf_ = NULL; | 1475 transport_write_buf_ = NULL; |
1564 if (result < 0) | 1476 if (result < 0) |
1565 return result; | 1477 return result; |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1628 server_cert_ = new_server_cert; | 1540 server_cert_ = new_server_cert; |
1629 next_state_ = STATE_VERIFY_CERT; | 1541 next_state_ = STATE_VERIFY_CERT; |
1630 } | 1542 } |
1631 CertFreeCertificateContext(server_cert_handle); | 1543 CertFreeCertificateContext(server_cert_handle); |
1632 return OK; | 1544 return OK; |
1633 } | 1545 } |
1634 | 1546 |
1635 // Called when a renegotiation is completed. |result| is the verification | 1547 // Called when a renegotiation is completed. |result| is the verification |
1636 // result of the server certificate received during renegotiation. | 1548 // result of the server certificate received during renegotiation. |
1637 void SSLClientSocketWin::DidCompleteRenegotiation() { | 1549 void SSLClientSocketWin::DidCompleteRenegotiation() { |
1638 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); | 1550 DCHECK(user_connect_callback_.is_null()); |
1639 DCHECK(old_user_read_callback_ || !user_read_callback_.is_null()); | 1551 DCHECK(!user_read_callback_.is_null()); |
1640 renegotiating_ = false; | 1552 renegotiating_ = false; |
1641 next_state_ = STATE_COMPLETED_RENEGOTIATION; | 1553 next_state_ = STATE_COMPLETED_RENEGOTIATION; |
1642 } | 1554 } |
1643 | 1555 |
1644 void SSLClientSocketWin::LogConnectionTypeMetrics() const { | 1556 void SSLClientSocketWin::LogConnectionTypeMetrics() const { |
1645 UpdateConnectionTypeHistograms(CONNECTION_SSL); | 1557 UpdateConnectionTypeHistograms(CONNECTION_SSL); |
1646 if (server_cert_verify_result_.has_md5) | 1558 if (server_cert_verify_result_.has_md5) |
1647 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD5); | 1559 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD5); |
1648 if (server_cert_verify_result_.has_md2) | 1560 if (server_cert_verify_result_.has_md2) |
1649 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD2); | 1561 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD2); |
1650 if (server_cert_verify_result_.has_md4) | 1562 if (server_cert_verify_result_.has_md4) |
1651 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD4); | 1563 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD4); |
1652 if (server_cert_verify_result_.has_md5_ca) | 1564 if (server_cert_verify_result_.has_md5_ca) |
1653 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD5_CA); | 1565 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD5_CA); |
1654 if (server_cert_verify_result_.has_md2_ca) | 1566 if (server_cert_verify_result_.has_md2_ca) |
1655 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD2_CA); | 1567 UpdateConnectionTypeHistograms(CONNECTION_SSL_MD2_CA); |
1656 } | 1568 } |
1657 | 1569 |
1658 void SSLClientSocketWin::FreeSendBuffer() { | 1570 void SSLClientSocketWin::FreeSendBuffer() { |
1659 SECURITY_STATUS status = FreeContextBuffer(send_buffer_.pvBuffer); | 1571 SECURITY_STATUS status = FreeContextBuffer(send_buffer_.pvBuffer); |
1660 DCHECK(status == SEC_E_OK); | 1572 DCHECK(status == SEC_E_OK); |
1661 memset(&send_buffer_, 0, sizeof(send_buffer_)); | 1573 memset(&send_buffer_, 0, sizeof(send_buffer_)); |
1662 } | 1574 } |
1663 | 1575 |
1664 } // namespace net | 1576 } // namespace net |
OLD | NEW |