// Copyright 2024 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_QUIC_QUIC_SESSION_POOL_JOB_H_ #define NET_QUIC_QUIC_SESSION_POOL_JOB_H_ #include "base/memory/raw_ptr.h" #include "net/base/net_error_details.h" #include "net/base/request_priority.h" #include "net/log/net_log_with_source.h" #include "net/quic/quic_session_pool.h" namespace net { // Responsible for creating a new QUIC session to the specified server, and for // notifying any associated requests when complete. // // A single Job can be associated with any number of `QuicSessionRequest` // instances, and will update all of them with its progress, calling some or // all of their `OnHostResolution()` or `OnQuicSessionCreationComplete()` // methods, as indicated by calls to `ExpectOnHostResolution()` and // `ExpectQuicSessionCreation()`, respectively. // // When the session is confirmed, the job will call the pool's // `ActivateSession` method before invoking the callback from `Run`. // // The |client_config_handle| is not actually used, but serves to keep the // corresponding CryptoClientConfig alive until the Job completes. class QuicSessionPool::Job { public: Job(QuicSessionPool* pool, const QuicSessionAliasKey& key, std::unique_ptr client_config_handle, RequestPriority priority, const NetLogWithSource& net_log); Job(const Job&) = delete; Job& operator=(const Job&) = delete; virtual ~Job(); // Run the job. This should be called as soon as the job is created, then any // associated requests added with `AddRequest()`. virtual int Run(CompletionOnceCallback callback) = 0; // Add a new request associated with this Job. void AddRequest(QuicSessionRequest* request); // Remove a request associated with this job. The request must already be // associated with the job. void RemoveRequest(QuicSessionRequest* request); // Update the priority of this Job. void SetPriority(RequestPriority priority); // Add information about the new session to `details`. Must be called after // the run has completed. virtual void PopulateNetErrorDetails(NetErrorDetails* details) const = 0; const QuicSessionAliasKey& key() const { return key_; } const NetLogWithSource& net_log() const { return net_log_; } const std::set>& requests() { return requests_; } RequestPriority priority() const { return priority_; } QuicSessionPool* pool() const { return pool_.get(); } // Associate this job with another source. void AssociateWithNetLogSource( const NetLogWithSource& http_stream_job_net_log) const; protected: // Set a new `QuicSessionRequest`'s expectations about which callbacks // will be invoked. This is called in `AddRequest`. virtual void SetRequestExpectations(QuicSessionRequest* request) = 0; // Update the priority of any ongoing work in this job. virtual void UpdatePriority(RequestPriority old_priority, RequestPriority new_priority); const raw_ptr pool_; const QuicSessionAliasKey key_; const std::unique_ptr client_config_handle_; RequestPriority priority_; const NetLogWithSource net_log_; std::set> requests_; }; } // namespace net #endif // NET_QUIC_QUIC_SESSION_POOL_JOB_H_