1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef NET_HTTP_PROXY_CLIENT_SOCKET_H_ 6*6777b538SAndroid Build Coastguard Worker #define NET_HTTP_PROXY_CLIENT_SOCKET_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <memory> 9*6777b538SAndroid Build Coastguard Worker #include <string> 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker #include "net/base/completion_once_callback.h" 12*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h" 13*6777b538SAndroid Build Coastguard Worker #include "net/base/request_priority.h" 14*6777b538SAndroid Build Coastguard Worker #include "net/socket/ssl_client_socket.h" 15*6777b538SAndroid Build Coastguard Worker #include "net/socket/stream_socket.h" 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker namespace net { 18*6777b538SAndroid Build Coastguard Worker 19*6777b538SAndroid Build Coastguard Worker class HostPortPair; 20*6777b538SAndroid Build Coastguard Worker class HttpAuthController; 21*6777b538SAndroid Build Coastguard Worker class HttpResponseInfo; 22*6777b538SAndroid Build Coastguard Worker class HttpRequestHeaders; 23*6777b538SAndroid Build Coastguard Worker class HttpAuthController; 24*6777b538SAndroid Build Coastguard Worker class NetLogWithSource; 25*6777b538SAndroid Build Coastguard Worker 26*6777b538SAndroid Build Coastguard Worker // A common base class for a stream socket tunneled through a proxy. 27*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE ProxyClientSocket : public StreamSocket { 28*6777b538SAndroid Build Coastguard Worker public: 29*6777b538SAndroid Build Coastguard Worker ProxyClientSocket() = default; 30*6777b538SAndroid Build Coastguard Worker 31*6777b538SAndroid Build Coastguard Worker ProxyClientSocket(const ProxyClientSocket&) = delete; 32*6777b538SAndroid Build Coastguard Worker ProxyClientSocket& operator=(const ProxyClientSocket&) = delete; 33*6777b538SAndroid Build Coastguard Worker 34*6777b538SAndroid Build Coastguard Worker ~ProxyClientSocket() override = default; 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Worker // Returns the HttpResponseInfo (including HTTP Headers) from 37*6777b538SAndroid Build Coastguard Worker // the response to the CONNECT request. 38*6777b538SAndroid Build Coastguard Worker virtual const HttpResponseInfo* GetConnectResponseInfo() const = 0; 39*6777b538SAndroid Build Coastguard Worker 40*6777b538SAndroid Build Coastguard Worker // Returns the HttpAuthController which can be used 41*6777b538SAndroid Build Coastguard Worker // to interact with an HTTP Proxy Authorization Required (407) request. 42*6777b538SAndroid Build Coastguard Worker virtual const scoped_refptr<HttpAuthController>& GetAuthController() const 43*6777b538SAndroid Build Coastguard Worker = 0; 44*6777b538SAndroid Build Coastguard Worker 45*6777b538SAndroid Build Coastguard Worker // If Connect (or its callback) returns PROXY_AUTH_REQUESTED, then an 46*6777b538SAndroid Build Coastguard Worker // auth challenge was received. If the HttpAuthController's HaveAuth() 47*6777b538SAndroid Build Coastguard Worker // method returns true, then the request just needs to be restarted with 48*6777b538SAndroid Build Coastguard Worker // this method to try with those credentials, and new credentials cannot 49*6777b538SAndroid Build Coastguard Worker // be provided. Otherwise, credentials should be added to the 50*6777b538SAndroid Build Coastguard Worker // HttpAuthController before calling RestartWithAuth. Not all 51*6777b538SAndroid Build Coastguard Worker // ProxyClientSocket implementations will be restartable. Such 52*6777b538SAndroid Build Coastguard Worker // implementations should disconnect themselves and return OK. 53*6777b538SAndroid Build Coastguard Worker virtual int RestartWithAuth(CompletionOnceCallback callback) = 0; 54*6777b538SAndroid Build Coastguard Worker 55*6777b538SAndroid Build Coastguard Worker // Set the priority of the underlying stream (for SPDY and QUIC) 56*6777b538SAndroid Build Coastguard Worker virtual void SetStreamPriority(RequestPriority priority); 57*6777b538SAndroid Build Coastguard Worker 58*6777b538SAndroid Build Coastguard Worker protected: 59*6777b538SAndroid Build Coastguard Worker // The HTTP CONNECT method for establishing a tunnel connection is documented 60*6777b538SAndroid Build Coastguard Worker // in Section 9.3.6 of RFC 9110. 61*6777b538SAndroid Build Coastguard Worker // https://www.rfc-editor.org/rfc/rfc9110#name-connect 62*6777b538SAndroid Build Coastguard Worker static void BuildTunnelRequest(const HostPortPair& endpoint, 63*6777b538SAndroid Build Coastguard Worker const HttpRequestHeaders& extra_headers, 64*6777b538SAndroid Build Coastguard Worker const std::string& user_agent, 65*6777b538SAndroid Build Coastguard Worker std::string* request_line, 66*6777b538SAndroid Build Coastguard Worker HttpRequestHeaders* request_headers); 67*6777b538SAndroid Build Coastguard Worker 68*6777b538SAndroid Build Coastguard Worker // When an auth challenge (407 response) is received during tunnel 69*6777b538SAndroid Build Coastguard Worker // construction/ this method should be called. 70*6777b538SAndroid Build Coastguard Worker static int HandleProxyAuthChallenge(HttpAuthController* auth, 71*6777b538SAndroid Build Coastguard Worker HttpResponseInfo* response, 72*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& net_log); 73*6777b538SAndroid Build Coastguard Worker 74*6777b538SAndroid Build Coastguard Worker // When a proxy authentication response is received during tunnel 75*6777b538SAndroid Build Coastguard Worker // construction, this method should be called to strip everything 76*6777b538SAndroid Build Coastguard Worker // but the auth header from the redirect response. 77*6777b538SAndroid Build Coastguard Worker static void SanitizeProxyAuth(HttpResponseInfo& response); 78*6777b538SAndroid Build Coastguard Worker }; 79*6777b538SAndroid Build Coastguard Worker 80*6777b538SAndroid Build Coastguard Worker } // namespace net 81*6777b538SAndroid Build Coastguard Worker 82*6777b538SAndroid Build Coastguard Worker #endif // NET_HTTP_PROXY_CLIENT_SOCKET_H_ 83