blob: ef26d24092aa184f26812892c3714f696fc33ae9 [file] [log] [blame]
// 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<CryptoClientConfigHandle> 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<raw_ptr<QuicSessionRequest, SetExperimental>>& 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<QuicSessionPool> pool_;
const QuicSessionAliasKey key_;
const std::unique_ptr<CryptoClientConfigHandle> client_config_handle_;
RequestPriority priority_;
const NetLogWithSource net_log_;
std::set<raw_ptr<QuicSessionRequest, SetExperimental>> requests_;
};
} // namespace net
#endif // NET_QUIC_QUIC_SESSION_POOL_JOB_H_