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