Home | History | Annotate | Download | only in socket_stream
      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 ClientSocketFactory;
     32 class ClientSocketHandle;
     33 class CookieOptions;
     34 class HostResolver;
     35 class HttpAuthController;
     36 class SSLInfo;
     37 class ServerBoundCertService;
     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      virtual ~RequestHeaders();
    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      virtual ~ResponseHeaders();
    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_
    405