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 // This file includes code SSLClientSocketNSS::DoVerifyCertComplete() derived | 5 // This file includes code SSLClientSocketNSS::DoVerifyCertComplete() derived |
6 // from AuthCertificateCallback() in | 6 // from AuthCertificateCallback() in |
7 // mozilla/security/manager/ssl/src/nsNSSCallbacks.cpp. | 7 // mozilla/security/manager/ssl/src/nsNSSCallbacks.cpp. |
8 | 8 |
9 /* ***** BEGIN LICENSE BLOCK ***** | 9 /* ***** BEGIN LICENSE BLOCK ***** |
10 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | 10 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 |
(...skipping 624 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
635 // any time. | 635 // any time. |
636 const HandshakeState& state() const { return network_handshake_state_; } | 636 const HandshakeState& state() const { return network_handshake_state_; } |
637 | 637 |
638 // Called on the network task runner. | 638 // Called on the network task runner. |
639 // Read() and Write() mirror the net::Socket functions of the same name. | 639 // Read() and Write() mirror the net::Socket functions of the same name. |
640 // If ERR_IO_PENDING is returned, |callback| will be invoked on the network | 640 // If ERR_IO_PENDING is returned, |callback| will be invoked on the network |
641 // task runner at a later point, unless the caller calls Detach(). | 641 // task runner at a later point, unless the caller calls Detach(). |
642 int Read(IOBuffer* buf, int buf_len, const CompletionCallback& callback); | 642 int Read(IOBuffer* buf, int buf_len, const CompletionCallback& callback); |
643 int Write(IOBuffer* buf, int buf_len, const CompletionCallback& callback); | 643 int Write(IOBuffer* buf, int buf_len, const CompletionCallback& callback); |
644 | 644 |
645 // Called on the network task runner. | |
646 bool IsClosed(); | |
647 bool HasPendingAsyncOperation(); | |
648 bool HasUnhandledReceivedData(); | |
649 | |
645 private: | 650 private: |
646 friend class base::RefCountedThreadSafe<Core>; | 651 friend class base::RefCountedThreadSafe<Core>; |
647 ~Core(); | 652 ~Core(); |
648 | 653 |
649 enum State { | 654 enum State { |
650 STATE_NONE, | 655 STATE_NONE, |
651 STATE_HANDSHAKE, | 656 STATE_HANDSHAKE, |
652 STATE_GET_DOMAIN_BOUND_CERT_COMPLETE, | 657 STATE_GET_DOMAIN_BOUND_CERT_COMPLETE, |
653 }; | 658 }; |
654 | 659 |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
733 bool DoTransportIO(); | 738 bool DoTransportIO(); |
734 int BufferRecv(); | 739 int BufferRecv(); |
735 int BufferSend(); | 740 int BufferSend(); |
736 | 741 |
737 void OnRecvComplete(int result); | 742 void OnRecvComplete(int result); |
738 void OnSendComplete(int result); | 743 void OnSendComplete(int result); |
739 | 744 |
740 void DoConnectCallback(int result); | 745 void DoConnectCallback(int result); |
741 void DoReadCallback(int result); | 746 void DoReadCallback(int result); |
742 void DoWriteCallback(int result); | 747 void DoWriteCallback(int result); |
748 void UpdateNSSTaskRunnerStatus(int amount_in_read_buffer, | |
749 bool closed, | |
750 bool operation_is_read, | |
751 const base::Closure& callback); | |
743 | 752 |
744 // Client channel ID handler. | 753 // Client channel ID handler. |
745 static SECStatus ClientChannelIDHandler( | 754 static SECStatus ClientChannelIDHandler( |
746 void* arg, | 755 void* arg, |
747 PRFileDesc* socket, | 756 PRFileDesc* socket, |
748 SECKEYPublicKey **out_public_key, | 757 SECKEYPublicKey **out_public_key, |
749 SECKEYPrivateKey **out_private_key); | 758 SECKEYPrivateKey **out_private_key); |
750 | 759 |
751 // ImportChannelIDKeys is a helper function for turning a DER-encoded cert and | 760 // ImportChannelIDKeys is a helper function for turning a DER-encoded cert and |
752 // key into a SECKEYPublicKey and SECKEYPrivateKey. Returns OK upon success | 761 // key into a SECKEYPublicKey and SECKEYPrivateKey. Returns OK upon success |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
810 ClientSocketHandle* transport_; | 819 ClientSocketHandle* transport_; |
811 base::WeakPtrFactory<BoundNetLog> weak_net_log_factory_; | 820 base::WeakPtrFactory<BoundNetLog> weak_net_log_factory_; |
812 | 821 |
813 // The current handshake state. Mirrors |nss_handshake_state_|. | 822 // The current handshake state. Mirrors |nss_handshake_state_|. |
814 HandshakeState network_handshake_state_; | 823 HandshakeState network_handshake_state_; |
815 | 824 |
816 // The service for retrieving Channel ID keys. May be NULL. | 825 // The service for retrieving Channel ID keys. May be NULL. |
817 ServerBoundCertService* server_bound_cert_service_; | 826 ServerBoundCertService* server_bound_cert_service_; |
818 ServerBoundCertService::RequestHandle domain_bound_cert_request_handle_; | 827 ServerBoundCertService::RequestHandle domain_bound_cert_request_handle_; |
819 | 828 |
829 // The information about NSS task runner. | |
830 int unhandled_buffer_size_; | |
831 bool nss_waiting_read_; | |
832 bool nss_waiting_write_; | |
833 bool nss_is_closed_; | |
834 | |
820 //////////////////////////////////////////////////////////////////////////// | 835 //////////////////////////////////////////////////////////////////////////// |
821 // Members that are ONLY accessed on the NSS task runner: | 836 // Members that are ONLY accessed on the NSS task runner: |
822 //////////////////////////////////////////////////////////////////////////// | 837 //////////////////////////////////////////////////////////////////////////// |
823 HostPortPair host_and_port_; | 838 HostPortPair host_and_port_; |
824 SSLConfig ssl_config_; | 839 SSLConfig ssl_config_; |
825 | 840 |
826 // NSS SSL socket. | 841 // NSS SSL socket. |
827 PRFileDesc* nss_fd_; | 842 PRFileDesc* nss_fd_; |
828 | 843 |
829 // Buffers for the network end of the SSL state machine | 844 // Buffers for the network end of the SSL state machine |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
889 base::SequencedTaskRunner* nss_task_runner, | 904 base::SequencedTaskRunner* nss_task_runner, |
890 ClientSocketHandle* transport, | 905 ClientSocketHandle* transport, |
891 const HostPortPair& host_and_port, | 906 const HostPortPair& host_and_port, |
892 const SSLConfig& ssl_config, | 907 const SSLConfig& ssl_config, |
893 BoundNetLog* net_log, | 908 BoundNetLog* net_log, |
894 ServerBoundCertService* server_bound_cert_service) | 909 ServerBoundCertService* server_bound_cert_service) |
895 : detached_(false), | 910 : detached_(false), |
896 transport_(transport), | 911 transport_(transport), |
897 weak_net_log_factory_(net_log), | 912 weak_net_log_factory_(net_log), |
898 server_bound_cert_service_(server_bound_cert_service), | 913 server_bound_cert_service_(server_bound_cert_service), |
914 unhandled_buffer_size_(0), | |
915 nss_waiting_read_(false), | |
916 nss_waiting_write_(false), | |
917 nss_is_closed_(false), | |
899 host_and_port_(host_and_port), | 918 host_and_port_(host_and_port), |
900 ssl_config_(ssl_config), | 919 ssl_config_(ssl_config), |
901 nss_fd_(NULL), | 920 nss_fd_(NULL), |
902 nss_bufs_(NULL), | 921 nss_bufs_(NULL), |
903 next_handshake_state_(STATE_NONE), | 922 next_handshake_state_(STATE_NONE), |
904 channel_id_xtn_negotiated_(false), | 923 channel_id_xtn_negotiated_(false), |
905 channel_id_needed_(false), | 924 channel_id_needed_(false), |
906 client_auth_cert_needed_(false), | 925 client_auth_cert_needed_(false), |
907 handshake_callback_called_(false), | 926 handshake_callback_called_(false), |
908 transport_recv_busy_(false), | 927 transport_recv_busy_(false), |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1097 return posted ? ERR_IO_PENDING : ERR_ABORTED; | 1116 return posted ? ERR_IO_PENDING : ERR_ABORTED; |
1098 } | 1117 } |
1099 | 1118 |
1100 DCHECK(OnNSSTaskRunner()); | 1119 DCHECK(OnNSSTaskRunner()); |
1101 DCHECK(handshake_callback_called_); | 1120 DCHECK(handshake_callback_called_); |
1102 DCHECK_EQ(STATE_NONE, next_handshake_state_); | 1121 DCHECK_EQ(STATE_NONE, next_handshake_state_); |
1103 DCHECK(user_read_callback_.is_null()); | 1122 DCHECK(user_read_callback_.is_null()); |
1104 DCHECK(user_connect_callback_.is_null()); | 1123 DCHECK(user_connect_callback_.is_null()); |
1105 DCHECK(!user_read_buf_); | 1124 DCHECK(!user_read_buf_); |
1106 DCHECK(nss_bufs_); | 1125 DCHECK(nss_bufs_); |
1126 DCHECK(!nss_waiting_read_); | |
1107 | 1127 |
1108 user_read_buf_ = buf; | 1128 user_read_buf_ = buf; |
1109 user_read_buf_len_ = buf_len; | 1129 user_read_buf_len_ = buf_len; |
1110 | 1130 |
1111 int rv = DoReadLoop(OK); | 1131 int rv = DoReadLoop(OK); |
1112 if (rv == ERR_IO_PENDING) { | 1132 if (rv == ERR_IO_PENDING) { |
1113 user_read_callback_ = callback; | 1133 user_read_callback_ = callback; |
1134 nss_waiting_read_ = true; | |
1114 } else { | 1135 } else { |
1115 user_read_buf_ = NULL; | 1136 user_read_buf_ = NULL; |
1116 user_read_buf_len_ = 0; | 1137 user_read_buf_len_ = 0; |
1117 | 1138 |
1118 if (!OnNetworkTaskRunner()) { | 1139 if (!OnNetworkTaskRunner()) { |
1119 PostOrRunCallback(FROM_HERE, base::Bind(callback, rv)); | 1140 PostOrRunCallback(FROM_HERE, base::Bind(callback, rv)); |
1120 return ERR_IO_PENDING; | 1141 return ERR_IO_PENDING; |
1121 } | 1142 } |
1122 } | 1143 } |
1123 | 1144 |
(...skipping 15 matching lines...) Expand all Loading... | |
1139 return rv; | 1160 return rv; |
1140 } | 1161 } |
1141 | 1162 |
1142 DCHECK(OnNSSTaskRunner()); | 1163 DCHECK(OnNSSTaskRunner()); |
1143 DCHECK(handshake_callback_called_); | 1164 DCHECK(handshake_callback_called_); |
1144 DCHECK_EQ(STATE_NONE, next_handshake_state_); | 1165 DCHECK_EQ(STATE_NONE, next_handshake_state_); |
1145 DCHECK(user_write_callback_.is_null()); | 1166 DCHECK(user_write_callback_.is_null()); |
1146 DCHECK(user_connect_callback_.is_null()); | 1167 DCHECK(user_connect_callback_.is_null()); |
1147 DCHECK(!user_write_buf_); | 1168 DCHECK(!user_write_buf_); |
1148 DCHECK(nss_bufs_); | 1169 DCHECK(nss_bufs_); |
1170 DCHECK(!nss_waiting_write_); | |
1149 | 1171 |
1150 user_write_buf_ = buf; | 1172 user_write_buf_ = buf; |
1151 user_write_buf_len_ = buf_len; | 1173 user_write_buf_len_ = buf_len; |
1152 | 1174 |
1153 int rv = DoWriteLoop(OK); | 1175 int rv = DoWriteLoop(OK); |
1154 if (rv == ERR_IO_PENDING) { | 1176 if (rv == ERR_IO_PENDING) { |
1155 user_write_callback_ = callback; | 1177 user_write_callback_ = callback; |
1178 nss_waiting_write_ = true; | |
1156 } else { | 1179 } else { |
1157 user_write_buf_ = NULL; | 1180 user_write_buf_ = NULL; |
1158 user_write_buf_len_ = 0; | 1181 user_write_buf_len_ = 0; |
1159 | 1182 |
1160 if (!OnNetworkTaskRunner()) { | 1183 if (!OnNetworkTaskRunner()) { |
1161 PostOrRunCallback(FROM_HERE, base::Bind(callback, rv)); | 1184 PostOrRunCallback(FROM_HERE, base::Bind(callback, rv)); |
1162 return ERR_IO_PENDING; | 1185 return ERR_IO_PENDING; |
1163 } | 1186 } |
1164 } | 1187 } |
1165 | 1188 |
1166 return rv; | 1189 return rv; |
1167 } | 1190 } |
1168 | 1191 |
1192 bool SSLClientSocketNSS::Core::IsClosed() { | |
1193 return nss_is_closed_; | |
1194 } | |
1195 | |
1196 bool SSLClientSocketNSS::Core::HasPendingAsyncOperation() { | |
1197 DCHECK(OnNetworkTaskRunner()); | |
1198 return nss_waiting_read_ || nss_waiting_write_; | |
1199 } | |
1200 | |
1201 bool SSLClientSocketNSS::Core::HasUnhandledReceivedData() { | |
1202 DCHECK(OnNetworkTaskRunner()); | |
1203 return unhandled_buffer_size_ != 0; | |
1204 } | |
1205 | |
1169 bool SSLClientSocketNSS::Core::OnNSSTaskRunner() const { | 1206 bool SSLClientSocketNSS::Core::OnNSSTaskRunner() const { |
1170 return nss_task_runner_->RunsTasksOnCurrentThread(); | 1207 return nss_task_runner_->RunsTasksOnCurrentThread(); |
1171 } | 1208 } |
1172 | 1209 |
1173 bool SSLClientSocketNSS::Core::OnNetworkTaskRunner() const { | 1210 bool SSLClientSocketNSS::Core::OnNetworkTaskRunner() const { |
1174 return network_task_runner_->RunsTasksOnCurrentThread(); | 1211 return network_task_runner_->RunsTasksOnCurrentThread(); |
1175 } | 1212 } |
1176 | 1213 |
1177 // static | 1214 // static |
1178 SECStatus SSLClientSocketNSS::Core::OwnAuthCertHandler( | 1215 SECStatus SSLClientSocketNSS::Core::OwnAuthCertHandler( |
(...skipping 857 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2036 SetChannelIDProvided(); | 2073 SetChannelIDProvided(); |
2037 GotoState(STATE_HANDSHAKE); | 2074 GotoState(STATE_HANDSHAKE); |
2038 return OK; | 2075 return OK; |
2039 } | 2076 } |
2040 | 2077 |
2041 int SSLClientSocketNSS::Core::DoPayloadRead() { | 2078 int SSLClientSocketNSS::Core::DoPayloadRead() { |
2042 DCHECK(OnNSSTaskRunner()); | 2079 DCHECK(OnNSSTaskRunner()); |
2043 DCHECK(user_read_buf_); | 2080 DCHECK(user_read_buf_); |
2044 DCHECK_GT(user_read_buf_len_, 0); | 2081 DCHECK_GT(user_read_buf_len_, 0); |
2045 | 2082 |
2046 int rv = PR_Read(nss_fd_, user_read_buf_->data(), user_read_buf_len_); | 2083 int rv = PR_Read(nss_fd_, user_read_buf_->data(), user_read_buf_len_); |
wtc
2013/01/16 00:34:16
PR_Read may consume the unhandled data in the memi
Takashi Toyoshima
2013/01/16 07:16:03
I define enum Operation type and use it in UpdateN
| |
2047 if (client_auth_cert_needed_) { | 2084 if (client_auth_cert_needed_) { |
2048 // We don't need to invalidate the non-client-authenticated SSL session | 2085 // We don't need to invalidate the non-client-authenticated SSL session |
2049 // because the server will renegotiate anyway. | 2086 // because the server will renegotiate anyway. |
2050 rv = ERR_SSL_CLIENT_AUTH_CERT_NEEDED; | 2087 rv = ERR_SSL_CLIENT_AUTH_CERT_NEEDED; |
2051 PostOrRunCallback( | 2088 PostOrRunCallback( |
2052 FROM_HERE, | 2089 FROM_HERE, |
2053 base::Bind(&AddLogEventWithCallback, weak_net_log_, | 2090 base::Bind(&AddLogEventWithCallback, weak_net_log_, |
2054 NetLog::TYPE_SSL_READ_ERROR, | 2091 NetLog::TYPE_SSL_READ_ERROR, |
2055 CreateNetLogSSLErrorCallback(rv, 0))); | 2092 CreateNetLogSSLErrorCallback(rv, 0))); |
2056 return rv; | 2093 return rv; |
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2280 PostOrRunCallback(FROM_HERE, c); | 2317 PostOrRunCallback(FROM_HERE, c); |
2281 } | 2318 } |
2282 | 2319 |
2283 void SSLClientSocketNSS::Core::DoReadCallback(int rv) { | 2320 void SSLClientSocketNSS::Core::DoReadCallback(int rv) { |
2284 DCHECK(OnNSSTaskRunner()); | 2321 DCHECK(OnNSSTaskRunner()); |
2285 DCHECK_NE(ERR_IO_PENDING, rv); | 2322 DCHECK_NE(ERR_IO_PENDING, rv); |
2286 DCHECK(!user_read_callback_.is_null()); | 2323 DCHECK(!user_read_callback_.is_null()); |
2287 | 2324 |
2288 user_read_buf_ = NULL; | 2325 user_read_buf_ = NULL; |
2289 user_read_buf_len_ = 0; | 2326 user_read_buf_len_ = 0; |
2290 base::Closure c = base::Bind( | 2327 char* buf; |
2291 base::ResetAndReturn(&user_read_callback_), | 2328 int amount_in_read_buffer = memio_GetReadParams(nss_bufs_, &buf); |
wtc
2013/01/16 00:34:16
BUG(?): I believe this is wrong.
The return value
Takashi Toyoshima
2013/01/16 07:16:03
Done.
I expose it as memio_GetReadableBufferSize()
| |
2292 rv); | 2329 // This will invoke the user callback with |rv| as result. |
2293 PostOrRunCallback(FROM_HERE, c); | 2330 base::Closure user_cb = base::Bind( |
2331 base::ResetAndReturn(&user_read_callback_), rv); | |
2332 // This is used to curry the |amount_int_read_buffer| and |user_cb| back to | |
2333 // the network task runner. | |
2334 base::Closure task = base::Bind( | |
2335 &Core::UpdateNSSTaskRunnerStatus, | |
2336 this, | |
2337 amount_in_read_buffer, | |
2338 rv <= 0, // EOF or errors. | |
2339 true, // Operation is read. | |
2340 user_cb); | |
2341 PostOrRunCallback(FROM_HERE, task); | |
2294 } | 2342 } |
2295 | 2343 |
2296 void SSLClientSocketNSS::Core::DoWriteCallback(int rv) { | 2344 void SSLClientSocketNSS::Core::DoWriteCallback(int rv) { |
2297 DCHECK(OnNSSTaskRunner()); | 2345 DCHECK(OnNSSTaskRunner()); |
2298 DCHECK_NE(ERR_IO_PENDING, rv); | 2346 DCHECK_NE(ERR_IO_PENDING, rv); |
2299 DCHECK(!user_write_callback_.is_null()); | 2347 DCHECK(!user_write_callback_.is_null()); |
2300 | 2348 |
2301 // Since Run may result in Write being called, clear |user_write_callback_| | 2349 // Since Run may result in Write being called, clear |user_write_callback_| |
2302 // up front. | 2350 // up front. |
2303 user_write_buf_ = NULL; | 2351 user_write_buf_ = NULL; |
2304 user_write_buf_len_ = 0; | 2352 user_write_buf_len_ = 0; |
2305 base::Closure c = base::Bind( | 2353 char* buf; |
2306 base::ResetAndReturn(&user_write_callback_), | 2354 // Update buffer status because DoWriteLoop called DoTransportIO which may |
2307 rv); | 2355 // perform read operations. |
2308 PostOrRunCallback(FROM_HERE, c); | 2356 int amount_in_read_buffer = memio_GetReadParams(nss_bufs_, &buf); |
2357 // This will invoke the user callback with |rv| as result. | |
2358 base::Closure user_cb = base::Bind( | |
2359 base::ResetAndReturn(&user_write_callback_), rv); | |
2360 // This is used to curry the |amount_int_read_buffer| and |user_cb| back to | |
2361 // the network task runner. | |
2362 base::Closure task = base::Bind( | |
2363 &Core::UpdateNSSTaskRunnerStatus, | |
2364 this, | |
2365 amount_in_read_buffer, | |
2366 rv < 0, // Errors. | |
2367 false, // Operation is not read, but write. | |
2368 user_cb); | |
2369 PostOrRunCallback(FROM_HERE, task); | |
2370 } | |
2371 | |
2372 void SSLClientSocketNSS::Core::UpdateNSSTaskRunnerStatus( | |
2373 int amount_in_read_buffer, | |
2374 bool closed, | |
2375 bool operation_is_read, | |
2376 const base::Closure& callback) { | |
2377 DCHECK(OnNetworkTaskRunner()); | |
2378 DCHECK(!callback.is_null()); | |
2379 DCHECK((operation_is_read && nss_waiting_read_) || | |
2380 (!operation_is_read && nss_waiting_write_)); | |
2381 | |
2382 unhandled_buffer_size_ = amount_in_read_buffer; | |
2383 if (closed) | |
2384 nss_is_closed_ = true; | |
2385 if (operation_is_read) | |
2386 nss_waiting_read_ = false; | |
2387 else | |
2388 nss_waiting_write_ = false; | |
2389 callback.Run(); | |
2309 } | 2390 } |
2310 | 2391 |
2311 SECStatus SSLClientSocketNSS::Core::ClientChannelIDHandler( | 2392 SECStatus SSLClientSocketNSS::Core::ClientChannelIDHandler( |
2312 void* arg, | 2393 void* arg, |
2313 PRFileDesc* socket, | 2394 PRFileDesc* socket, |
2314 SECKEYPublicKey **out_public_key, | 2395 SECKEYPublicKey **out_public_key, |
2315 SECKEYPrivateKey **out_private_key) { | 2396 SECKEYPrivateKey **out_private_key) { |
2316 Core* core = reinterpret_cast<Core*>(arg); | 2397 Core* core = reinterpret_cast<Core*>(arg); |
2317 DCHECK(core->OnNSSTaskRunner()); | 2398 DCHECK(core->OnNSSTaskRunner()); |
2318 | 2399 |
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2727 const SSLConfig& ssl_config, | 2808 const SSLConfig& ssl_config, |
2728 const SSLClientSocketContext& context) | 2809 const SSLClientSocketContext& context) |
2729 : nss_task_runner_(nss_task_runner), | 2810 : nss_task_runner_(nss_task_runner), |
2730 transport_(transport_socket), | 2811 transport_(transport_socket), |
2731 host_and_port_(host_and_port), | 2812 host_and_port_(host_and_port), |
2732 ssl_config_(ssl_config), | 2813 ssl_config_(ssl_config), |
2733 cert_verifier_(context.cert_verifier), | 2814 cert_verifier_(context.cert_verifier), |
2734 server_bound_cert_service_(context.server_bound_cert_service), | 2815 server_bound_cert_service_(context.server_bound_cert_service), |
2735 ssl_session_cache_shard_(context.ssl_session_cache_shard), | 2816 ssl_session_cache_shard_(context.ssl_session_cache_shard), |
2736 completed_handshake_(false), | 2817 completed_handshake_(false), |
2818 ssl_is_closed_(false), | |
2737 next_handshake_state_(STATE_NONE), | 2819 next_handshake_state_(STATE_NONE), |
2738 nss_fd_(NULL), | 2820 nss_fd_(NULL), |
2739 net_log_(transport_socket->socket()->NetLog()), | 2821 net_log_(transport_socket->socket()->NetLog()), |
2740 transport_security_state_(context.transport_security_state), | 2822 transport_security_state_(context.transport_security_state), |
2741 valid_thread_id_(base::kInvalidThreadId) { | 2823 valid_thread_id_(base::kInvalidThreadId) { |
2742 EnterFunction(""); | 2824 EnterFunction(""); |
2743 InitCore(); | 2825 InitCore(); |
2744 LeaveFunction(""); | 2826 LeaveFunction(""); |
2745 } | 2827 } |
2746 | 2828 |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2915 user_connect_callback_.Reset(); | 2997 user_connect_callback_.Reset(); |
2916 server_cert_verify_result_.Reset(); | 2998 server_cert_verify_result_.Reset(); |
2917 completed_handshake_ = false; | 2999 completed_handshake_ = false; |
2918 start_cert_verification_time_ = base::TimeTicks(); | 3000 start_cert_verification_time_ = base::TimeTicks(); |
2919 InitCore(); | 3001 InitCore(); |
2920 | 3002 |
2921 LeaveFunction(""); | 3003 LeaveFunction(""); |
2922 } | 3004 } |
2923 | 3005 |
2924 bool SSLClientSocketNSS::IsConnected() const { | 3006 bool SSLClientSocketNSS::IsConnected() const { |
2925 // Ideally, we should also check if we have received the close_notify alert | |
2926 // message from the server, and return false in that case. We're not doing | |
2927 // that, so this function may return a false positive. Since the upper | |
2928 // layer (HttpNetworkTransaction) needs to handle a persistent connection | |
2929 // closed by the server when we send a request anyway, a false positive in | |
2930 // exchange for simpler code is a good trade-off. | |
2931 EnterFunction(""); | 3007 EnterFunction(""); |
2932 bool ret = completed_handshake_ && transport_->socket()->IsConnected(); | 3008 bool ret = completed_handshake_ && |
3009 !ssl_is_closed_ && | |
3010 !core_->IsClosed() && | |
wtc
2013/01/16 00:34:16
Why do we need both ssl_is_closed_ and core_->IsCl
Takashi Toyoshima
2013/01/16 07:16:03
ssl_is_closed_ is for synchronous completion case,
Ryan Sleevi
2013/01/18 00:03:24
I'm not sure I understand this. Both synchronous a
Takashi Toyoshima
2013/01/21 14:51:16
OK, I move the logic for ssl_is_closed_ into core_
| |
3011 (core_->HasPendingAsyncOperation() || | |
3012 core_->HasUnhandledReceivedData() || | |
3013 transport_->socket()->IsConnected()); | |
2933 LeaveFunction(""); | 3014 LeaveFunction(""); |
2934 return ret; | 3015 return ret; |
2935 } | 3016 } |
2936 | 3017 |
2937 bool SSLClientSocketNSS::IsConnectedAndIdle() const { | 3018 bool SSLClientSocketNSS::IsConnectedAndIdle() const { |
2938 // Unlike IsConnected, this method doesn't return a false positive. | |
2939 // | |
2940 // Strictly speaking, we should check if we have received the close_notify | |
2941 // alert message from the server, and return false in that case. Although | |
2942 // the close_notify alert message means EOF in the SSL layer, it is just | |
2943 // bytes to the transport layer below, so | |
2944 // transport_->socket()->IsConnectedAndIdle() returns the desired false | |
2945 // when we receive close_notify. | |
2946 EnterFunction(""); | 3019 EnterFunction(""); |
2947 bool ret = completed_handshake_ && transport_->socket()->IsConnectedAndIdle(); | 3020 bool ret = IsConnected() && |
3021 !core_->HasUnhandledReceivedData() && | |
3022 transport_->socket()->IsConnectedAndIdle(); | |
2948 LeaveFunction(""); | 3023 LeaveFunction(""); |
2949 return ret; | 3024 return ret; |
2950 } | 3025 } |
2951 | 3026 |
2952 int SSLClientSocketNSS::GetPeerAddress(IPEndPoint* address) const { | 3027 int SSLClientSocketNSS::GetPeerAddress(IPEndPoint* address) const { |
2953 return transport_->socket()->GetPeerAddress(address); | 3028 return transport_->socket()->GetPeerAddress(address); |
2954 } | 3029 } |
2955 | 3030 |
2956 int SSLClientSocketNSS::GetLocalAddress(IPEndPoint* address) const { | 3031 int SSLClientSocketNSS::GetLocalAddress(IPEndPoint* address) const { |
2957 return transport_->socket()->GetLocalAddress(address); | 3032 return transport_->socket()->GetLocalAddress(address); |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3009 return base::TimeDelta::FromMicroseconds(-1); | 3084 return base::TimeDelta::FromMicroseconds(-1); |
3010 } | 3085 } |
3011 | 3086 |
3012 int SSLClientSocketNSS::Read(IOBuffer* buf, int buf_len, | 3087 int SSLClientSocketNSS::Read(IOBuffer* buf, int buf_len, |
3013 const CompletionCallback& callback) { | 3088 const CompletionCallback& callback) { |
3014 DCHECK(core_); | 3089 DCHECK(core_); |
3015 DCHECK(!callback.is_null()); | 3090 DCHECK(!callback.is_null()); |
3016 | 3091 |
3017 EnterFunction(buf_len); | 3092 EnterFunction(buf_len); |
3018 int rv = core_->Read(buf, buf_len, callback); | 3093 int rv = core_->Read(buf, buf_len, callback); |
3094 if (rv <= 0 && rv != ERR_IO_PENDING) | |
3095 ssl_is_closed_ = true; | |
3019 LeaveFunction(rv); | 3096 LeaveFunction(rv); |
3020 | 3097 |
3021 return rv; | 3098 return rv; |
3022 } | 3099 } |
3023 | 3100 |
3024 int SSLClientSocketNSS::Write(IOBuffer* buf, int buf_len, | 3101 int SSLClientSocketNSS::Write(IOBuffer* buf, int buf_len, |
3025 const CompletionCallback& callback) { | 3102 const CompletionCallback& callback) { |
3026 DCHECK(core_); | 3103 DCHECK(core_); |
3027 DCHECK(!callback.is_null()); | 3104 DCHECK(!callback.is_null()); |
3028 | 3105 |
3029 EnterFunction(buf_len); | 3106 EnterFunction(buf_len); |
3030 int rv = core_->Write(buf, buf_len, callback); | 3107 int rv = core_->Write(buf, buf_len, callback); |
3108 if (rv < 0 && rv != ERR_IO_PENDING) | |
3109 ssl_is_closed_ = true; | |
3031 LeaveFunction(rv); | 3110 LeaveFunction(rv); |
3032 | 3111 |
3033 return rv; | 3112 return rv; |
3034 } | 3113 } |
3035 | 3114 |
3036 bool SSLClientSocketNSS::SetReceiveBufferSize(int32 size) { | 3115 bool SSLClientSocketNSS::SetReceiveBufferSize(int32 size) { |
3037 return transport_->socket()->SetReceiveBufferSize(size); | 3116 return transport_->socket()->SetReceiveBufferSize(size); |
3038 } | 3117 } |
3039 | 3118 |
3040 bool SSLClientSocketNSS::SetSendBufferSize(int32 size) { | 3119 bool SSLClientSocketNSS::SetSendBufferSize(int32 size) { |
(...skipping 450 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3491 EnsureThreadIdAssigned(); | 3570 EnsureThreadIdAssigned(); |
3492 base::AutoLock auto_lock(lock_); | 3571 base::AutoLock auto_lock(lock_); |
3493 return valid_thread_id_ == base::PlatformThread::CurrentId(); | 3572 return valid_thread_id_ == base::PlatformThread::CurrentId(); |
3494 } | 3573 } |
3495 | 3574 |
3496 ServerBoundCertService* SSLClientSocketNSS::GetServerBoundCertService() const { | 3575 ServerBoundCertService* SSLClientSocketNSS::GetServerBoundCertService() const { |
3497 return server_bound_cert_service_; | 3576 return server_bound_cert_service_; |
3498 } | 3577 } |
3499 | 3578 |
3500 } // namespace net | 3579 } // namespace net |
OLD | NEW |