| 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/http/http_stream_factory_impl_job.h" | 5 #include "net/http/http_stream_factory_impl_job.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/stl_util-inl.h" | 8 #include "base/stl_util-inl.h" |
| 9 #include "base/string_number_conversions.h" | 9 #include "base/string_number_conversions.h" |
| 10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 127 return LOAD_STATE_RESOLVING_PROXY_FOR_URL; | 127 return LOAD_STATE_RESOLVING_PROXY_FOR_URL; |
| 128 case STATE_CREATE_STREAM_COMPLETE: | 128 case STATE_CREATE_STREAM_COMPLETE: |
| 129 return connection_->GetLoadState(); | 129 return connection_->GetLoadState(); |
| 130 case STATE_INIT_CONNECTION_COMPLETE: | 130 case STATE_INIT_CONNECTION_COMPLETE: |
| 131 return LOAD_STATE_SENDING_REQUEST; | 131 return LOAD_STATE_SENDING_REQUEST; |
| 132 default: | 132 default: |
| 133 return LOAD_STATE_IDLE; | 133 return LOAD_STATE_IDLE; |
| 134 } | 134 } |
| 135 } | 135 } |
| 136 | 136 |
| 137 void HttpStreamFactoryImpl::Job::Orphan(const Request* request) { |
| 138 DCHECK_EQ(request_, request); |
| 139 request_ = NULL; |
| 140 } |
| 141 |
| 137 bool HttpStreamFactoryImpl::Job::was_alternate_protocol_available() const { | 142 bool HttpStreamFactoryImpl::Job::was_alternate_protocol_available() const { |
| 138 return was_alternate_protocol_available_; | 143 return was_alternate_protocol_available_; |
| 139 } | 144 } |
| 140 | 145 |
| 141 bool HttpStreamFactoryImpl::Job::was_npn_negotiated() const { | 146 bool HttpStreamFactoryImpl::Job::was_npn_negotiated() const { |
| 142 return was_npn_negotiated_; | 147 return was_npn_negotiated_; |
| 143 } | 148 } |
| 144 | 149 |
| 145 bool HttpStreamFactoryImpl::Job::using_spdy() const { | 150 bool HttpStreamFactoryImpl::Job::using_spdy() const { |
| 146 return using_spdy_; | 151 return using_spdy_; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 158 DCHECK(using_ssl_); | 163 DCHECK(using_ssl_); |
| 159 DCHECK(!establishing_tunnel_); | 164 DCHECK(!establishing_tunnel_); |
| 160 DCHECK(connection_.get() && connection_->socket()); | 165 DCHECK(connection_.get() && connection_->socket()); |
| 161 SSLClientSocket* ssl_socket = | 166 SSLClientSocket* ssl_socket = |
| 162 static_cast<SSLClientSocket*>(connection_->socket()); | 167 static_cast<SSLClientSocket*>(connection_->socket()); |
| 163 ssl_socket->GetSSLInfo(&ssl_info_); | 168 ssl_socket->GetSSLInfo(&ssl_info_); |
| 164 } | 169 } |
| 165 | 170 |
| 166 void HttpStreamFactoryImpl::Job::OnStreamReadyCallback() { | 171 void HttpStreamFactoryImpl::Job::OnStreamReadyCallback() { |
| 167 DCHECK(stream_.get()); | 172 DCHECK(stream_.get()); |
| 168 request_->Complete(was_alternate_protocol_available(), | 173 DCHECK(!IsPreconnecting()); |
| 169 was_npn_negotiated(), | 174 if (IsOrphaned()) { |
| 170 using_spdy(), | 175 stream_factory_->OnOrphanedJobComplete(this); |
| 171 net_log_.source()); | 176 } else { |
| 172 request_->OnStreamReady(ssl_config_, proxy_info_, stream_.release()); | 177 request_->Complete(was_alternate_protocol_available(), |
| 178 was_npn_negotiated(), |
| 179 using_spdy(), |
| 180 net_log_.source()); |
| 181 request_->OnStreamReady(this, ssl_config_, proxy_info_, stream_.release()); |
| 182 } |
| 173 // |this| may be deleted after this call. | 183 // |this| may be deleted after this call. |
| 174 } | 184 } |
| 175 | 185 |
| 176 void HttpStreamFactoryImpl::Job::OnSpdySessionReadyCallback() { | 186 void HttpStreamFactoryImpl::Job::OnSpdySessionReadyCallback() { |
| 177 DCHECK(!stream_.get()); | 187 DCHECK(!stream_.get()); |
| 188 DCHECK(!IsPreconnecting()); |
| 178 DCHECK(using_spdy()); | 189 DCHECK(using_spdy()); |
| 179 DCHECK(new_spdy_session_); | 190 DCHECK(new_spdy_session_); |
| 180 scoped_refptr<SpdySession> spdy_session = new_spdy_session_; | 191 scoped_refptr<SpdySession> spdy_session = new_spdy_session_; |
| 181 new_spdy_session_ = NULL; | 192 new_spdy_session_ = NULL; |
| 182 stream_factory_->OnSpdySessionReady(this, spdy_session, spdy_session_direct_); | 193 if (IsOrphaned()) { |
| 194 stream_factory_->OnSpdySessionReady( |
| 195 spdy_session, spdy_session_direct_, ssl_config_, proxy_info_, |
| 196 was_alternate_protocol_available(), was_npn_negotiated(), |
| 197 using_spdy(), net_log_.source()); |
| 198 stream_factory_->OnOrphanedJobComplete(this); |
| 199 } else { |
| 200 request_->OnSpdySessionReady(this, spdy_session, spdy_session_direct_); |
| 201 } |
| 183 // |this| may be deleted after this call. | 202 // |this| may be deleted after this call. |
| 184 } | 203 } |
| 185 | 204 |
| 186 void HttpStreamFactoryImpl::Job::OnStreamFailedCallback(int result) { | 205 void HttpStreamFactoryImpl::Job::OnStreamFailedCallback(int result) { |
| 187 request_->OnStreamFailed(result, ssl_config_); | 206 DCHECK(!IsPreconnecting()); |
| 207 if (IsOrphaned()) |
| 208 stream_factory_->OnOrphanedJobComplete(this); |
| 209 else |
| 210 request_->OnStreamFailed(this, result, ssl_config_); |
| 188 // |this| may be deleted after this call. | 211 // |this| may be deleted after this call. |
| 189 } | 212 } |
| 190 | 213 |
| 191 void HttpStreamFactoryImpl::Job::OnCertificateErrorCallback( | 214 void HttpStreamFactoryImpl::Job::OnCertificateErrorCallback( |
| 192 int result, const SSLInfo& ssl_info) { | 215 int result, const SSLInfo& ssl_info) { |
| 193 request_->OnCertificateError(result, ssl_config_, ssl_info); | 216 DCHECK(!IsPreconnecting()); |
| 217 if (IsOrphaned()) |
| 218 stream_factory_->OnOrphanedJobComplete(this); |
| 219 else |
| 220 request_->OnCertificateError(this, result, ssl_config_, ssl_info); |
| 194 // |this| may be deleted after this call. | 221 // |this| may be deleted after this call. |
| 195 } | 222 } |
| 196 | 223 |
| 197 void HttpStreamFactoryImpl::Job::OnNeedsProxyAuthCallback( | 224 void HttpStreamFactoryImpl::Job::OnNeedsProxyAuthCallback( |
| 198 const HttpResponseInfo& response, | 225 const HttpResponseInfo& response, |
| 199 HttpAuthController* auth_controller) { | 226 HttpAuthController* auth_controller) { |
| 200 request_->OnNeedsProxyAuth( | 227 DCHECK(!IsPreconnecting()); |
| 201 response, ssl_config_, proxy_info_, auth_controller); | 228 if (IsOrphaned()) |
| 229 stream_factory_->OnOrphanedJobComplete(this); |
| 230 else |
| 231 request_->OnNeedsProxyAuth( |
| 232 this, response, ssl_config_, proxy_info_, auth_controller); |
| 202 // |this| may be deleted after this call. | 233 // |this| may be deleted after this call. |
| 203 } | 234 } |
| 204 | 235 |
| 205 void HttpStreamFactoryImpl::Job::OnNeedsClientAuthCallback( | 236 void HttpStreamFactoryImpl::Job::OnNeedsClientAuthCallback( |
| 206 SSLCertRequestInfo* cert_info) { | 237 SSLCertRequestInfo* cert_info) { |
| 207 request_->OnNeedsClientAuth(ssl_config_, cert_info); | 238 DCHECK(!IsPreconnecting()); |
| 239 if (IsOrphaned()) |
| 240 stream_factory_->OnOrphanedJobComplete(this); |
| 241 else |
| 242 request_->OnNeedsClientAuth(this, ssl_config_, cert_info); |
| 208 // |this| may be deleted after this call. | 243 // |this| may be deleted after this call. |
| 209 } | 244 } |
| 210 | 245 |
| 211 void HttpStreamFactoryImpl::Job::OnHttpsProxyTunnelResponseCallback( | 246 void HttpStreamFactoryImpl::Job::OnHttpsProxyTunnelResponseCallback( |
| 212 const HttpResponseInfo& response_info, | 247 const HttpResponseInfo& response_info, |
| 213 HttpStream* stream) { | 248 HttpStream* stream) { |
| 214 request_->OnHttpsProxyTunnelResponse( | 249 DCHECK(!IsPreconnecting()); |
| 215 response_info, ssl_config_, proxy_info_, stream); | 250 if (IsOrphaned()) |
| 251 stream_factory_->OnOrphanedJobComplete(this); |
| 252 else |
| 253 request_->OnHttpsProxyTunnelResponse( |
| 254 this, response_info, ssl_config_, proxy_info_, stream); |
| 216 // |this| may be deleted after this call. | 255 // |this| may be deleted after this call. |
| 217 } | 256 } |
| 218 | 257 |
| 219 void HttpStreamFactoryImpl::Job::OnPreconnectsComplete() { | 258 void HttpStreamFactoryImpl::Job::OnPreconnectsComplete() { |
| 259 DCHECK(!request_); |
| 260 if (new_spdy_session_) { |
| 261 stream_factory_->OnSpdySessionReady( |
| 262 new_spdy_session_, spdy_session_direct_, ssl_config_, |
| 263 proxy_info_, was_alternate_protocol_available(), |
| 264 was_npn_negotiated(), using_spdy(), net_log_.source()); |
| 265 } |
| 220 stream_factory_->OnPreconnectsComplete(this); | 266 stream_factory_->OnPreconnectsComplete(this); |
| 221 // |this| may be deleted after this call. | 267 // |this| may be deleted after this call. |
| 222 } | 268 } |
| 223 | 269 |
| 224 void HttpStreamFactoryImpl::Job::OnIOComplete(int result) { | 270 void HttpStreamFactoryImpl::Job::OnIOComplete(int result) { |
| 225 RunLoop(result); | 271 RunLoop(result); |
| 226 } | 272 } |
| 227 | 273 |
| 228 int HttpStreamFactoryImpl::Job::RunLoop(int result) { | 274 int HttpStreamFactoryImpl::Job::RunLoop(int result) { |
| 229 result = DoLoop(result); | 275 result = DoLoop(result); |
| (...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 515 HostPortProxyPair(endpoint_, proxy_info_.proxy_server()); | 561 HostPortProxyPair(endpoint_, proxy_info_.proxy_server()); |
| 516 } | 562 } |
| 517 if (session_->spdy_session_pool()->HasSession(spdy_session_key)) { | 563 if (session_->spdy_session_pool()->HasSession(spdy_session_key)) { |
| 518 // If we're preconnecting, but we already have a SpdySession, we don't | 564 // If we're preconnecting, but we already have a SpdySession, we don't |
| 519 // actually need to preconnect any sockets, so we're done. | 565 // actually need to preconnect any sockets, so we're done. |
| 520 if (IsPreconnecting()) | 566 if (IsPreconnecting()) |
| 521 return OK; | 567 return OK; |
| 522 using_spdy_ = true; | 568 using_spdy_ = true; |
| 523 next_state_ = STATE_CREATE_STREAM; | 569 next_state_ = STATE_CREATE_STREAM; |
| 524 return OK; | 570 return OK; |
| 525 } else if (!IsPreconnecting()) { | 571 } else if (request_) { |
| 526 // Update the spdy session key for the request that launched this job. | 572 // Update the spdy session key for the request that launched this job. |
| 527 request_->SetSpdySessionKey(spdy_session_key); | 573 request_->SetSpdySessionKey(spdy_session_key); |
| 528 } | 574 } |
| 529 } | 575 } |
| 530 | 576 |
| 531 // Build the string used to uniquely identify connections of this type. | 577 // Build the string used to uniquely identify connections of this type. |
| 532 // Determine the host and port to connect to. | 578 // Determine the host and port to connect to. |
| 533 std::string connection_group = endpoint_.ToString(); | 579 std::string connection_group = endpoint_.ToString(); |
| 534 DCHECK(!connection_group.empty()); | 580 DCHECK(!connection_group.empty()); |
| 535 | 581 |
| (...skipping 591 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1127 NOTREACHED(); | 1173 NOTREACHED(); |
| 1128 break; | 1174 break; |
| 1129 } | 1175 } |
| 1130 } | 1176 } |
| 1131 | 1177 |
| 1132 bool HttpStreamFactoryImpl::Job::IsPreconnecting() const { | 1178 bool HttpStreamFactoryImpl::Job::IsPreconnecting() const { |
| 1133 DCHECK_GE(num_streams_, 0); | 1179 DCHECK_GE(num_streams_, 0); |
| 1134 return num_streams_ > 0; | 1180 return num_streams_ > 0; |
| 1135 } | 1181 } |
| 1136 | 1182 |
| 1183 bool HttpStreamFactoryImpl::Job::IsOrphaned() const { |
| 1184 return !IsPreconnecting() && !request_; |
| 1185 } |
| 1186 |
| 1137 } // namespace net | 1187 } // namespace net |
| OLD | NEW |