|  | // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef NET_HTTP_HTTP_PIPELINED_CONNECTION_H_ | 
|  | #define NET_HTTP_HTTP_PIPELINED_CONNECTION_H_ | 
|  |  | 
|  | #include "net/base/net_export.h" | 
|  | #include "net/base/net_log.h" | 
|  | #include "net/socket/ssl_client_socket.h" | 
|  |  | 
|  | namespace net { | 
|  |  | 
|  | class BoundNetLog; | 
|  | class ClientSocketHandle; | 
|  | class HostPortPair; | 
|  | class HttpPipelinedStream; | 
|  | class ProxyInfo; | 
|  | struct SSLConfig; | 
|  |  | 
|  | class NET_EXPORT_PRIVATE HttpPipelinedConnection { | 
|  | public: | 
|  | enum Feedback { | 
|  | OK, | 
|  | PIPELINE_SOCKET_ERROR, | 
|  | OLD_HTTP_VERSION, | 
|  | MUST_CLOSE_CONNECTION, | 
|  | AUTHENTICATION_REQUIRED, | 
|  | }; | 
|  |  | 
|  | class Delegate { | 
|  | public: | 
|  | // Called when a pipeline has newly available capacity. This may be because | 
|  | // the first request has been sent and the pipeline is now active. Or, it | 
|  | // may be because a request successfully completed. | 
|  | virtual void OnPipelineHasCapacity(HttpPipelinedConnection* pipeline) = 0; | 
|  |  | 
|  | // Called every time a pipeline receives headers. Lets the delegate know if | 
|  | // the headers indicate that pipelining can be used. | 
|  | virtual void OnPipelineFeedback(HttpPipelinedConnection* pipeline, | 
|  | Feedback feedback) = 0; | 
|  | }; | 
|  |  | 
|  | class Factory { | 
|  | public: | 
|  | virtual ~Factory() {} | 
|  |  | 
|  | virtual HttpPipelinedConnection* CreateNewPipeline( | 
|  | ClientSocketHandle* connection, | 
|  | Delegate* delegate, | 
|  | const HostPortPair& origin, | 
|  | const SSLConfig& used_ssl_config, | 
|  | const ProxyInfo& used_proxy_info, | 
|  | const BoundNetLog& net_log, | 
|  | bool was_npn_negotiated, | 
|  | NextProto protocol_negotiated) = 0; | 
|  | }; | 
|  |  | 
|  | virtual ~HttpPipelinedConnection() {} | 
|  |  | 
|  | // Returns a new stream that uses this pipeline. | 
|  | virtual HttpPipelinedStream* CreateNewStream() = 0; | 
|  |  | 
|  | // The number of streams currently associated with this pipeline. | 
|  | virtual int depth() const = 0; | 
|  |  | 
|  | // True if this pipeline can accept new HTTP requests. False if a fatal error | 
|  | // has occurred. | 
|  | virtual bool usable() const = 0; | 
|  |  | 
|  | // True if this pipeline has bound one request and is ready for additional | 
|  | // requests. | 
|  | virtual bool active() const = 0; | 
|  |  | 
|  | // The SSLConfig used to establish this connection. | 
|  | virtual const SSLConfig& used_ssl_config() const = 0; | 
|  |  | 
|  | // The ProxyInfo used to establish this connection. | 
|  | virtual const ProxyInfo& used_proxy_info() const = 0; | 
|  |  | 
|  | // The BoundNetLog of this pipelined connection. | 
|  | virtual const BoundNetLog& net_log() const = 0; | 
|  |  | 
|  | // True if this connection was NPN negotiated. | 
|  | virtual bool was_npn_negotiated() const = 0; | 
|  |  | 
|  | // Protocol negotiated with the server. | 
|  | virtual NextProto protocol_negotiated() const = 0; | 
|  | }; | 
|  |  | 
|  | }  // namespace net | 
|  |  | 
|  | #endif  // NET_HTTP_HTTP_PIPELINED_CONNECTION_H_ |