xref: /aosp_15_r20/external/cronet/net/http/proxy_client_socket.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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