15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This StreamSocket implementation wraps a ClientSocketHandle that is created
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from the client socket pool after resolving proxies.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef JINGLE_GLUE_PROXY_RESOLVING_CLIENT_SOCKET_H_
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define JINGLE_GLUE_PROXY_RESOLVING_CLIENT_SOCKET_H_
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/completion_callback.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/host_port_pair.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_log.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_info.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_service.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/stream_socket.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/ssl_config_service.h"
237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ClientSocketFactory;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ClientSocketHandle;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpNetworkSession;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequestContextGetter;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(sanjeevr): Move this to net/
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace jingle_glue {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProxyResolvingClientSocket : public net::StreamSocket {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Constructs a new ProxyResolvingClientSocket. |socket_factory| is
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the ClientSocketFactory that will be used by the underlying
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HttpNetworkSession.  If |socket_factory| is NULL, the default
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // socket factory (net::ClientSocketFactory::GetDefaultFactory())
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // will be used.  |dest_host_port_pair| is the destination for this
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // socket.  The hostname must be non-empty and the port must be > 0.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyResolvingClientSocket(
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::ClientSocketFactory* socket_factory,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const scoped_refptr<net::URLRequestContextGetter>& request_context_getter,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::SSLConfig& ssl_config,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::HostPortPair& dest_host_port_pair);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ProxyResolvingClientSocket();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // net::StreamSocket implementation.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int Read(net::IOBuffer* buf, int buf_len,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const net::CompletionCallback& callback) OVERRIDE;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int Write(net::IOBuffer* buf, int buf_len,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const net::CompletionCallback& callback) OVERRIDE;
55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual int SetReceiveBufferSize(int32 size) OVERRIDE;
56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual int SetSendBufferSize(int32 size) OVERRIDE;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int Connect(const net::CompletionCallback& callback) OVERRIDE;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Disconnect() OVERRIDE;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsConnected() const OVERRIDE;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsConnectedAndIdle() const OVERRIDE;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GetPeerAddress(net::IPEndPoint* address) const OVERRIDE;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GetLocalAddress(net::IPEndPoint* address) const OVERRIDE;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const net::BoundNetLog& NetLog() const OVERRIDE;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetSubresourceSpeculation() OVERRIDE;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetOmniboxSpeculation() OVERRIDE;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool WasEverUsed() const OVERRIDE;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool UsingTCPFastOpen() const OVERRIDE;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool WasNpnNegotiated() const OVERRIDE;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual net::NextProto GetNegotiatedProtocol() const OVERRIDE;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool GetSSLInfo(net::SSLInfo* ssl_info) OVERRIDE;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Proxy resolution and connection functions.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ProcessProxyResolveDone(int status);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ProcessConnectDone(int status);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CloseTransportSocket();
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunUserConnectCallback(int status);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int ReconsiderProxyAfterError(int error);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReportSuccessfulProxyConnection();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callbacks passed to net APIs.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::CompletionCallback proxy_resolve_callback_;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::CompletionCallback connect_callback_;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::HttpNetworkSession> network_session_;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The transport socket.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<net::ClientSocketHandle> transport_;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const net::SSLConfig ssl_config_;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::ProxyService::PacRequest* pac_request_;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::ProxyInfo proxy_info_;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const net::HostPortPair dest_host_port_pair_;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL proxy_url_;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool tried_direct_connect_fallback_;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::BoundNetLog bound_net_log_;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The callback passed to Connect().
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::CompletionCallback user_connect_callback_;
101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::WeakPtrFactory<ProxyResolvingClientSocket> weak_factory_;
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ProxyResolvingClientSocket);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace jingle_glue
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // JINGLE_GLUE_PROXY_RESOLVING_CLIENT_SOCKET_H_
110