// Copyright 2018 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef NET_HTTP_PROXY_FALLBACK_H_ #define NET_HTTP_PROXY_FALLBACK_H_ // ------------------------------------------------------------ // Proxy Fallback Overview // ------------------------------------------------------------ // // Proxy fallback is a feature that is split between the proxy resolution layer // and the HTTP layers. // // The proxy resolution layer is responsible for: // * Obtaining a list of proxies to use // (ProxyResolutionService::ResolveProxy). Proxy lists are (usually) the // result of having evaluated a PAC script, such as: // return "PROXY foobar1:8080; HTTPS foobar2:8080; DIRECT"; // // * Re-ordering the proxy list such that proxy chains that have recently // failed are given lower priority (ProxyInfo::DeprioritizeBadProxyChains) // // * Maintaining the expiring cache of proxy chains that have recently failed. // // // The HTTP layer is responsible for: // * Attempting to issue the URLRequest through each of the // proxy chains, in the order specified by the list. // // * Deciding whether this attempt was successful, whether it was a failure // but should keep trying other proxy chains, or whether it was a failure // and should stop trying other proxy chains. // // * Upon successful completion of an attempt though a proxy chain, calling // ProxyResolutionService::ReportSuccess to inform it of all the failed // attempts that were made. (A proxy chain is only considered to be "bad" // if the request was able to be completed through some other proxy chain). // // // Exactly how to interpret the proxy lists returned by PAC is not specified by // a standard. The justifications for what errors are considered for fallback // are given beside the implementation. #include "net/base/net_export.h" namespace net { class ProxyChain; // Returns true if a failed request issued through a proxy chain should be // re-tried using the next proxy chain in the fallback list. // // The proxy fallback logic is a compromise between compatibility and // increasing odds of success, and may choose not to retry a request on the // next proxy option, even though that could work. // // - `proxy_chain` is the proxy chain that failed the request. // - `error` is the error for the request when it was sent through // `proxy_chain`. // - `final_error` is an out parameter that is set with the "final" error to // report to the caller. The error is only re-written in cases where // CanFalloverToNextProxy() returns false. // - `is_for_ip_protection` is true if this request is to an IP Protection // proxy. NET_EXPORT bool CanFalloverToNextProxy(const ProxyChain& proxy_chain, int error, int* final_error, bool is_for_ip_protection = false); } // namespace net #endif // NET_HTTP_PROXY_FALLBACK_H_