| OLD | NEW |
| (Empty) |
| 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 HttpStream; | |
| 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 HttpStream* 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 HttpStream* 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_ | |
| OLD | NEW |