Pass CreateDirectory errors up to IndexedDB.
[chromium-blink-merge.git] / net / http / http_pipelined_host_pool.cc
blobb8fec2a791825c0c36602d7f3790af08e1e6cca6
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
3 // found in the LICENSE file.
5 #include "net/http/http_pipelined_host_pool.h"
7 #include "base/logging.h"
8 #include "base/stl_util.h"
9 #include "base/values.h"
10 #include "net/http/http_pipelined_host_capability.h"
11 #include "net/http/http_pipelined_host_forced.h"
12 #include "net/http/http_pipelined_host_impl.h"
13 #include "net/http/http_server_properties.h"
15 namespace net {
17 class HttpPipelinedHostImplFactory : public HttpPipelinedHost::Factory {
18 public:
19 virtual HttpPipelinedHost* CreateNewHost(
20 HttpPipelinedHost::Delegate* delegate,
21 const HttpPipelinedHost::Key& key,
22 HttpPipelinedConnection::Factory* factory,
23 HttpPipelinedHostCapability capability,
24 bool force_pipelining) OVERRIDE {
25 if (force_pipelining) {
26 return new HttpPipelinedHostForced(delegate, key, factory);
27 } else {
28 return new HttpPipelinedHostImpl(delegate, key, factory, capability);
33 HttpPipelinedHostPool::HttpPipelinedHostPool(
34 Delegate* delegate,
35 HttpPipelinedHost::Factory* factory,
36 HttpServerProperties* http_server_properties,
37 bool force_pipelining)
38 : delegate_(delegate),
39 factory_(factory),
40 http_server_properties_(http_server_properties),
41 force_pipelining_(force_pipelining) {
42 if (!factory) {
43 factory_.reset(new HttpPipelinedHostImplFactory);
47 HttpPipelinedHostPool::~HttpPipelinedHostPool() {
48 CHECK(host_map_.empty());
51 bool HttpPipelinedHostPool::IsKeyEligibleForPipelining(
52 const HttpPipelinedHost::Key& key) {
53 HttpPipelinedHostCapability capability =
54 http_server_properties_->GetPipelineCapability(key.origin());
55 return capability != PIPELINE_INCAPABLE;
58 HttpPipelinedStream* HttpPipelinedHostPool::CreateStreamOnNewPipeline(
59 const HttpPipelinedHost::Key& key,
60 ClientSocketHandle* connection,
61 const SSLConfig& used_ssl_config,
62 const ProxyInfo& used_proxy_info,
63 const BoundNetLog& net_log,
64 bool was_npn_negotiated,
65 NextProto protocol_negotiated) {
66 HttpPipelinedHost* host = GetPipelinedHost(key, true);
67 if (!host) {
68 return NULL;
70 return host->CreateStreamOnNewPipeline(connection, used_ssl_config,
71 used_proxy_info, net_log,
72 was_npn_negotiated,
73 protocol_negotiated);
76 HttpPipelinedStream* HttpPipelinedHostPool::CreateStreamOnExistingPipeline(
77 const HttpPipelinedHost::Key& key) {
78 HttpPipelinedHost* host = GetPipelinedHost(key, false);
79 if (!host) {
80 return NULL;
82 return host->CreateStreamOnExistingPipeline();
85 bool HttpPipelinedHostPool::IsExistingPipelineAvailableForKey(
86 const HttpPipelinedHost::Key& key) {
87 HttpPipelinedHost* host = GetPipelinedHost(key, false);
88 if (!host) {
89 return false;
91 return host->IsExistingPipelineAvailable();
94 HttpPipelinedHost* HttpPipelinedHostPool::GetPipelinedHost(
95 const HttpPipelinedHost::Key& key, bool create_if_not_found) {
96 HostMap::iterator host_it = host_map_.find(key);
97 if (host_it != host_map_.end()) {
98 CHECK(host_it->second);
99 return host_it->second;
100 } else if (!create_if_not_found) {
101 return NULL;
104 HttpPipelinedHostCapability capability =
105 http_server_properties_->GetPipelineCapability(key.origin());
106 if (capability == PIPELINE_INCAPABLE) {
107 return NULL;
110 HttpPipelinedHost* host = factory_->CreateNewHost(
111 this, key, NULL, capability, force_pipelining_);
112 host_map_[key] = host;
113 return host;
116 void HttpPipelinedHostPool::OnHostIdle(HttpPipelinedHost* host) {
117 const HttpPipelinedHost::Key& key = host->GetKey();
118 CHECK(ContainsKey(host_map_, key));
119 host_map_.erase(key);
120 delete host;
123 void HttpPipelinedHostPool::OnHostHasAdditionalCapacity(
124 HttpPipelinedHost* host) {
125 delegate_->OnHttpPipelinedHostHasAdditionalCapacity(host);
128 void HttpPipelinedHostPool::OnHostDeterminedCapability(
129 HttpPipelinedHost* host,
130 HttpPipelinedHostCapability capability) {
131 http_server_properties_->SetPipelineCapability(host->GetKey().origin(),
132 capability);
135 base::Value* HttpPipelinedHostPool::PipelineInfoToValue() const {
136 base::ListValue* list = new base::ListValue();
137 for (HostMap::const_iterator it = host_map_.begin();
138 it != host_map_.end(); ++it) {
139 base::Value* value = it->second->PipelineInfoToValue();
140 list->Append(value);
142 return list;
145 } // namespace net