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 |