xref: /aosp_15_r20/external/cronet/net/base/proxy_delegate.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2014 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_BASE_PROXY_DELEGATE_H_
6*6777b538SAndroid Build Coastguard Worker #define NET_BASE_PROXY_DELEGATE_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <string>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include "net/base/net_errors.h"
11*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h"
12*6777b538SAndroid Build Coastguard Worker #include "net/base/network_anonymization_key.h"
13*6777b538SAndroid Build Coastguard Worker #include "net/base/proxy_chain.h"
14*6777b538SAndroid Build Coastguard Worker #include "net/proxy_resolution/proxy_retry_info.h"
15*6777b538SAndroid Build Coastguard Worker 
16*6777b538SAndroid Build Coastguard Worker class GURL;
17*6777b538SAndroid Build Coastguard Worker 
18*6777b538SAndroid Build Coastguard Worker namespace net {
19*6777b538SAndroid Build Coastguard Worker 
20*6777b538SAndroid Build Coastguard Worker class HttpRequestHeaders;
21*6777b538SAndroid Build Coastguard Worker class HttpResponseHeaders;
22*6777b538SAndroid Build Coastguard Worker class ProxyInfo;
23*6777b538SAndroid Build Coastguard Worker class ProxyResolutionService;
24*6777b538SAndroid Build Coastguard Worker 
25*6777b538SAndroid Build Coastguard Worker // Delegate for setting up a connection.
26*6777b538SAndroid Build Coastguard Worker class NET_EXPORT ProxyDelegate {
27*6777b538SAndroid Build Coastguard Worker  public:
28*6777b538SAndroid Build Coastguard Worker   ProxyDelegate() = default;
29*6777b538SAndroid Build Coastguard Worker   ProxyDelegate(const ProxyDelegate&) = delete;
30*6777b538SAndroid Build Coastguard Worker   ProxyDelegate& operator=(const ProxyDelegate&) = delete;
31*6777b538SAndroid Build Coastguard Worker   virtual ~ProxyDelegate() = default;
32*6777b538SAndroid Build Coastguard Worker 
33*6777b538SAndroid Build Coastguard Worker   // Called as the proxy is being resolved for |url| for a |method| request.
34*6777b538SAndroid Build Coastguard Worker   // The caller may pass an empty string to get method agnostic resoulution.
35*6777b538SAndroid Build Coastguard Worker   // Allows the delegate to override the proxy resolution decision made by
36*6777b538SAndroid Build Coastguard Worker   // ProxyResolutionService. The delegate may override the decision by modifying
37*6777b538SAndroid Build Coastguard Worker   // the ProxyInfo |result|.
38*6777b538SAndroid Build Coastguard Worker   virtual void OnResolveProxy(
39*6777b538SAndroid Build Coastguard Worker       const GURL& url,
40*6777b538SAndroid Build Coastguard Worker       const NetworkAnonymizationKey& network_anonymization_key,
41*6777b538SAndroid Build Coastguard Worker       const std::string& method,
42*6777b538SAndroid Build Coastguard Worker       const ProxyRetryInfoMap& proxy_retry_info,
43*6777b538SAndroid Build Coastguard Worker       ProxyInfo* result) = 0;
44*6777b538SAndroid Build Coastguard Worker 
45*6777b538SAndroid Build Coastguard Worker   // Called when use of a proxy chain failed due to `net_error`, but another
46*6777b538SAndroid Build Coastguard Worker   // proxy chain in the list succeeded. The failed proxy is within `bad_chain`,
47*6777b538SAndroid Build Coastguard Worker   // but it is undefined at which proxy in that chain. `net_error` is the
48*6777b538SAndroid Build Coastguard Worker   // network error encountered, if any, and OK if the fallback was for a reason
49*6777b538SAndroid Build Coastguard Worker   // other than a network error (e.g. the proxy service was explicitly directed
50*6777b538SAndroid Build Coastguard Worker   // to skip a proxy).
51*6777b538SAndroid Build Coastguard Worker   //
52*6777b538SAndroid Build Coastguard Worker   // This method is called for each bad chain in the proxy list after a request
53*6777b538SAndroid Build Coastguard Worker   // has ultimately been successful. If the request fails for all proxies in the
54*6777b538SAndroid Build Coastguard Worker   // list, this method will not be called.
55*6777b538SAndroid Build Coastguard Worker   virtual void OnFallback(const ProxyChain& bad_chain, int net_error) = 0;
56*6777b538SAndroid Build Coastguard Worker 
57*6777b538SAndroid Build Coastguard Worker   // Called when a request is successful after failing with one or more proxy
58*6777b538SAndroid Build Coastguard Worker   // chains in the list. This is called before OnFallback is called for each new
59*6777b538SAndroid Build Coastguard Worker   // failing proxy chain.
60*6777b538SAndroid Build Coastguard Worker   virtual void OnSuccessfulRequestAfterFailures(
61*6777b538SAndroid Build Coastguard Worker       const ProxyRetryInfoMap& proxy_retry_info) = 0;
62*6777b538SAndroid Build Coastguard Worker 
63*6777b538SAndroid Build Coastguard Worker   // Called immediately before a proxy tunnel request is sent. Provides the
64*6777b538SAndroid Build Coastguard Worker   // embedder an opportunity to add extra request headers.
65*6777b538SAndroid Build Coastguard Worker   virtual void OnBeforeTunnelRequest(const ProxyChain& proxy_chain,
66*6777b538SAndroid Build Coastguard Worker                                      size_t chain_index,
67*6777b538SAndroid Build Coastguard Worker                                      HttpRequestHeaders* extra_headers) = 0;
68*6777b538SAndroid Build Coastguard Worker 
69*6777b538SAndroid Build Coastguard Worker   // Called when the response headers for the proxy tunnel request have been
70*6777b538SAndroid Build Coastguard Worker   // received. Allows the delegate to override the net error code of the tunnel
71*6777b538SAndroid Build Coastguard Worker   // request. Returning OK causes the standard tunnel response handling to be
72*6777b538SAndroid Build Coastguard Worker   // performed. Implementations should make sure they can trust the proxy server
73*6777b538SAndroid Build Coastguard Worker   // at position `chain_index` in `proxy_chain` before making decisions based on
74*6777b538SAndroid Build Coastguard Worker   // `response_headers`.
75*6777b538SAndroid Build Coastguard Worker   virtual Error OnTunnelHeadersReceived(
76*6777b538SAndroid Build Coastguard Worker       const ProxyChain& proxy_chain,
77*6777b538SAndroid Build Coastguard Worker       size_t chain_index,
78*6777b538SAndroid Build Coastguard Worker       const HttpResponseHeaders& response_headers) = 0;
79*6777b538SAndroid Build Coastguard Worker 
80*6777b538SAndroid Build Coastguard Worker   // Associates a `ProxyResolutionService` with this `ProxyDelegate`.
81*6777b538SAndroid Build Coastguard Worker   // `proxy_resolution_service` must outlive `this`.
82*6777b538SAndroid Build Coastguard Worker   virtual void SetProxyResolutionService(
83*6777b538SAndroid Build Coastguard Worker       ProxyResolutionService* proxy_resolution_service) = 0;
84*6777b538SAndroid Build Coastguard Worker };
85*6777b538SAndroid Build Coastguard Worker 
86*6777b538SAndroid Build Coastguard Worker }  // namespace net
87*6777b538SAndroid Build Coastguard Worker 
88*6777b538SAndroid Build Coastguard Worker #endif  // NET_BASE_PROXY_DELEGATE_H_
89