// 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_REQUEST_H_ #define NET_PROXY_RESOLUTION_WIN_WINDOWS_SYSTEM_PROXY_RESOLUTION_REQUEST_H_ #include #include #include "base/memory/raw_ptr.h" #include "base/sequence_checker.h" #include "base/time/time.h" #include "net/base/completion_once_callback.h" #include "net/base/net_export.h" #include "net/log/net_log_with_source.h" #include "net/proxy_resolution/proxy_resolution_request.h" #include "net/proxy_resolution/win/windows_system_proxy_resolver.h" #include "net/proxy_resolution/win/winhttp_status.h" #include "url/gurl.h" namespace net { class ProxyInfo; class ProxyList; class WindowsSystemProxyResolutionService; // This is the concrete implementation of ProxyResolutionRequest used by // WindowsSystemProxyResolutionService. Manages a single asynchronous proxy // resolution request. class NET_EXPORT WindowsSystemProxyResolutionRequest : public ProxyResolutionRequest { public: // The |windows_system_proxy_resolver| is not saved by this object. Rather, it // is simply used to kick off proxy resolution in a utility process from // within the constructor. The |windows_system_proxy_resolver| is not needed // after construction. Every other parameter is saved by this object. Details // for each one of these saved parameters can be found below. WindowsSystemProxyResolutionRequest( WindowsSystemProxyResolutionService* service, const GURL& url, const std::string& method, ProxyInfo* results, const CompletionOnceCallback user_callback, const NetLogWithSource& net_log, WindowsSystemProxyResolver* windows_system_proxy_resolver); WindowsSystemProxyResolutionRequest( const WindowsSystemProxyResolutionRequest&) = delete; WindowsSystemProxyResolutionRequest& operator=( const WindowsSystemProxyResolutionRequest&) = delete; ~WindowsSystemProxyResolutionRequest() override; // ProxyResolutionRequest LoadState GetLoadState() const override; // Callback for when the cross-process proxy resolution has completed. The // |proxy_list| is the list of proxies returned by WinHttp translated into // Chromium-friendly terms. The |winhttp_status| describes the status of the // proxy resolution request. If WinHttp fails for some reason, |windows_error| // contains the specific error returned by WinHttp. virtual void ProxyResolutionComplete(const ProxyList& proxy_list, WinHttpStatus winhttp_status, int windows_error); WindowsSystemProxyResolver::Request* GetProxyResolutionRequestForTesting(); void ResetProxyResolutionRequestForTesting(); private: // Cancels the callback from the resolver for a previously started proxy // resolution. void CancelResolveRequest(); // Returns true if the request has been completed. bool was_completed() const { return user_callback_.is_null(); } // Note that Request holds a bare pointer to the // WindowsSystemProxyResolutionService. Outstanding requests are cancelled // during ~WindowsSystemProxyResolutionService, so this is guaranteed to be // valid throughout the lifetime of this object. raw_ptr service_; CompletionOnceCallback user_callback_; raw_ptr results_; const GURL url_; const std::string method_; NetLogWithSource net_log_; // Time when the request was created. Stored here rather than in |results_| // because the time in |results_| will be cleared. base::TimeTicks creation_time_; // Manages the cross-process proxy resolution. Deleting this will cancel a // pending proxy resolution. After a callback has been received via // ProxyResolutionComplete(), this object will no longer do anything. std::unique_ptr proxy_resolution_request_; SEQUENCE_CHECKER(sequence_checker_); }; } // namespace net #endif // NET_PROXY_RESOLUTION_WIN_WINDOWS_SYSTEM_PROXY_RESOLUTION_REQUEST_H_