Home | History | Annotate | Download | only in http
      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_STREAM_FACTORY_H_
      6 #define NET_HTTP_HTTP_STREAM_FACTORY_H_
      7 
      8 #include <list>
      9 #include <string>
     10 
     11 #include "base/basictypes.h"
     12 #include "base/memory/ref_counted.h"
     13 #include "base/strings/string16.h"
     14 #include "net/base/completion_callback.h"
     15 #include "net/base/load_states.h"
     16 #include "net/base/net_export.h"
     17 #include "net/base/request_priority.h"
     18 #include "net/http/http_server_properties.h"
     19 // This file can be included from net/http even though
     20 // it is in net/websockets because it doesn't
     21 // introduce any link dependency to net/websockets.
     22 #include "net/websockets/websocket_handshake_stream_base.h"
     23 
     24 class GURL;
     25 
     26 namespace base {
     27 class Value;
     28 }
     29 
     30 namespace net {
     31 
     32 class AuthCredentials;
     33 class BoundNetLog;
     34 class HostMappingRules;
     35 class HostPortPair;
     36 class HttpAuthController;
     37 class HttpNetworkSession;
     38 class HttpResponseInfo;
     39 class HttpServerProperties;
     40 class HttpStreamBase;
     41 class ProxyInfo;
     42 class SSLCertRequestInfo;
     43 class SSLInfo;
     44 struct HttpRequestInfo;
     45 struct SSLConfig;
     46 
     47 // The HttpStreamRequest is the client's handle to the worker object which
     48 // handles the creation of an HttpStream.  While the HttpStream is being
     49 // created, this object is the creator's handle for interacting with the
     50 // HttpStream creation process.  The request is cancelled by deleting it, after
     51 // which no callbacks will be invoked.
     52 class NET_EXPORT_PRIVATE HttpStreamRequest {
     53  public:
     54   // The HttpStreamRequest::Delegate is a set of callback methods for a
     55   // HttpStreamRequestJob.  Generally, only one of these methods will be
     56   // called as a result of a stream request.
     57   class NET_EXPORT_PRIVATE Delegate {
     58    public:
     59     virtual ~Delegate() {}
     60 
     61     // This is the success case for RequestStream.
     62     // |stream| is now owned by the delegate.
     63     // |used_ssl_config| indicates the actual SSL configuration used for this
     64     // stream, since the HttpStreamRequest may have modified the configuration
     65     // during stream processing.
     66     // |used_proxy_info| indicates the actual ProxyInfo used for this stream,
     67     // since the HttpStreamRequest performs the proxy resolution.
     68     virtual void OnStreamReady(
     69         const SSLConfig& used_ssl_config,
     70         const ProxyInfo& used_proxy_info,
     71         HttpStreamBase* stream) = 0;
     72 
     73     // This is the success case for RequestWebSocketHandshakeStream.
     74     // |stream| is now owned by the delegate.
     75     // |used_ssl_config| indicates the actual SSL configuration used for this
     76     // stream, since the HttpStreamRequest may have modified the configuration
     77     // during stream processing.
     78     // |used_proxy_info| indicates the actual ProxyInfo used for this stream,
     79     // since the HttpStreamRequest performs the proxy resolution.
     80     virtual void OnWebSocketHandshakeStreamReady(
     81         const SSLConfig& used_ssl_config,
     82         const ProxyInfo& used_proxy_info,
     83         WebSocketHandshakeStreamBase* stream) = 0;
     84 
     85     // This is the failure to create a stream case.
     86     // |used_ssl_config| indicates the actual SSL configuration used for this
     87     // stream, since the HttpStreamRequest may have modified the configuration
     88     // during stream processing.
     89     virtual void OnStreamFailed(int status,
     90                                 const SSLConfig& used_ssl_config) = 0;
     91 
     92     // Called when we have a certificate error for the request.
     93     // |used_ssl_config| indicates the actual SSL configuration used for this
     94     // stream, since the HttpStreamRequest may have modified the configuration
     95     // during stream processing.
     96     virtual void OnCertificateError(int status,
     97                                     const SSLConfig& used_ssl_config,
     98                                     const SSLInfo& ssl_info) = 0;
     99 
    100     // This is the failure case where we need proxy authentication during
    101     // proxy tunnel establishment.  For the tunnel case, we were unable to
    102     // create the HttpStream, so the caller provides the auth and then resumes
    103     // the HttpStreamRequest.
    104     //
    105     // For the non-tunnel case, the caller will discover the authentication
    106     // failure when reading response headers. At that point, he will handle the
    107     // authentication failure and restart the HttpStreamRequest entirely.
    108     //
    109     // Ownership of |auth_controller| and |proxy_response| are owned
    110     // by the HttpStreamRequest. |proxy_response| is not guaranteed to be usable
    111     // after the lifetime of this callback.  The delegate may take a reference
    112     // to |auth_controller| if it is needed beyond the lifetime of this
    113     // callback.
    114     //
    115     // |used_ssl_config| indicates the actual SSL configuration used for this
    116     // stream, since the HttpStreamRequest may have modified the configuration
    117     // during stream processing.
    118     virtual void OnNeedsProxyAuth(const HttpResponseInfo& proxy_response,
    119                                   const SSLConfig& used_ssl_config,
    120                                   const ProxyInfo& used_proxy_info,
    121                                   HttpAuthController* auth_controller) = 0;
    122 
    123     // This is the failure for SSL Client Auth
    124     // Ownership of |cert_info| is retained by the HttpStreamRequest.  The
    125     // delegate may take a reference if it needs the cert_info beyond the
    126     // lifetime of this callback.
    127     virtual void OnNeedsClientAuth(const SSLConfig& used_ssl_config,
    128                                    SSLCertRequestInfo* cert_info) = 0;
    129 
    130     // This is the failure of the CONNECT request through an HTTPS proxy.
    131     // Headers can be read from |response_info|, while the body can be read
    132     // from |stream|.
    133     //
    134     // |used_ssl_config| indicates the actual SSL configuration used for this
    135     // stream, since the HttpStreamRequest may have modified the configuration
    136     // during stream processing.
    137     //
    138     // |used_proxy_info| indicates the actual ProxyInfo used for this stream,
    139     // since the HttpStreamRequest performs the proxy resolution.
    140     //
    141     // Ownership of |stream| is transferred to the delegate.
    142     virtual void OnHttpsProxyTunnelResponse(
    143         const HttpResponseInfo& response_info,
    144         const SSLConfig& used_ssl_config,
    145         const ProxyInfo& used_proxy_info,
    146         HttpStreamBase* stream) = 0;
    147   };
    148 
    149   virtual ~HttpStreamRequest() {}
    150 
    151   // When a HttpStream creation process is stalled due to necessity
    152   // of Proxy authentication credentials, the delegate OnNeedsProxyAuth
    153   // will have been called.  It now becomes the delegate's responsibility
    154   // to collect the necessary credentials, and then call this method to
    155   // resume the HttpStream creation process.
    156   virtual int RestartTunnelWithProxyAuth(
    157       const AuthCredentials& credentials) = 0;
    158 
    159   // Called when the priority of the parent transaction changes.
    160   virtual void SetPriority(RequestPriority priority) = 0;
    161 
    162   // Returns the LoadState for the request.
    163   virtual LoadState GetLoadState() const = 0;
    164 
    165   // Returns true if TLS/NPN was negotiated for this stream.
    166   virtual bool was_npn_negotiated() const = 0;
    167 
    168   // Protocol negotiated with the server.
    169   virtual NextProto protocol_negotiated() const = 0;
    170 
    171   // Returns true if this stream is being fetched over SPDY.
    172   virtual bool using_spdy() const = 0;
    173 };
    174 
    175 // The HttpStreamFactory defines an interface for creating usable HttpStreams.
    176 class NET_EXPORT HttpStreamFactory {
    177  public:
    178   virtual ~HttpStreamFactory();
    179 
    180   void ProcessAlternateProtocol(
    181       const base::WeakPtr<HttpServerProperties>& http_server_properties,
    182       const std::vector<std::string>& alternate_protocol_values,
    183       const HostPortPair& http_host_port_pair,
    184       const HttpNetworkSession& session);
    185 
    186   GURL ApplyHostMappingRules(const GURL& url, HostPortPair* endpoint);
    187 
    188   // Virtual interface methods.
    189 
    190   // Request a stream.
    191   // Will call delegate->OnStreamReady on successful completion.
    192   virtual HttpStreamRequest* RequestStream(
    193       const HttpRequestInfo& info,
    194       RequestPriority priority,
    195       const SSLConfig& server_ssl_config,
    196       const SSLConfig& proxy_ssl_config,
    197       HttpStreamRequest::Delegate* delegate,
    198       const BoundNetLog& net_log) = 0;
    199 
    200   // Request a WebSocket handshake stream.
    201   // Will call delegate->OnWebSocketHandshakeStreamReady on successful
    202   // completion.
    203   virtual HttpStreamRequest* RequestWebSocketHandshakeStream(
    204       const HttpRequestInfo& info,
    205       RequestPriority priority,
    206       const SSLConfig& server_ssl_config,
    207       const SSLConfig& proxy_ssl_config,
    208       HttpStreamRequest::Delegate* delegate,
    209       WebSocketHandshakeStreamBase::CreateHelper* create_helper,
    210       const BoundNetLog& net_log) = 0;
    211 
    212   // Requests that enough connections for |num_streams| be opened.
    213   virtual void PreconnectStreams(int num_streams,
    214                                  const HttpRequestInfo& info,
    215                                  RequestPriority priority,
    216                                  const SSLConfig& server_ssl_config,
    217                                  const SSLConfig& proxy_ssl_config) = 0;
    218 
    219   virtual const HostMappingRules* GetHostMappingRules() const = 0;
    220 
    221   // Static settings
    222 
    223   // Reset all static settings to initialized values. Used to init test suite.
    224   static void ResetStaticSettingsToInit();
    225 
    226   // Turns spdy on or off.
    227   // TODO(mmenke):  Figure out if this can be made a property of the
    228   //                HttpNetworkSession.
    229   static void set_spdy_enabled(bool value) {
    230     spdy_enabled_ = value;
    231   }
    232   static bool spdy_enabled() { return spdy_enabled_; }
    233 
    234  protected:
    235   HttpStreamFactory();
    236 
    237  private:
    238   static bool spdy_enabled_;
    239 
    240   DISALLOW_COPY_AND_ASSIGN(HttpStreamFactory);
    241 };
    242 
    243 }  // namespace net
    244 
    245 #endif  // NET_HTTP_HTTP_STREAM_FACTORY_H_
    246