Index: net/http/http_stream_factory_impl.cc |
diff --git a/net/http/http_stream_factory_impl.cc b/net/http/http_stream_factory_impl.cc |
index 74942a31307dfa5ad0c6f84f50826cb98e6db7ad..c7b0c9308d637c4e66c9f094a9289c37ae36417c 100644 |
--- a/net/http/http_stream_factory_impl.cc |
+++ b/net/http/http_stream_factory_impl.cc |
@@ -35,8 +35,7 @@ HttpStreamRequest* HttpStreamFactoryImpl::RequestStream( |
const BoundNetLog& net_log) { |
Job* job = new Job(this, session_); |
Request* request = new Request(request_info.url, this, delegate, net_log); |
- request_map_[job] = request; |
- request->BindJob(job); |
+ request->AttachJob(job); |
job->Start(request, request_info, ssl_config, net_log); |
return request; |
} |
@@ -59,27 +58,53 @@ bool HttpStreamFactoryImpl::IsTLSIntolerantServer(const GURL& url) const { |
return ContainsKey(tls_intolerant_servers_, GetHostAndPort(url)); |
} |
-LoadState HttpStreamFactoryImpl::GetLoadState(const Request& request) const { |
- // TODO(willchan): Will break when we do late binding. |
- return request.job()->GetLoadState(); |
+void HttpStreamFactoryImpl::OrphanJob(Job* job, const Request* request) { |
+ DCHECK(ContainsKey(request_map_, job)); |
+ DCHECK_EQ(request_map_[job], request); |
+ DCHECK(!ContainsKey(orphaned_job_set_, job)); |
+ |
+ request_map_.erase(job); |
+ |
+ orphaned_job_set_.insert(job); |
+ job->Orphan(request); |
} |
void HttpStreamFactoryImpl::OnSpdySessionReady( |
- const Job* job, |
scoped_refptr<SpdySession> spdy_session, |
- bool direct) { |
- DCHECK(job->using_spdy()); |
- DCHECK(ContainsKey(request_map_, job)); |
- Request* request = request_map_[job]; |
- request->Complete(job->was_alternate_protocol_available(), |
- job->was_npn_negotiated(), |
- job->using_spdy(), |
- job->net_log().source()); |
- bool use_relative_url = direct || request->url().SchemeIs("https"); |
- request->OnStreamReady( |
- job->ssl_config(), |
- job->proxy_info(), |
- new SpdyHttpStream(spdy_session, use_relative_url)); |
+ bool direct, |
+ const SSLConfig& used_ssl_config, |
+ const ProxyInfo& used_proxy_info, |
+ bool was_alternate_protocol_available, |
+ bool was_npn_negotiated, |
+ bool using_spdy, |
+ const NetLog::Source& source) { |
+ const HostPortProxyPair& spdy_session_key = |
+ spdy_session->host_port_proxy_pair(); |
+ while (!spdy_session->IsClosed()) { |
+ // Each iteration may empty out the RequestSet for |spdy_session_key_ in |
+ // |spdy_session_request_map_|. So each time, check for RequestSet and use |
+ // the first one. |
+ // |
+ // TODO(willchan): If it's important, switch RequestSet out for a FIFO |
willchan no longer on Chromium
2011/03/01 00:22:42
Please comment here if you think this is important
|
+ // pqueue (Order by priority first, then FIFO within same priority). Unclear |
+ // that it matters here. |
+ if (!ContainsKey(spdy_session_request_map_, spdy_session_key)) |
+ break; |
+ Request* request = *spdy_session_request_map_[spdy_session_key].begin(); |
+ request->Complete(was_alternate_protocol_available, |
+ was_npn_negotiated, |
+ using_spdy, |
+ source); |
+ bool use_relative_url = direct || request->url().SchemeIs("https"); |
+ request->OnStreamReady(NULL, used_ssl_config, used_proxy_info, |
+ new SpdyHttpStream(spdy_session, use_relative_url)); |
+ } |
+ // TODO(mbelshe): Alert other valid requests. |
willchan no longer on Chromium
2011/03/01 00:22:42
You will need to update this to search other valid
|
+} |
+ |
+void HttpStreamFactoryImpl::OnOrphanedJobComplete(const Job* job) { |
+ orphaned_job_set_.erase(job); |
+ delete job; |
} |
void HttpStreamFactoryImpl::OnPreconnectsComplete(const Job* job) { |