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