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)#ifndef NET_HTTP_PROXY_CLIENT_SOCKET_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_HTTP_PROXY_CLIENT_SOCKET_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/ssl_client_socket.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/stream_socket.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HostPortPair;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpAuthController;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpStream;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpResponseInfo;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpRequestHeaders;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct HttpRequestInfo;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpAuthController;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE ProxyClientSocket : public StreamSocket {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxyClientSocket() {}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ProxyClientSocket() {}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the HttpResponseInfo (including HTTP Headers) from
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the response to the CONNECT request.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const HttpResponseInfo* GetConnectResponseInfo() const = 0;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Transfers ownership of a newly created HttpStream to the caller
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // which can be used to read the response body.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual HttpStream* CreateConnectResponseStream() = 0;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the HttpAuthController which can be used
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to interact with an HTTP Proxy Authorization Required (407) request.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const scoped_refptr<HttpAuthController>& GetAuthController() const
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      = 0;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If Connect (or its callback) returns PROXY_AUTH_REQUESTED, then
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // credentials should be added to the HttpAuthController before calling
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // RestartWithAuth.  Not all ProxyClientSocket implementations will be
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // restartable.  Such implementations should disconnect themselves and
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // return OK.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int RestartWithAuth(const CompletionCallback& callback) = 0;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true of the connection to the proxy is using SPDY.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsUsingSpdy() const = 0;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the protocol negotiated with the proxy.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual NextProto GetProtocolNegotiated() const = 0;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The HTTP CONNECT method for establishing a tunnel connection is documented
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in draft-luotonen-web-proxy-tunneling-01.txt and RFC 2817, Sections 5.2
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and 5.3.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void BuildTunnelRequest(const HttpRequestInfo& request_info,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const HttpRequestHeaders& auth_headers,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const HostPortPair& endpoint,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 std::string* request_line,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 HttpRequestHeaders* request_headers);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When an auth challenge (407 response) is received during tunnel
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // construction/ this method should be called.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static int HandleProxyAuthChallenge(HttpAuthController* auth,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      HttpResponseInfo* response,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const BoundNetLog& net_log);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Logs (to the log and in a histogram) a blocked CONNECT response.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void LogBlockedTunnelResponse(int http_response_code,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const GURL& url,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       bool is_https_proxy);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When a redirect (e.g. 302 response) is received during tunnel
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // construction, this method should be called to strip everything
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // but the Location header from the redirect response.  If it returns
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // false, the response should be discarded and tunnel construction should
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // fail.  |url| is for logging purposes.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool SanitizeProxyRedirect(HttpResponseInfo* response,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    const GURL& url);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ProxyClientSocket);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // NET_HTTP_PROXY_CLIENT_SOCKET_H_
92