// Copyright 2020 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_PROXY_RESOLUTION_WIN_WINDOWS_SYSTEM_PROXY_RESOLUTION_SERVICE_H_ #define NET_PROXY_RESOLUTION_WIN_WINDOWS_SYSTEM_PROXY_RESOLUTION_SERVICE_H_ #include "base/memory/raw_ptr.h" #include "net/proxy_resolution/proxy_resolution_service.h" #include #include #include #include "base/sequence_checker.h" #include "net/base/net_export.h" #include "net/proxy_resolution/win/winhttp_status.h" namespace net { class NetLog; class WindowsSystemProxyResolutionRequest; class WindowsSystemProxyResolver; // This class decides which proxy server(s) to use for a particular URL request. // It does NOT support passing in fetched proxy configurations. Instead, it // relies entirely on WinHttp APIs to determine the proxy that should be used // for each network request. class NET_EXPORT WindowsSystemProxyResolutionService : public ProxyResolutionService { public: [[nodiscard]] static bool IsSupported(); // Creates a WindowsSystemProxyResolutionService or returns nullptr if the // runtime dependencies are not satisfied. static std::unique_ptr Create( std::unique_ptr windows_system_proxy_resolver, NetLog* net_log); WindowsSystemProxyResolutionService( const WindowsSystemProxyResolutionService&) = delete; WindowsSystemProxyResolutionService& operator=( const WindowsSystemProxyResolutionService&) = delete; ~WindowsSystemProxyResolutionService() override; // ProxyResolutionService implementation int ResolveProxy(const GURL& url, const std::string& method, const NetworkAnonymizationKey& network_anonymization_key, ProxyInfo* results, CompletionOnceCallback callback, std::unique_ptr* request, const NetLogWithSource& net_log) override; void ReportSuccess(const ProxyInfo& proxy_info) override; void SetProxyDelegate(ProxyDelegate* delegate) override; void OnShutdown() override; bool MarkProxiesAsBadUntil( const ProxyInfo& results, base::TimeDelta retry_delay, const std::vector& additional_bad_proxies, const NetLogWithSource& net_log) override; void ClearBadProxiesCache() override; const ProxyRetryInfoMap& proxy_retry_info() const override; base::Value::Dict GetProxyNetLogValues() override; [[nodiscard]] bool CastToConfiguredProxyResolutionService( ConfiguredProxyResolutionService** configured_proxy_resolution_service) override; private: friend class WindowsSystemProxyResolutionRequest; WindowsSystemProxyResolutionService( std::unique_ptr windows_system_proxy_resolver, NetLog* net_log); typedef std::set PendingRequests; [[nodiscard]] bool ContainsPendingRequest( WindowsSystemProxyResolutionRequest* req); void RemovePendingRequest(WindowsSystemProxyResolutionRequest* req); size_t PendingRequestSizeForTesting() const { return pending_requests_.size(); } // Called when proxy resolution has completed (either synchronously or // asynchronously). Handles logging the result, and cleaning out // bad entries from the results list. int DidFinishResolvingProxy(const GURL& url, const std::string& method, ProxyInfo* result, WinHttpStatus winhttp_status, const NetLogWithSource& net_log); // Map of the known bad proxies and the information about the retry time. ProxyRetryInfoMap proxy_retry_info_; // Set of pending/in-progress requests. PendingRequests pending_requests_; // This is used to launch cross-process proxy resolution requests. Individual // WindowsSystemProxyResolutionRequest will use this to initiate proxy // resolution. std::unique_ptr windows_system_proxy_resolver_; // This is the log for any generated events. raw_ptr net_log_; SEQUENCE_CHECKER(sequence_checker_); }; } // namespace net #endif // NET_PROXY_RESOLUTION_WIN_WINDOWS_SYSTEM_PROXY_RESOLUTION_SERVICE_H_