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

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

Issue 11366155: SSLClientSocket::IsConnected should care for internal buffers (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: remove comments Created 7 years, 11 months 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
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« net/socket/ssl_client_socket_nss.h ('K') | « net/socket/ssl_client_socket_nss.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698