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_
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"
28 class AuthChallengeInfo
;
30 class ClientSocketFactory
;
31 class ClientSocketHandle
;
34 class HttpAuthController
;
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
48 class NET_EXPORT SocketStream
49 : public base::RefCountedThreadSafe
<SocketStream
> {
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).
57 virtual ~UserData() {}
60 class NET_EXPORT Delegate
{
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
,
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
,
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
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
108 virtual bool CanSetCookie(SocketStream
* request
,
110 const std::string
& cookie_line
,
111 CookieOptions
* options
);
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
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();
184 friend class base::RefCountedThreadSafe
<SocketStream
>;
185 virtual ~SocketStream();
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
{
202 RequestHeaders() : IOBuffer() {}
204 void SetDataOffset(size_t offset
) {
205 data_
= const_cast<char*>(headers_
.data()) + offset
;
208 std::string headers_
;
211 virtual ~RequestHeaders();
214 class ResponseHeaders
: public IOBuffer
{
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
);
224 virtual ~ResponseHeaders();
226 scoped_ptr_malloc
<char> headers_
;
231 STATE_BEFORE_CONNECT
,
232 STATE_BEFORE_CONNECT_COMPLETE
,
234 STATE_RESOLVE_PROXY_COMPLETE
,
236 STATE_RESOLVE_HOST_COMPLETE
,
237 STATE_RESOLVE_PROTOCOL
,
238 STATE_RESOLVE_PROTOCOL_COMPLETE
,
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
,
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
,
254 STATE_SSL_CONNECT_COMPLETE
,
255 STATE_SSL_HANDLE_CERT_ERROR
,
256 STATE_SSL_HANDLE_CERT_ERROR_COMPLETE
,
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
);
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
);
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
);
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_
;
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_
;
351 ClientSocketFactory
* factory_
;
353 ProxyMode proxy_mode_
;
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_
;
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_
;
390 scoped_ptr
<SocketStreamMetrics
> metrics_
;
392 DISALLOW_COPY_AND_ASSIGN(SocketStream
);
397 #endif // NET_SOCKET_STREAM_SOCKET_STREAM_H_