blob: 5745177250bbefcce0bca4d57485be182994274b [file]
// Copyright 2026 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_SYSTEM_PROXY_RESOLUTION_REQUEST_H_
#define NET_PROXY_RESOLUTION_SYSTEM_PROXY_RESOLUTION_REQUEST_H_
#include <string>
#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/base/network_anonymization_key.h"
#include "net/log/net_log_with_source.h"
#include "net/proxy_resolution/proxy_resolution_request.h"
#include "url/gurl.h"
namespace net {
class ProxyInfo;
class SystemProxyResolutionService;
// Intermediate base class for system proxy resolution requests. Holds the
// common request state (URL, method, NAK, callback, results, net log, timing)
// shared across platform-specific implementations (Windows WinHTTP, future
// macOS CFNetwork).
//
// Platform subclasses own the platform-specific resolver handle and implement
// the resolution callback. The destructor handles removing the request from
// the service's pending set and logging cancellation events.
class NET_EXPORT SystemProxyResolutionRequest : public ProxyResolutionRequest {
public:
SystemProxyResolutionRequest(const SystemProxyResolutionRequest&) = delete;
SystemProxyResolutionRequest& operator=(const SystemProxyResolutionRequest&) =
delete;
~SystemProxyResolutionRequest() override;
// ProxyResolutionRequest:
LoadState GetLoadState() const override;
protected:
SystemProxyResolutionRequest(
SystemProxyResolutionService* service,
GURL url,
std::string method,
NetworkAnonymizationKey network_anonymization_key,
ProxyInfo* results,
CompletionOnceCallback user_callback,
const NetLogWithSource& net_log);
// Returns true if the request has been completed (callback already invoked).
bool was_completed() const { return user_callback_.is_null(); }
// Marks this request as completed: removes it from the service's pending
// request set and clears the service back-pointer. Called by platform
// subclasses when proxy resolution completes successfully (before invoking
// the user callback). The base destructor handles removal separately for
// the cancellation path.
void MarkCompleted();
// Protected for derived class access. Platform subclasses need direct field
// access to these members in their completion callbacks (e.g.,
// ProxyResolutionComplete) where they read url_, method_, results_, etc.
// and invoke user_callback_.
// Back-pointer to the owning service. Outstanding requests are cancelled
// during the service subclass destructor, so this is guaranteed to be valid
// throughout the lifetime of this object while the request is still pending.
// Set to nullptr by the derived class after completion.
raw_ptr<SystemProxyResolutionService> service_;
CompletionOnceCallback user_callback_;
raw_ptr<ProxyInfo> results_;
const GURL url_;
const std::string method_;
const NetworkAnonymizationKey network_anonymization_key_;
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_;
SEQUENCE_CHECKER(sequence_checker_);
};
} // namespace net
#endif // NET_PROXY_RESOLUTION_SYSTEM_PROXY_RESOLUTION_REQUEST_H_