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. 4 5 #ifndef NET_HTTP_HTTP_PIPELINED_HOST_IMPL_H_ 6 #define NET_HTTP_HTTP_PIPELINED_HOST_IMPL_H_ 7 8 #include <map> 9 #include <string> 10 11 #include "base/basictypes.h" 12 #include "base/memory/scoped_ptr.h" 13 #include "net/base/host_port_pair.h" 14 #include "net/base/net_export.h" 15 #include "net/http/http_pipelined_connection.h" 16 #include "net/http/http_pipelined_host.h" 17 #include "net/http/http_pipelined_host_capability.h" 18 19 namespace base { 20 class Value; 21 } 22 23 namespace net { 24 25 class BoundNetLog; 26 class ClientSocketHandle; 27 class HttpPipelinedStream; 28 class ProxyInfo; 29 struct SSLConfig; 30 31 // Manages all of the pipelining state for specific host with active pipelined 32 // HTTP requests. Manages connection jobs, constructs pipelined streams, and 33 // assigns requests to the least loaded pipelined connection. 34 class NET_EXPORT_PRIVATE HttpPipelinedHostImpl 35 : public HttpPipelinedHost, 36 public HttpPipelinedConnection::Delegate { 37 public: 38 HttpPipelinedHostImpl(HttpPipelinedHost::Delegate* delegate, 39 const HttpPipelinedHost::Key& key, 40 HttpPipelinedConnection::Factory* factory, 41 HttpPipelinedHostCapability capability); 42 virtual ~HttpPipelinedHostImpl(); 43 44 // HttpPipelinedHost interface 45 virtual HttpPipelinedStream* CreateStreamOnNewPipeline( 46 ClientSocketHandle* connection, 47 const SSLConfig& used_ssl_config, 48 const ProxyInfo& used_proxy_info, 49 const BoundNetLog& net_log, 50 bool was_npn_negotiated, 51 NextProto protocol_negotiated) OVERRIDE; 52 53 virtual HttpPipelinedStream* CreateStreamOnExistingPipeline() OVERRIDE; 54 55 virtual bool IsExistingPipelineAvailable() const OVERRIDE; 56 57 // HttpPipelinedConnection::Delegate interface 58 59 // Called when a pipelined connection completes a request. Adds a pending 60 // request to the pipeline if the pipeline is still usable. 61 virtual void OnPipelineHasCapacity( 62 HttpPipelinedConnection* pipeline) OVERRIDE; 63 64 virtual void OnPipelineFeedback( 65 HttpPipelinedConnection* pipeline, 66 HttpPipelinedConnection::Feedback feedback) OVERRIDE; 67 68 virtual const Key& GetKey() const OVERRIDE; 69 70 // Creates a Value summary of this host's |pipelines_|. Caller assumes 71 // ownership of the returned Value. 72 virtual base::Value* PipelineInfoToValue() const OVERRIDE; 73 74 // Returns the maximum number of in-flight pipelined requests we'll allow on a 75 // single connection. 76 static int max_pipeline_depth() { return 3; } 77 78 private: 79 struct PipelineInfo { 80 PipelineInfo(); 81 82 int num_successes; 83 }; 84 typedef std::map<HttpPipelinedConnection*, PipelineInfo> PipelineInfoMap; 85 86 // Called when a pipeline is empty and there are no pending requests. Closes 87 // the connection. 88 void OnPipelineEmpty(HttpPipelinedConnection* pipeline); 89 90 // Adds the next pending request to the pipeline if it's still usuable. 91 void AddRequestToPipeline(HttpPipelinedConnection* pipeline); 92 93 // Returns the current pipeline capacity based on |capability_|. This should 94 // not be called if |capability_| is INCAPABLE. 95 int GetPipelineCapacity() const; 96 97 // Returns true if |pipeline| can handle a new request. This is true if the 98 // |pipeline| is active, usable, has capacity, and |capability_| is 99 // sufficient. 100 bool CanPipelineAcceptRequests(HttpPipelinedConnection* pipeline) const; 101 102 // Called when |this| moves from UNKNOWN |capability_| to PROBABLY_CAPABLE. 103 // Causes all pipelines to increase capacity to start pipelining. 104 void NotifyAllPipelinesHaveCapacity(); 105 106 HttpPipelinedHost::Delegate* delegate_; 107 const Key key_; 108 PipelineInfoMap pipelines_; 109 scoped_ptr<HttpPipelinedConnection::Factory> factory_; 110 HttpPipelinedHostCapability capability_; 111 112 DISALLOW_COPY_AND_ASSIGN(HttpPipelinedHostImpl); 113 }; 114 115 } // namespace net 116 117 #endif // NET_HTTP_HTTP_PIPELINED_HOST_IMPL_H_ 118