| 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 #include "net/http/http_stream_factory_impl_request.h" | 5 #include "net/http/http_stream_factory_impl_request.h" |
| 6 | 6 |
| 7 #include "base/callback.h" | 7 #include "base/callback.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
| 10 #include "net/http/http_stream_factory_impl_job.h" | 10 #include "net/http/http_stream_factory_impl_job.h" |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 RequestSet& request_set = | 60 RequestSet& request_set = |
| 61 factory_->spdy_session_request_map_[spdy_session_key]; | 61 factory_->spdy_session_request_map_[spdy_session_key]; |
| 62 DCHECK(!ContainsKey(request_set, this)); | 62 DCHECK(!ContainsKey(request_set, this)); |
| 63 request_set.insert(this); | 63 request_set.insert(this); |
| 64 } | 64 } |
| 65 | 65 |
| 66 bool HttpStreamFactoryImpl::Request::SetHttpPipeliningKey( | 66 bool HttpStreamFactoryImpl::Request::SetHttpPipeliningKey( |
| 67 const HttpPipelinedHost::Key& http_pipelining_key) { | 67 const HttpPipelinedHost::Key& http_pipelining_key) { |
| 68 CHECK(!http_pipelining_key_.get()); | 68 CHECK(!http_pipelining_key_.get()); |
| 69 http_pipelining_key_.reset(new HttpPipelinedHost::Key(http_pipelining_key)); | 69 http_pipelining_key_.reset(new HttpPipelinedHost::Key(http_pipelining_key)); |
| 70 bool was_new_key = !ContainsKey(factory_->http_pipelining_request_map_, | 70 bool was_new_key = |
| 71 http_pipelining_key); | 71 !ContainsKey(factory_->http_pipelining_request_map_, http_pipelining_key); |
| 72 RequestVector& request_vector = | 72 RequestVector& request_vector = |
| 73 factory_->http_pipelining_request_map_[http_pipelining_key]; | 73 factory_->http_pipelining_request_map_[http_pipelining_key]; |
| 74 request_vector.push_back(this); | 74 request_vector.push_back(this); |
| 75 return was_new_key; | 75 return was_new_key; |
| 76 } | 76 } |
| 77 | 77 |
| 78 void HttpStreamFactoryImpl::Request::AttachJob(Job* job) { | 78 void HttpStreamFactoryImpl::Request::AttachJob(Job* job) { |
| 79 DCHECK(job); | 79 DCHECK(job); |
| 80 jobs_.insert(job); | 80 jobs_.insert(job); |
| 81 factory_->request_map_[job] = this; | 81 factory_->request_map_[job] = this; |
| 82 } | 82 } |
| 83 | 83 |
| 84 void HttpStreamFactoryImpl::Request::Complete( | 84 void HttpStreamFactoryImpl::Request::Complete(bool was_npn_negotiated, |
| 85 bool was_npn_negotiated, | 85 NextProto protocol_negotiated, |
| 86 NextProto protocol_negotiated, | 86 bool using_spdy, |
| 87 bool using_spdy, | 87 const BoundNetLog& job_net_log) { |
| 88 const BoundNetLog& job_net_log) { | |
| 89 DCHECK(!completed_); | 88 DCHECK(!completed_); |
| 90 completed_ = true; | 89 completed_ = true; |
| 91 was_npn_negotiated_ = was_npn_negotiated; | 90 was_npn_negotiated_ = was_npn_negotiated; |
| 92 protocol_negotiated_ = protocol_negotiated; | 91 protocol_negotiated_ = protocol_negotiated; |
| 93 using_spdy_ = using_spdy; | 92 using_spdy_ = using_spdy; |
| 94 net_log_.AddEvent( | 93 net_log_.AddEvent(NetLog::TYPE_HTTP_STREAM_REQUEST_BOUND_TO_JOB, |
| 95 NetLog::TYPE_HTTP_STREAM_REQUEST_BOUND_TO_JOB, | 94 job_net_log.source().ToEventParametersCallback()); |
| 96 job_net_log.source().ToEventParametersCallback()); | 95 job_net_log.AddEvent(NetLog::TYPE_HTTP_STREAM_JOB_BOUND_TO_REQUEST, |
| 97 job_net_log.AddEvent( | 96 net_log_.source().ToEventParametersCallback()); |
| 98 NetLog::TYPE_HTTP_STREAM_JOB_BOUND_TO_REQUEST, | |
| 99 net_log_.source().ToEventParametersCallback()); | |
| 100 } | 97 } |
| 101 | 98 |
| 102 void HttpStreamFactoryImpl::Request::OnStreamReady( | 99 void HttpStreamFactoryImpl::Request::OnStreamReady( |
| 103 Job* job, | 100 Job* job, |
| 104 const SSLConfig& used_ssl_config, | 101 const SSLConfig& used_ssl_config, |
| 105 const ProxyInfo& used_proxy_info, | 102 const ProxyInfo& used_proxy_info, |
| 106 HttpStreamBase* stream) { | 103 HttpStreamBase* stream) { |
| 107 DCHECK(!factory_->for_websockets_); | 104 DCHECK(!factory_->for_websockets_); |
| 108 DCHECK(stream); | 105 DCHECK(stream); |
| 109 DCHECK(completed_); | 106 DCHECK(completed_); |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 192 const SSLConfig& used_ssl_config, | 189 const SSLConfig& used_ssl_config, |
| 193 SSLCertRequestInfo* cert_info) { | 190 SSLCertRequestInfo* cert_info) { |
| 194 if (!bound_job_.get()) | 191 if (!bound_job_.get()) |
| 195 OrphanJobsExcept(job); | 192 OrphanJobsExcept(job); |
| 196 else | 193 else |
| 197 DCHECK(jobs_.empty()); | 194 DCHECK(jobs_.empty()); |
| 198 delegate_->OnNeedsClientAuth(used_ssl_config, cert_info); | 195 delegate_->OnNeedsClientAuth(used_ssl_config, cert_info); |
| 199 } | 196 } |
| 200 | 197 |
| 201 void HttpStreamFactoryImpl::Request::OnHttpsProxyTunnelResponse( | 198 void HttpStreamFactoryImpl::Request::OnHttpsProxyTunnelResponse( |
| 202 Job *job, | 199 Job* job, |
| 203 const HttpResponseInfo& response_info, | 200 const HttpResponseInfo& response_info, |
| 204 const SSLConfig& used_ssl_config, | 201 const SSLConfig& used_ssl_config, |
| 205 const ProxyInfo& used_proxy_info, | 202 const ProxyInfo& used_proxy_info, |
| 206 HttpStreamBase* stream) { | 203 HttpStreamBase* stream) { |
| 207 if (!bound_job_.get()) | 204 if (!bound_job_.get()) |
| 208 OrphanJobsExcept(job); | 205 OrphanJobsExcept(job); |
| 209 else | 206 else |
| 210 DCHECK(jobs_.empty()); | 207 DCHECK(jobs_.empty()); |
| 211 delegate_->OnHttpsProxyTunnelResponse( | 208 delegate_->OnHttpsProxyTunnelResponse( |
| 212 response_info, used_ssl_config, used_proxy_info, stream); | 209 response_info, used_ssl_config, used_proxy_info, stream); |
| 213 } | 210 } |
| 214 | 211 |
| 215 int HttpStreamFactoryImpl::Request::RestartTunnelWithProxyAuth( | 212 int HttpStreamFactoryImpl::Request::RestartTunnelWithProxyAuth( |
| 216 const AuthCredentials& credentials) { | 213 const AuthCredentials& credentials) { |
| 217 DCHECK(bound_job_.get()); | 214 DCHECK(bound_job_.get()); |
| 218 return bound_job_->RestartTunnelWithProxyAuth(credentials); | 215 return bound_job_->RestartTunnelWithProxyAuth(credentials); |
| 219 } | 216 } |
| 220 | 217 |
| 221 void HttpStreamFactoryImpl::Request::SetPriority(RequestPriority priority) { | 218 void HttpStreamFactoryImpl::Request::SetPriority(RequestPriority priority) { |
| 222 for (std::set<HttpStreamFactoryImpl::Job*>::const_iterator it = jobs_.begin(); | 219 for (std::set<HttpStreamFactoryImpl::Job*>::const_iterator it = jobs_.begin(); |
| 223 it != jobs_.end(); ++it) { | 220 it != jobs_.end(); |
| 221 ++it) { |
| 224 (*it)->SetPriority(priority); | 222 (*it)->SetPriority(priority); |
| 225 } | 223 } |
| 226 if (bound_job_) | 224 if (bound_job_) |
| 227 bound_job_->SetPriority(priority); | 225 bound_job_->SetPriority(priority); |
| 228 } | 226 } |
| 229 | 227 |
| 230 LoadState HttpStreamFactoryImpl::Request::GetLoadState() const { | 228 LoadState HttpStreamFactoryImpl::Request::GetLoadState() const { |
| 231 if (bound_job_.get()) | 229 if (bound_job_.get()) |
| 232 return bound_job_->GetLoadState(); | 230 return bound_job_->GetLoadState(); |
| 233 DCHECK(!jobs_.empty()); | 231 DCHECK(!jobs_.empty()); |
| 234 | 232 |
| 235 // Just pick the first one. | 233 // Just pick the first one. |
| 236 return (*jobs_.begin())->GetLoadState(); | 234 return (*jobs_.begin())->GetLoadState(); |
| 237 } | 235 } |
| 238 | 236 |
| 239 bool HttpStreamFactoryImpl::Request::was_npn_negotiated() const { | 237 bool HttpStreamFactoryImpl::Request::was_npn_negotiated() const { |
| 240 DCHECK(completed_); | 238 DCHECK(completed_); |
| 241 return was_npn_negotiated_; | 239 return was_npn_negotiated_; |
| 242 } | 240 } |
| 243 | 241 |
| 244 NextProto HttpStreamFactoryImpl::Request::protocol_negotiated() | 242 NextProto HttpStreamFactoryImpl::Request::protocol_negotiated() const { |
| 245 const { | |
| 246 DCHECK(completed_); | 243 DCHECK(completed_); |
| 247 return protocol_negotiated_; | 244 return protocol_negotiated_; |
| 248 } | 245 } |
| 249 | 246 |
| 250 bool HttpStreamFactoryImpl::Request::using_spdy() const { | 247 bool HttpStreamFactoryImpl::Request::using_spdy() const { |
| 251 DCHECK(completed_); | 248 DCHECK(completed_); |
| 252 return using_spdy_; | 249 return using_spdy_; |
| 253 } | 250 } |
| 254 | 251 |
| 255 void | 252 void HttpStreamFactoryImpl::Request::RemoveRequestFromSpdySessionRequestMap() { |
| 256 HttpStreamFactoryImpl::Request::RemoveRequestFromSpdySessionRequestMap() { | |
| 257 if (spdy_session_key_.get()) { | 253 if (spdy_session_key_.get()) { |
| 258 SpdySessionRequestMap& spdy_session_request_map = | 254 SpdySessionRequestMap& spdy_session_request_map = |
| 259 factory_->spdy_session_request_map_; | 255 factory_->spdy_session_request_map_; |
| 260 DCHECK(ContainsKey(spdy_session_request_map, *spdy_session_key_)); | 256 DCHECK(ContainsKey(spdy_session_request_map, *spdy_session_key_)); |
| 261 RequestSet& request_set = | 257 RequestSet& request_set = spdy_session_request_map[*spdy_session_key_]; |
| 262 spdy_session_request_map[*spdy_session_key_]; | |
| 263 DCHECK(ContainsKey(request_set, this)); | 258 DCHECK(ContainsKey(request_set, this)); |
| 264 request_set.erase(this); | 259 request_set.erase(this); |
| 265 if (request_set.empty()) | 260 if (request_set.empty()) |
| 266 spdy_session_request_map.erase(*spdy_session_key_); | 261 spdy_session_request_map.erase(*spdy_session_key_); |
| 267 spdy_session_key_.reset(); | 262 spdy_session_key_.reset(); |
| 268 } | 263 } |
| 269 } | 264 } |
| 270 | 265 |
| 271 void | 266 void |
| 272 HttpStreamFactoryImpl::Request::RemoveRequestFromHttpPipeliningRequestMap() { | 267 HttpStreamFactoryImpl::Request::RemoveRequestFromHttpPipeliningRequestMap() { |
| 273 if (http_pipelining_key_.get()) { | 268 if (http_pipelining_key_.get()) { |
| 274 HttpPipeliningRequestMap& http_pipelining_request_map = | 269 HttpPipeliningRequestMap& http_pipelining_request_map = |
| 275 factory_->http_pipelining_request_map_; | 270 factory_->http_pipelining_request_map_; |
| 276 DCHECK(ContainsKey(http_pipelining_request_map, *http_pipelining_key_)); | 271 DCHECK(ContainsKey(http_pipelining_request_map, *http_pipelining_key_)); |
| 277 RequestVector& request_vector = | 272 RequestVector& request_vector = |
| 278 http_pipelining_request_map[*http_pipelining_key_]; | 273 http_pipelining_request_map[*http_pipelining_key_]; |
| 279 for (RequestVector::iterator it = request_vector.begin(); | 274 for (RequestVector::iterator it = request_vector.begin(); |
| 280 it != request_vector.end(); ++it) { | 275 it != request_vector.end(); |
| 276 ++it) { |
| 281 if (*it == this) { | 277 if (*it == this) { |
| 282 request_vector.erase(it); | 278 request_vector.erase(it); |
| 283 break; | 279 break; |
| 284 } | 280 } |
| 285 } | 281 } |
| 286 if (request_vector.empty()) | 282 if (request_vector.empty()) |
| 287 http_pipelining_request_map.erase(*http_pipelining_key_); | 283 http_pipelining_request_map.erase(*http_pipelining_key_); |
| 288 http_pipelining_key_.reset(); | 284 http_pipelining_key_.reset(); |
| 289 } | 285 } |
| 290 } | 286 } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 306 OrphanJobsExcept(job); | 302 OrphanJobsExcept(job); |
| 307 } else { // This is the case for HTTPS proxy tunneling. | 303 } else { // This is the case for HTTPS proxy tunneling. |
| 308 DCHECK_EQ(bound_job_.get(), job); | 304 DCHECK_EQ(bound_job_.get(), job); |
| 309 DCHECK(jobs_.empty()); | 305 DCHECK(jobs_.empty()); |
| 310 } | 306 } |
| 311 | 307 |
| 312 // Cache these values in case the job gets deleted. | 308 // Cache these values in case the job gets deleted. |
| 313 const SSLConfig used_ssl_config = job->server_ssl_config(); | 309 const SSLConfig used_ssl_config = job->server_ssl_config(); |
| 314 const ProxyInfo used_proxy_info = job->proxy_info(); | 310 const ProxyInfo used_proxy_info = job->proxy_info(); |
| 315 const bool was_npn_negotiated = job->was_npn_negotiated(); | 311 const bool was_npn_negotiated = job->was_npn_negotiated(); |
| 316 const NextProto protocol_negotiated = | 312 const NextProto protocol_negotiated = job->protocol_negotiated(); |
| 317 job->protocol_negotiated(); | |
| 318 const bool using_spdy = job->using_spdy(); | 313 const bool using_spdy = job->using_spdy(); |
| 319 const BoundNetLog net_log = job->net_log(); | 314 const BoundNetLog net_log = job->net_log(); |
| 320 | 315 |
| 321 Complete(was_npn_negotiated, protocol_negotiated, using_spdy, net_log); | 316 Complete(was_npn_negotiated, protocol_negotiated, using_spdy, net_log); |
| 322 | 317 |
| 323 // Cache this so we can still use it if the request is deleted. | 318 // Cache this so we can still use it if the request is deleted. |
| 324 HttpStreamFactoryImpl* factory = factory_; | 319 HttpStreamFactoryImpl* factory = factory_; |
| 325 if (factory->for_websockets_) { | 320 if (factory->for_websockets_) { |
| 326 // TODO(ricea): Re-instate this code when WebSockets over SPDY is | 321 // TODO(ricea): Re-instate this code when WebSockets over SPDY is |
| 327 // implemented. | 322 // implemented. |
| 328 NOTREACHED(); | 323 NOTREACHED(); |
| 329 } else { | 324 } else { |
| 330 delegate_->OnStreamReady(job->server_ssl_config(), job->proxy_info(), | 325 delegate_->OnStreamReady( |
| 331 stream.release()); | 326 job->server_ssl_config(), job->proxy_info(), stream.release()); |
| 332 } | 327 } |
| 333 // |this| may be deleted after this point. | 328 // |this| may be deleted after this point. |
| 334 if (spdy_session) { | 329 if (spdy_session) { |
| 335 factory->OnNewSpdySessionReady(spdy_session, | 330 factory->OnNewSpdySessionReady(spdy_session, |
| 336 direct, | 331 direct, |
| 337 used_ssl_config, | 332 used_ssl_config, |
| 338 used_proxy_info, | 333 used_proxy_info, |
| 339 was_npn_negotiated, | 334 was_npn_negotiated, |
| 340 protocol_negotiated, | 335 protocol_negotiated, |
| 341 using_spdy, | 336 using_spdy, |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 387 job->ReportJobSuccededForRequest(); | 382 job->ReportJobSuccededForRequest(); |
| 388 // We may have other jobs in |jobs_|. For example, if we start multiple jobs | 383 // We may have other jobs in |jobs_|. For example, if we start multiple jobs |
| 389 // for Alternate-Protocol. | 384 // for Alternate-Protocol. |
| 390 OrphanJobsExcept(job); | 385 OrphanJobsExcept(job); |
| 391 return; | 386 return; |
| 392 } | 387 } |
| 393 DCHECK(jobs_.empty()); | 388 DCHECK(jobs_.empty()); |
| 394 } | 389 } |
| 395 | 390 |
| 396 } // namespace net | 391 } // namespace net |
| OLD | NEW |