// 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_CONFIGURED_PROXY_RESOLUTION_REQUEST_H_ #define NET_PROXY_RESOLUTION_CONFIGURED_PROXY_RESOLUTION_REQUEST_H_ #include #include #include "base/memory/raw_ptr.h" #include "base/time/time.h" #include "net/base/completion_once_callback.h" #include "net/base/network_anonymization_key.h" #include "net/log/net_log_with_source.h" #include "net/proxy_resolution/proxy_resolution_request.h" #include "net/proxy_resolution/proxy_resolver.h" #include "net/traffic_annotation/network_traffic_annotation.h" #include "url/gurl.h" namespace net { class ProxyInfo; class ConfiguredProxyResolutionService; // This is the concrete implementation of ProxyResolutionRequest used by // ConfiguredProxyResolutionService. Manages a single asynchronous proxy // resolution request. class ConfiguredProxyResolutionRequest final : public ProxyResolutionRequest { public: ConfiguredProxyResolutionRequest( ConfiguredProxyResolutionService* service, const GURL& url, const std::string& method, const NetworkAnonymizationKey& network_anonymization_key, ProxyInfo* results, const CompletionOnceCallback user_callback, const NetLogWithSource& net_log); ConfiguredProxyResolutionRequest(const ConfiguredProxyResolutionRequest&) = delete; ConfiguredProxyResolutionRequest& operator=( const ConfiguredProxyResolutionRequest&) = delete; ~ConfiguredProxyResolutionRequest() override; // Starts the resolve proxy request. int Start(); bool is_started() const { // Note that !! casts to bool. (VS gives a warning otherwise). return !!resolve_job_.get(); } void StartAndCompleteCheckingForSynchronous(); void CancelResolveJob(); // Returns true if the request has been completed. bool was_completed() const { return user_callback_.is_null(); } // Callback for when the ProxyResolver request has completed. void QueryComplete(int result_code); // Helper to call after ProxyResolver completion (both synchronous and // asynchronous). Fixes up the result that is to be returned to user. int QueryDidComplete(int result_code); // Helper to call if the request completes synchronously, since in that case // the request will not be added to |pending_requests_| (in // |ConfiguredProxyResolutionService|). int QueryDidCompleteSynchronously(int result_code); NetLogWithSource* net_log() { return &net_log_; } // Request implementation: LoadState GetLoadState() const override; private: // Note that Request holds a bare pointer to the // ConfiguredProxyResolutionService. Outstanding requests are cancelled during // ~ConfiguredProxyResolutionService, so this is guaranteed to be valid // throughout our lifetime. raw_ptr service_; CompletionOnceCallback user_callback_; raw_ptr results_; const GURL url_; const std::string method_; const NetworkAnonymizationKey network_anonymization_key_; std::unique_ptr resolve_job_; MutableNetworkTrafficAnnotationTag traffic_annotation_; 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_; }; } // namespace net #endif // NET_PROXY_RESOLUTION_CONFIGURED_PROXY_RESOLUTION_REQUEST_H_