Home | History | Annotate | Download | only in glue
      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 // This StreamSocket implementation wraps a ClientSocketHandle that is created
      6 // from the client socket pool after resolving proxies.
      7 
      8 #ifndef JINGLE_GLUE_PROXY_RESOLVING_CLIENT_SOCKET_H_
      9 #define JINGLE_GLUE_PROXY_RESOLVING_CLIENT_SOCKET_H_
     10 
     11 #include "base/basictypes.h"
     12 #include "base/compiler_specific.h"
     13 #include "base/memory/ref_counted.h"
     14 #include "base/memory/weak_ptr.h"
     15 #include "net/base/completion_callback.h"
     16 #include "net/base/host_port_pair.h"
     17 #include "net/base/net_errors.h"
     18 #include "net/base/net_log.h"
     19 #include "net/proxy/proxy_info.h"
     20 #include "net/proxy/proxy_service.h"
     21 #include "net/socket/stream_socket.h"
     22 #include "net/ssl/ssl_config_service.h"
     23 #include "url/gurl.h"
     24 
     25 namespace net {
     26 class ClientSocketFactory;
     27 class ClientSocketHandle;
     28 class HttpNetworkSession;
     29 class URLRequestContextGetter;
     30 }  // namespace net
     31 
     32 // TODO(sanjeevr): Move this to net/
     33 namespace jingle_glue {
     34 
     35 class ProxyResolvingClientSocket : public net::StreamSocket {
     36  public:
     37   // Constructs a new ProxyResolvingClientSocket. |socket_factory| is
     38   // the ClientSocketFactory that will be used by the underlying
     39   // HttpNetworkSession.  If |socket_factory| is NULL, the default
     40   // socket factory (net::ClientSocketFactory::GetDefaultFactory())
     41   // will be used.  |dest_host_port_pair| is the destination for this
     42   // socket.  The hostname must be non-empty and the port must be > 0.
     43   ProxyResolvingClientSocket(
     44       net::ClientSocketFactory* socket_factory,
     45       const scoped_refptr<net::URLRequestContextGetter>& request_context_getter,
     46       const net::SSLConfig& ssl_config,
     47       const net::HostPortPair& dest_host_port_pair);
     48   virtual ~ProxyResolvingClientSocket();
     49 
     50   // net::StreamSocket implementation.
     51   virtual int Read(net::IOBuffer* buf, int buf_len,
     52                    const net::CompletionCallback& callback) OVERRIDE;
     53   virtual int Write(net::IOBuffer* buf, int buf_len,
     54                     const net::CompletionCallback& callback) OVERRIDE;
     55   virtual int SetReceiveBufferSize(int32 size) OVERRIDE;
     56   virtual int SetSendBufferSize(int32 size) OVERRIDE;
     57   virtual int Connect(const net::CompletionCallback& callback) OVERRIDE;
     58   virtual void Disconnect() OVERRIDE;
     59   virtual bool IsConnected() const OVERRIDE;
     60   virtual bool IsConnectedAndIdle() const OVERRIDE;
     61   virtual int GetPeerAddress(net::IPEndPoint* address) const OVERRIDE;
     62   virtual int GetLocalAddress(net::IPEndPoint* address) const OVERRIDE;
     63   virtual const net::BoundNetLog& NetLog() const OVERRIDE;
     64   virtual void SetSubresourceSpeculation() OVERRIDE;
     65   virtual void SetOmniboxSpeculation() OVERRIDE;
     66   virtual bool WasEverUsed() const OVERRIDE;
     67   virtual bool UsingTCPFastOpen() const OVERRIDE;
     68   virtual bool WasNpnNegotiated() const OVERRIDE;
     69   virtual net::NextProto GetNegotiatedProtocol() const OVERRIDE;
     70   virtual bool GetSSLInfo(net::SSLInfo* ssl_info) OVERRIDE;
     71 
     72  private:
     73   // Proxy resolution and connection functions.
     74   void ProcessProxyResolveDone(int status);
     75   void ProcessConnectDone(int status);
     76 
     77   void CloseTransportSocket();
     78   void RunUserConnectCallback(int status);
     79   int ReconsiderProxyAfterError(int error);
     80   void ReportSuccessfulProxyConnection();
     81 
     82   // Callbacks passed to net APIs.
     83   net::CompletionCallback proxy_resolve_callback_;
     84   net::CompletionCallback connect_callback_;
     85 
     86   scoped_refptr<net::HttpNetworkSession> network_session_;
     87 
     88   // The transport socket.
     89   scoped_ptr<net::ClientSocketHandle> transport_;
     90 
     91   const net::SSLConfig ssl_config_;
     92   net::ProxyService::PacRequest* pac_request_;
     93   net::ProxyInfo proxy_info_;
     94   const net::HostPortPair dest_host_port_pair_;
     95   const GURL proxy_url_;
     96   bool tried_direct_connect_fallback_;
     97   net::BoundNetLog bound_net_log_;
     98 
     99   // The callback passed to Connect().
    100   net::CompletionCallback user_connect_callback_;
    101 
    102   base::WeakPtrFactory<ProxyResolvingClientSocket> weak_factory_;
    103 
    104   DISALLOW_COPY_AND_ASSIGN(ProxyResolvingClientSocket);
    105 };
    106 
    107 }  // namespace jingle_glue
    108 
    109 #endif  // JINGLE_GLUE_PROXY_RESOLVING_CLIENT_SOCKET_H_
    110