| // 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_STREAM_FACTORY_H_ |
| #define NET_HTTP_HTTP_STREAM_FACTORY_H_ |
| |
| #include <list> |
| #include <string> |
| #include <vector> |
| |
| #include "base/basictypes.h" |
| #include "base/memory/ref_counted.h" |
| #include "base/string16.h" |
| #include "net/base/completion_callback.h" |
| #include "net/base/load_states.h" |
| #include "net/base/net_export.h" |
| #include "net/http/http_server_properties.h" |
| #include "net/socket/ssl_client_socket.h" |
| |
| class GURL; |
| |
| namespace base { |
| class Value; |
| } |
| |
| namespace net { |
| |
| class AuthCredentials; |
| class BoundNetLog; |
| class HostMappingRules; |
| class HostPortPair; |
| class HttpAuthController; |
| class HttpResponseInfo; |
| class HttpServerProperties; |
| class HttpStreamBase; |
| class ProxyInfo; |
| class SSLCertRequestInfo; |
| class SSLInfo; |
| struct HttpRequestInfo; |
| struct SSLConfig; |
| |
| // The HttpStreamRequest is the client's handle to the worker object which |
| // handles the creation of an HttpStream. While the HttpStream is being |
| // created, this object is the creator's handle for interacting with the |
| // HttpStream creation process. The request is cancelled by deleting it, after |
| // which no callbacks will be invoked. |
| class NET_EXPORT_PRIVATE HttpStreamRequest { |
| public: |
| // The HttpStreamRequest::Delegate is a set of callback methods for a |
| // HttpStreamRequestJob. Generally, only one of these methods will be |
| // called as a result of a stream request. |
| class NET_EXPORT_PRIVATE Delegate { |
| public: |
| virtual ~Delegate() {} |
| |
| // This is the success case. |
| // |stream| is now owned by the delegate. |
| // |used_ssl_config| indicates the actual SSL configuration used for this |
| // stream, since the HttpStreamRequest may have modified the configuration |
| // during stream processing. |
| // |used_proxy_info| indicates the actual ProxyInfo used for this stream, |
| // since the HttpStreamRequest performs the proxy resolution. |
| virtual void OnStreamReady( |
| const SSLConfig& used_ssl_config, |
| const ProxyInfo& used_proxy_info, |
| HttpStreamBase* stream) = 0; |
| |
| // This is the failure to create a stream case. |
| // |used_ssl_config| indicates the actual SSL configuration used for this |
| // stream, since the HttpStreamRequest may have modified the configuration |
| // during stream processing. |
| virtual void OnStreamFailed(int status, |
| const SSLConfig& used_ssl_config) = 0; |
| |
| // Called when we have a certificate error for the request. |
| // |used_ssl_config| indicates the actual SSL configuration used for this |
| // stream, since the HttpStreamRequest may have modified the configuration |
| // during stream processing. |
| virtual void OnCertificateError(int status, |
| const SSLConfig& used_ssl_config, |
| const SSLInfo& ssl_info) = 0; |
| |
| // This is the failure case where we need proxy authentication during |
| // proxy tunnel establishment. For the tunnel case, we were unable to |
| // create the HttpStream, so the caller provides the auth and then resumes |
| // the HttpStreamRequest. |
| // |
| // For the non-tunnel case, the caller will discover the authentication |
| // failure when reading response headers. At that point, he will handle the |
| // authentication failure and restart the HttpStreamRequest entirely. |
| // |
| // Ownership of |auth_controller| and |proxy_response| are owned |
| // by the HttpStreamRequest. |proxy_response| is not guaranteed to be usable |
| // after the lifetime of this callback. The delegate may take a reference |
| // to |auth_controller| if it is needed beyond the lifetime of this |
| // callback. |
| // |
| // |used_ssl_config| indicates the actual SSL configuration used for this |
| // stream, since the HttpStreamRequest may have modified the configuration |
| // during stream processing. |
| virtual void OnNeedsProxyAuth(const HttpResponseInfo& proxy_response, |
| const SSLConfig& used_ssl_config, |
| const ProxyInfo& used_proxy_info, |
| HttpAuthController* auth_controller) = 0; |
| |
| // This is the failure for SSL Client Auth |
| // Ownership of |cert_info| is retained by the HttpStreamRequest. The |
| // delegate may take a reference if it needs the cert_info beyond the |
| // lifetime of this callback. |
| virtual void OnNeedsClientAuth(const SSLConfig& used_ssl_config, |
| SSLCertRequestInfo* cert_info) = 0; |
| |
| // This is the failure of the CONNECT request through an HTTPS proxy. |
| // Headers can be read from |response_info|, while the body can be read |
| // from |stream|. |
| // |
| // |used_ssl_config| indicates the actual SSL configuration used for this |
| // stream, since the HttpStreamRequest may have modified the configuration |
| // during stream processing. |
| // |
| // |used_proxy_info| indicates the actual ProxyInfo used for this stream, |
| // since the HttpStreamRequest performs the proxy resolution. |
| // |
| // Ownership of |stream| is transferred to the delegate. |
| virtual void OnHttpsProxyTunnelResponse( |
| const HttpResponseInfo& response_info, |
| const SSLConfig& used_ssl_config, |
| const ProxyInfo& used_proxy_info, |
| HttpStreamBase* stream) = 0; |
| }; |
| |
| virtual ~HttpStreamRequest() {} |
| |
| // When a HttpStream creation process is stalled due to necessity |
| // of Proxy authentication credentials, the delegate OnNeedsProxyAuth |
| // will have been called. It now becomes the delegate's responsibility |
| // to collect the necessary credentials, and then call this method to |
| // resume the HttpStream creation process. |
| virtual int RestartTunnelWithProxyAuth( |
| const AuthCredentials& credentials) = 0; |
| |
| // Returns the LoadState for the request. |
| virtual LoadState GetLoadState() const = 0; |
| |
| // Returns true if TLS/NPN was negotiated for this stream. |
| virtual bool was_npn_negotiated() const = 0; |
| |
| // Protocol negotiated with the server. |
| virtual NextProto protocol_negotiated() const = 0; |
| |
| // Returns true if this stream is being fetched over SPDY. |
| virtual bool using_spdy() const = 0; |
| }; |
| |
| // The HttpStreamFactory defines an interface for creating usable HttpStreams. |
| class NET_EXPORT HttpStreamFactory { |
| public: |
| virtual ~HttpStreamFactory(); |
| |
| void ProcessAlternateProtocol( |
| HttpServerProperties* http_server_properties, |
| const std::string& alternate_protocol_str, |
| const HostPortPair& http_host_port_pair); |
| |
| GURL ApplyHostMappingRules(const GURL& url, HostPortPair* endpoint); |
| |
| // Virtual interface methods. |
| |
| // Request a stream. |
| // Will callback to the HttpStreamRequestDelegate upon completion. |
| virtual HttpStreamRequest* RequestStream( |
| const HttpRequestInfo& info, |
| const SSLConfig& server_ssl_config, |
| const SSLConfig& proxy_ssl_config, |
| HttpStreamRequest::Delegate* delegate, |
| const BoundNetLog& net_log) = 0; |
| |
| // Requests that enough connections for |num_streams| be opened. |
| virtual void PreconnectStreams(int num_streams, |
| const HttpRequestInfo& info, |
| const SSLConfig& server_ssl_config, |
| const SSLConfig& proxy_ssl_config) = 0; |
| |
| // If pipelining is supported, creates a Value summary of the currently active |
| // pipelines. Caller assumes ownership of the returned value. Otherwise, |
| // returns an empty Value. |
| virtual base::Value* PipelineInfoToValue() const = 0; |
| |
| virtual const HostMappingRules* GetHostMappingRules() const = 0; |
| |
| // Static settings |
| |
| // Reset all static settings to initialized values. Used to init test suite. |
| static void ResetStaticSettingsToInit(); |
| |
| // Turns spdy on or off. |
| static void set_spdy_enabled(bool value) { |
| spdy_enabled_ = value; |
| if (!spdy_enabled_) { |
| delete next_protos_; |
| next_protos_ = NULL; |
| } |
| } |
| static bool spdy_enabled() { return spdy_enabled_; } |
| |
| // Controls whether or not we use the Alternate-Protocol header. |
| static void set_use_alternate_protocols(bool value) { |
| use_alternate_protocols_ = value; |
| } |
| static bool use_alternate_protocols() { return use_alternate_protocols_; } |
| |
| // Controls whether or not we use ssl when in spdy mode. |
| static void set_force_spdy_over_ssl(bool value) { |
| force_spdy_over_ssl_ = value; |
| } |
| static bool force_spdy_over_ssl() { |
| return force_spdy_over_ssl_; |
| } |
| |
| // Controls whether or not we use spdy without npn. |
| static void set_force_spdy_always(bool value) { |
| force_spdy_always_ = value; |
| } |
| static bool force_spdy_always() { return force_spdy_always_; } |
| |
| // Add a URL to exclude from forced SPDY. |
| static void add_forced_spdy_exclusion(const std::string& value); |
| // Check if a HostPortPair is excluded from using spdy. |
| static bool HasSpdyExclusion(const HostPortPair& endpoint); |
| |
| // Sets http/1.1 as the only protocol supported via NPN. |
| static void EnableNpnHttpOnly(); |
| |
| // Sets http/1.1 and spdy/2 (the default spdy protocol) as the protocols |
| // supported via NPN. |
| static void EnableNpnSpdy(); |
| |
| // Sets http/1.1, spdy/2, and spdy/3 as the protocols supported via NPN. |
| static void EnableNpnSpdy3(); |
| |
| // Sets the protocols supported by NPN (next protocol negotiation) during the |
| // SSL handshake as well as by HTTP Alternate-Protocol. |
| static void SetNextProtos(const std::vector<std::string>& value); |
| static bool has_next_protos() { return next_protos_ != NULL; } |
| static const std::vector<std::string>& next_protos() { |
| return *next_protos_; |
| } |
| |
| protected: |
| HttpStreamFactory(); |
| |
| private: |
| static std::vector<std::string>* next_protos_; |
| static bool enabled_protocols_[NUM_ALTERNATE_PROTOCOLS]; |
| static bool spdy_enabled_; |
| static bool use_alternate_protocols_; |
| static bool force_spdy_over_ssl_; |
| static bool force_spdy_always_; |
| static std::list<HostPortPair>* forced_spdy_exclusions_; |
| |
| DISALLOW_COPY_AND_ASSIGN(HttpStreamFactory); |
| }; |
| |
| } // namespace net |
| |
| #endif // NET_HTTP_HTTP_STREAM_FACTORY_H_ |