Add explicit |forceOnlineSignin| to user pod status
[chromium-blink-merge.git] / net / socket_stream / socket_stream.h
bloba91d5cac501824f94773226cb7fff2cbfdb4b0da
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.
5 #ifndef NET_SOCKET_STREAM_SOCKET_STREAM_H_
6 #define NET_SOCKET_STREAM_SOCKET_STREAM_H_
8 #include <deque>
9 #include <map>
10 #include <string>
12 #include "base/memory/linked_ptr.h"
13 #include "base/memory/ref_counted.h"
14 #include "base/memory/scoped_ptr.h"
15 #include "net/base/address_list.h"
16 #include "net/base/completion_callback.h"
17 #include "net/base/io_buffer.h"
18 #include "net/base/net_errors.h"
19 #include "net/base/net_export.h"
20 #include "net/base/net_log.h"
21 #include "net/base/privacy_mode.h"
22 #include "net/proxy/proxy_service.h"
23 #include "net/ssl/ssl_config_service.h"
24 #include "net/url_request/url_request.h"
26 namespace net {
28 class AuthChallengeInfo;
29 class CertVerifier;
30 class ClientSocketFactory;
31 class ClientSocketHandle;
32 class CookieOptions;
33 class HostResolver;
34 class HttpAuthController;
35 class SSLInfo;
36 class ServerBoundCertService;
37 class SingleRequestHostResolver;
38 class SocketStreamMetrics;
39 class TransportSecurityState;
40 class URLRequestContext;
42 // SocketStream is used to implement Web Sockets.
43 // It provides plain full-duplex stream with proxy and SSL support.
44 // For proxy authentication, only basic mechanisum is supported. It will try
45 // authentication identity for proxy URL first. If server requires proxy
46 // authentication, it will try authentication identity for realm that server
47 // requests.
48 class NET_EXPORT SocketStream
49 : public base::RefCountedThreadSafe<SocketStream> {
50 public:
51 // Derive from this class and add your own data members to associate extra
52 // information with a SocketStream. Use GetUserData(key) and
53 // SetUserData(key, data).
54 class UserData {
55 public:
56 UserData() {}
57 virtual ~UserData() {}
60 class NET_EXPORT Delegate {
61 public:
62 virtual int OnStartOpenConnection(SocketStream* socket,
63 const CompletionCallback& callback);
65 // Called when a socket stream has been connected. The socket stream is
66 // allowed to buffer pending send data at most |max_pending_send_allowed|
67 // bytes. A client of the socket stream should keep track of how much
68 // pending send data it has and must not call SendData() if the pending
69 // data goes over |max_pending_send_allowed| bytes.
70 virtual void OnConnected(SocketStream* socket,
71 int max_pending_send_allowed) = 0;
73 // Called when |amount_sent| bytes of data are sent.
74 virtual void OnSentData(SocketStream* socket,
75 int amount_sent) = 0;
77 // Called when |len| bytes of |data| are received.
78 virtual void OnReceivedData(SocketStream* socket,
79 const char* data, int len) = 0;
81 // Called when the socket stream has been closed.
82 virtual void OnClose(SocketStream* socket) = 0;
84 // Called when proxy authentication required.
85 // The delegate should call RestartWithAuth() if credential for |auth_info|
86 // is found in password database, or call Close() to close the connection.
87 virtual void OnAuthRequired(SocketStream* socket,
88 AuthChallengeInfo* auth_info);
90 // Called when using SSL and the server responds with a certificate with an
91 // error. The delegate should call CancelBecauseOfCertError() or
92 // ContinueDespiteCertError() to resume connection handling.
93 virtual void OnSSLCertificateError(SocketStream* socket,
94 const SSLInfo& ssl_info,
95 bool fatal);
97 // Called when an error occured.
98 // This is only for error reporting to the delegate.
99 // |error| is net::Error.
100 virtual void OnError(const SocketStream* socket, int error) {}
102 // Called when reading cookies to allow the delegate to block access to the
103 // cookie.
104 virtual bool CanGetCookies(SocketStream* socket, const GURL& url);
106 // Called when a cookie is set to allow the delegate to block access to the
107 // cookie.
108 virtual bool CanSetCookie(SocketStream* request,
109 const GURL& url,
110 const std::string& cookie_line,
111 CookieOptions* options);
113 protected:
114 virtual ~Delegate() {}
117 SocketStream(const GURL& url, Delegate* delegate);
119 // The user data allows the clients to associate data with this job.
120 // Multiple user data values can be stored under different keys.
121 // This job will TAKE OWNERSHIP of the given data pointer, and will
122 // delete the object if it is changed or the job is destroyed.
123 UserData* GetUserData(const void* key) const;
124 void SetUserData(const void* key, UserData* data);
126 const GURL& url() const { return url_; }
127 bool is_secure() const;
128 const AddressList& address_list() const { return addresses_; }
129 Delegate* delegate() const { return delegate_; }
130 int max_pending_send_allowed() const { return max_pending_send_allowed_; }
132 URLRequestContext* context() { return context_; }
133 // There're some asynchronous operations and members that are constructed from
134 // |context|. Be careful when you use this for the second time or more.
135 void set_context(URLRequestContext* context);
137 const SSLConfig& server_ssl_config() const { return server_ssl_config_; }
138 PrivacyMode privacy_mode() const { return privacy_mode_; }
139 void CheckPrivacyMode();
141 BoundNetLog* net_log() { return &net_log_; }
143 // Opens the connection on the IO thread.
144 // Once the connection is established, calls delegate's OnConnected.
145 virtual void Connect();
147 // Buffers |data| of |len| bytes for send and returns true if successful.
148 // If size of buffered data exceeds |max_pending_send_allowed_|, sends no
149 // data and returns false. |len| must be positive.
150 virtual bool SendData(const char* data, int len);
152 // Requests to close the connection.
153 // Once the connection is closed, calls delegate's OnClose.
154 virtual void Close();
156 // Restarts with authentication info.
157 // Should be used for response of OnAuthRequired.
158 virtual void RestartWithAuth(const AuthCredentials& credentials);
160 // Detach delegate. Call before delegate is deleted.
161 // Once delegate is detached, close the socket stream and never call delegate
162 // back.
163 virtual void DetachDelegate();
165 const ProxyServer& proxy_server() const;
167 // Sets an alternative ClientSocketFactory. Doesn't take ownership of
168 // |factory|. For testing purposes only.
169 void SetClientSocketFactory(ClientSocketFactory* factory);
171 // Cancels the connection because of an error.
172 // |error| is net::Error which represents the error.
173 void CancelWithError(int error);
175 // Cancels the connection because of receiving a certificate with an error.
176 void CancelWithSSLError(const SSLInfo& ssl_info);
178 // Continues to establish the connection in spite of an error. Usually this
179 // case happens because users allow certificate with an error by manual
180 // actions on alert dialog or browser cached such kinds of user actions.
181 void ContinueDespiteError();
183 protected:
184 friend class base::RefCountedThreadSafe<SocketStream>;
185 virtual ~SocketStream();
187 Delegate* delegate_;
189 private:
190 FRIEND_TEST_ALL_PREFIXES(SocketStreamTest, IOPending);
191 FRIEND_TEST_ALL_PREFIXES(SocketStreamTest, SwitchAfterPending);
192 FRIEND_TEST_ALL_PREFIXES(SocketStreamTest,
193 NullContextSocketStreamShouldNotCrash);
195 friend class WebSocketThrottleTest;
197 typedef std::map<const void*, linked_ptr<UserData> > UserDataMap;
198 typedef std::deque< scoped_refptr<IOBufferWithSize> > PendingDataQueue;
200 class RequestHeaders : public IOBuffer {
201 public:
202 RequestHeaders() : IOBuffer() {}
204 void SetDataOffset(size_t offset) {
205 data_ = const_cast<char*>(headers_.data()) + offset;
208 std::string headers_;
210 private:
211 virtual ~RequestHeaders();
214 class ResponseHeaders : public IOBuffer {
215 public:
216 ResponseHeaders();
218 void SetDataOffset(size_t offset) { data_ = headers_.get() + offset; }
219 char* headers() const { return headers_.get(); }
220 void Reset() { headers_.reset(); }
221 void Realloc(size_t new_size);
223 private:
224 virtual ~ResponseHeaders();
226 scoped_ptr_malloc<char> headers_;
229 enum State {
230 STATE_NONE,
231 STATE_BEFORE_CONNECT,
232 STATE_BEFORE_CONNECT_COMPLETE,
233 STATE_RESOLVE_PROXY,
234 STATE_RESOLVE_PROXY_COMPLETE,
235 STATE_RESOLVE_HOST,
236 STATE_RESOLVE_HOST_COMPLETE,
237 STATE_RESOLVE_PROTOCOL,
238 STATE_RESOLVE_PROTOCOL_COMPLETE,
239 STATE_TCP_CONNECT,
240 STATE_TCP_CONNECT_COMPLETE,
241 STATE_GENERATE_PROXY_AUTH_TOKEN,
242 STATE_GENERATE_PROXY_AUTH_TOKEN_COMPLETE,
243 STATE_WRITE_TUNNEL_HEADERS,
244 STATE_WRITE_TUNNEL_HEADERS_COMPLETE,
245 STATE_READ_TUNNEL_HEADERS,
246 STATE_READ_TUNNEL_HEADERS_COMPLETE,
247 STATE_SOCKS_CONNECT,
248 STATE_SOCKS_CONNECT_COMPLETE,
249 STATE_SECURE_PROXY_CONNECT,
250 STATE_SECURE_PROXY_CONNECT_COMPLETE,
251 STATE_SECURE_PROXY_HANDLE_CERT_ERROR,
252 STATE_SECURE_PROXY_HANDLE_CERT_ERROR_COMPLETE,
253 STATE_SSL_CONNECT,
254 STATE_SSL_CONNECT_COMPLETE,
255 STATE_SSL_HANDLE_CERT_ERROR,
256 STATE_SSL_HANDLE_CERT_ERROR_COMPLETE,
257 STATE_READ_WRITE,
258 STATE_AUTH_REQUIRED,
259 STATE_CLOSE,
262 enum ProxyMode {
263 kDirectConnection, // If using a direct connection
264 kTunnelProxy, // If using a tunnel (CONNECT method as HTTPS)
265 kSOCKSProxy, // If using a SOCKS proxy
268 // Use the same number as HttpNetworkTransaction::kMaxHeaderBufSize.
269 enum { kMaxTunnelResponseHeadersSize = 32768 }; // 32 kilobytes.
271 // Used for WebSocketThrottleTest.
272 void set_addresses(const AddressList& addresses);
274 void DoClose();
276 // Finishes the job.
277 // Calls OnError and OnClose of delegate, and no more
278 // notifications will be sent to delegate.
279 void Finish(int result);
281 int DidEstablishConnection();
282 int DidReceiveData(int result);
283 // Given the number of bytes sent,
284 // - notifies the |delegate_| and |metrics_| of this event.
285 // - drains sent data from |current_write_buf_|.
286 // - if |current_write_buf_| has been fully sent, sets NULL to
287 // |current_write_buf_| to get ready for next write.
288 // and then, returns OK.
289 void DidSendData(int result);
291 void OnIOCompleted(int result);
292 void OnReadCompleted(int result);
293 void OnWriteCompleted(int result);
295 void DoLoop(int result);
297 int DoBeforeConnect();
298 int DoBeforeConnectComplete(int result);
299 int DoResolveProxy();
300 int DoResolveProxyComplete(int result);
301 int DoResolveHost();
302 int DoResolveHostComplete(int result);
303 int DoResolveProtocol(int result);
304 int DoResolveProtocolComplete(int result);
305 int DoTcpConnect(int result);
306 int DoTcpConnectComplete(int result);
307 int DoGenerateProxyAuthToken();
308 int DoGenerateProxyAuthTokenComplete(int result);
309 int DoWriteTunnelHeaders();
310 int DoWriteTunnelHeadersComplete(int result);
311 int DoReadTunnelHeaders();
312 int DoReadTunnelHeadersComplete(int result);
313 int DoSOCKSConnect();
314 int DoSOCKSConnectComplete(int result);
315 int DoSecureProxyConnect();
316 int DoSecureProxyConnectComplete(int result);
317 int DoSecureProxyHandleCertError(int result);
318 int DoSecureProxyHandleCertErrorComplete(int result);
319 int DoSSLConnect();
320 int DoSSLConnectComplete(int result);
321 int DoSSLHandleCertError(int result);
322 int DoSSLHandleCertErrorComplete(int result);
323 int DoReadWrite(int result);
325 GURL ProxyAuthOrigin() const;
326 int HandleAuthChallenge(const HttpResponseHeaders* headers);
327 int HandleCertificateRequest(int result, SSLConfig* ssl_config);
328 void DoAuthRequired();
329 void DoRestartWithAuth();
331 int HandleCertificateError(int result);
332 int AllowCertErrorForReconnection(SSLConfig* ssl_config);
334 // Returns the sum of the size of buffers in |pending_write_bufs_|.
335 size_t GetTotalSizeOfPendingWriteBufs() const;
337 BoundNetLog net_log_;
339 GURL url_;
340 // The number of bytes allowed to be buffered in this object. If the size of
341 // buffered data which is
342 // current_write_buf_.BytesRemaining() +
343 // sum of the size of buffers in |pending_write_bufs_|
344 // exceeds this limit, SendData() fails.
345 int max_pending_send_allowed_;
346 URLRequestContext* context_;
348 UserDataMap user_data_;
350 State next_state_;
351 ClientSocketFactory* factory_;
353 ProxyMode proxy_mode_;
355 GURL proxy_url_;
356 ProxyService::PacRequest* pac_request_;
357 ProxyInfo proxy_info_;
359 scoped_refptr<HttpAuthController> proxy_auth_controller_;
361 scoped_refptr<RequestHeaders> tunnel_request_headers_;
362 size_t tunnel_request_headers_bytes_sent_;
363 scoped_refptr<ResponseHeaders> tunnel_response_headers_;
364 int tunnel_response_headers_capacity_;
365 int tunnel_response_headers_len_;
367 scoped_ptr<SingleRequestHostResolver> resolver_;
368 AddressList addresses_;
369 scoped_ptr<ClientSocketHandle> connection_;
371 SSLConfig server_ssl_config_;
372 SSLConfig proxy_ssl_config_;
373 PrivacyMode privacy_mode_;
375 CompletionCallback io_callback_;
377 scoped_refptr<IOBuffer> read_buf_;
378 int read_buf_size_;
380 // Buffer to hold data to pass to socket_.
381 scoped_refptr<DrainableIOBuffer> current_write_buf_;
382 // True iff there's no error and this instance is waiting for completion of
383 // Write operation by socket_.
384 bool waiting_for_write_completion_;
385 PendingDataQueue pending_write_bufs_;
387 bool closing_;
388 bool server_closed_;
390 scoped_ptr<SocketStreamMetrics> metrics_;
392 DISALLOW_COPY_AND_ASSIGN(SocketStream);
395 } // namespace net
397 #endif // NET_SOCKET_STREAM_SOCKET_STREAM_H_