| Index: net/http/http_stream_factory_impl_job.cc
|
| diff --git a/net/http/http_stream_factory_impl_job.cc b/net/http/http_stream_factory_impl_job.cc
|
| index 2bdc55e0c595149195a04ef1454e2b02a17ac222..dacaf6e2ca50bd7a146796c6287bd6c180cdb989 100644
|
| --- a/net/http/http_stream_factory_impl_job.cc
|
| +++ b/net/http/http_stream_factory_impl_job.cc
|
| @@ -562,6 +562,8 @@ int HttpStreamFactoryImpl::Job::DoStart() {
|
| origin_ = HostPortPair(request_info_.url.HostNoBrackets(), port);
|
| origin_url_ = HttpStreamFactory::ApplyHostMappingRules(
|
| request_info_.url, &origin_);
|
| + http_pipelining_key_.reset(new HttpPipelinedHost::Key(
|
| + origin_, (request_info_.load_flags & LOAD_FORCE_HTTP_PIPELINING) != 0));
|
|
|
| net_log_.BeginEvent(NetLog::TYPE_HTTP_STREAM_JOB,
|
| HttpStreamJobParameters::Create(request_info_.url,
|
| @@ -687,11 +689,15 @@ int HttpStreamFactoryImpl::Job::DoInitConnection() {
|
| // connections and thus should make fewer preconnections. Explore
|
| // preconnecting fewer than the requested num_connections.
|
| existing_available_pipeline_ = stream_factory_->http_pipelined_host_pool_.
|
| - IsExistingPipelineAvailableForOrigin(origin_);
|
| + IsExistingPipelineAvailableForKey(*http_pipelining_key_.get());
|
| if (existing_available_pipeline_) {
|
| return OK;
|
| } else {
|
| - request_->SetHttpPipeliningKey(origin_);
|
| + bool was_new_key = request_->SetHttpPipeliningKey(
|
| + *http_pipelining_key_.get());
|
| + if (!was_new_key && http_pipelining_key_->force_pipelining()) {
|
| + return ERR_IO_PENDING;
|
| + }
|
| }
|
| }
|
|
|
| @@ -755,6 +761,11 @@ int HttpStreamFactoryImpl::Job::DoInitConnectionComplete(int result) {
|
| waiting_job_ = NULL;
|
| }
|
|
|
| + if (result < 0 && http_pipelining_key_->force_pipelining()) {
|
| + stream_factory_->AbortPipelinedRequestsWithKey(
|
| + this, *http_pipelining_key_.get(), result, server_ssl_config_);
|
| + }
|
| +
|
| // |result| may be the result of any of the stacked pools. The following
|
| // logic is used when determining how to interpret an error.
|
| // If |result| < 0:
|
| @@ -887,14 +898,16 @@ int HttpStreamFactoryImpl::Job::DoCreateStream() {
|
| bool using_proxy = (proxy_info_.is_http() || proxy_info_.is_https()) &&
|
| request_info_.url.SchemeIs("http");
|
| // TODO(simonjam): Support proxies.
|
| - if (existing_available_pipeline_) {
|
| + if (stream_factory_->http_pipelined_host_pool_.
|
| + IsExistingPipelineAvailableForKey(*http_pipelining_key_.get())) {
|
| stream_.reset(stream_factory_->http_pipelined_host_pool_.
|
| - CreateStreamOnExistingPipeline(origin_));
|
| + CreateStreamOnExistingPipeline(
|
| + *http_pipelining_key_.get()));
|
| CHECK(stream_.get());
|
| } else if (!using_proxy && IsRequestEligibleForPipelining()) {
|
| stream_.reset(
|
| stream_factory_->http_pipelined_host_pool_.CreateStreamOnNewPipeline(
|
| - origin_,
|
| + *http_pipelining_key_.get(),
|
| connection_.release(),
|
| server_ssl_config_,
|
| proxy_info_,
|
| @@ -1209,10 +1222,13 @@ bool HttpStreamFactoryImpl::Job::IsOrphaned() const {
|
| }
|
|
|
| bool HttpStreamFactoryImpl::Job::IsRequestEligibleForPipelining() {
|
| - if (!HttpStreamFactory::http_pipelining_enabled()) {
|
| + if (IsPreconnecting() || !request_) {
|
| return false;
|
| }
|
| - if (IsPreconnecting() || !request_) {
|
| + if (http_pipelining_key_->force_pipelining()) {
|
| + return true;
|
| + }
|
| + if (!HttpStreamFactory::http_pipelining_enabled()) {
|
| return false;
|
| }
|
| if (using_ssl_) {
|
| @@ -1221,8 +1237,8 @@ bool HttpStreamFactoryImpl::Job::IsRequestEligibleForPipelining() {
|
| if (request_info_.method != "GET" && request_info_.method != "HEAD") {
|
| return false;
|
| }
|
| - return stream_factory_->http_pipelined_host_pool_.IsHostEligibleForPipelining(
|
| - origin_);
|
| + return stream_factory_->http_pipelined_host_pool_.IsKeyEligibleForPipelining(
|
| + *http_pipelining_key_.get());
|
| }
|
|
|
| } // namespace net
|
|
|