#ifndef NET_PROXY_RESOLUTION_CONFIGURED_PROXY_RESOLUTION_REQUEST_H_
#define NET_PROXY_RESOLUTION_CONFIGURED_PROXY_RESOLUTION_REQUEST_H_
#include <memory>
#include <string>
#include <variant>
#include "base/containers/queue.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "net/base/completion_once_callback.h"
#include "net/base/network_anonymization_key.h"
#include "net/base/request_priority.h"
#include "net/log/net_log_with_source.h"
#include "net/proxy_resolution/proxy_config.h"
#include "net/proxy_resolution/proxy_resolution_request.h"
#include "net/proxy_resolution/proxy_resolver.h"
#include "net/proxy_resolution/resolve_host_request.h"
#include "net/traffic_annotation/network_traffic_annotation.h"
#include "third_party/abseil-cpp/absl/container/flat_hash_map.h"
#include "url/gurl.h"
#include "url/scheme_host_port.h"
namespace net {
class ProxyInfo;
class ConfiguredProxyResolutionService;
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,
RequestPriority priority);
ConfiguredProxyResolutionRequest(const ConfiguredProxyResolutionRequest&) =
delete;
ConfiguredProxyResolutionRequest& operator=(
const ConfiguredProxyResolutionRequest&) = delete;
~ConfiguredProxyResolutionRequest() override;
int Start();
bool is_started() const {
return !!resolve_job_.get() || !applicable_override_rules_.empty();
}
void StartAndCompleteCheckingForSynchronous();
void Cancel();
bool was_completed() const { return user_callback_.is_null(); }
void QueryComplete(int result_code);
int QueryDidComplete(int result_code);
int QueryDidCompleteSynchronously(int result_code);
void OnDnsHostResolved(const url::SchemeHostPort& host,
const ResolveHostResult& result);
NetLogWithSource* net_log() { return &net_log_; }
LoadState GetLoadState() const override;
private:
int ContinueProxyResolution();
int EvaluateApplicableOverrideRules();
void Reset();
raw_ptr<ConfiguredProxyResolutionService> service_;
CompletionOnceCallback user_callback_;
raw_ptr<ProxyInfo> results_;
const GURL url_;
const std::string method_;
const NetworkAnonymizationKey network_anonymization_key_;
std::unique_ptr<ProxyResolver::Request> resolve_job_;
MutableNetworkTrafficAnnotationTag traffic_annotation_;
NetLogWithSource net_log_;
const RequestPriority priority_;
base::TimeTicks creation_time_;
base::queue<ProxyConfig::ProxyOverrideRule> applicable_override_rules_;
absl::flat_hash_map<url::SchemeHostPort, ResolveHostResult> dns_results_;
base::WeakPtrFactory<ConfiguredProxyResolutionRequest> weak_factory_{this};
};
}
#endif