blob: 77e1cd51de7b4857d82e67a733e6ecca43c892f8 [file] [log] [blame]
// Copyright 2025 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_ATTEMPT_REQUEST_H_
#define NET_QUIC_QUIC_SESSION_ATTEMPT_REQUEST_H_
#include <optional>
#include <set>
#include <string>
#include "base/check.h"
#include "base/memory/raw_ptr.h"
#include "net/base/completion_once_callback.h"
#include "net/base/net_error_details.h"
#include "net/base/net_export.h"
#include "net/quic/quic_session_alias_key.h"
#include "net/quic/quic_session_pool.h"
namespace net {
class QuicSessionAttemptManager;
// Represents a request to attempt creation of a new QUIC session. This class
// is owned by the creator of the request. If the request is still pending when
// the request is destroyed, it will be cancelled.
class NET_EXPORT_PRIVATE QuicSessionAttemptRequest {
public:
QuicSessionAttemptRequest(const QuicSessionAttemptRequest&) = delete;
QuicSessionAttemptRequest& operator=(const QuicSessionAttemptRequest&) =
delete;
~QuicSessionAttemptRequest();
// Requests a QUIC session. If the request is completed synchronously, returns
// the result. If the request is completed asynchronously, returns
// ERR_IO_PENDING and `callback` will be invoked later. See also
// `QuicSessionAttempt`.
int RequestSession(
QuicEndpoint endpoint,
int cert_verify_flags,
base::TimeTicks dns_resolution_start_time,
base::TimeTicks dns_resolution_end_time,
bool use_dns_aliases,
std::set<std::string> dns_aliases,
MultiplexedSessionCreationInitiator session_creation_initiator,
std::optional<ConnectionManagementConfig> connection_management_config,
const NetLogWithSource& net_log,
CompletionOnceCallback callback);
const QuicSessionAliasKey& key() const { return key_; }
// Returns the error details of the request. Populated only if the request is
// failed. Only valid to call after the request is completed.
const NetErrorDetails& error_details() const {
CHECK(completed_);
return error_details_;
}
// Returns the session of the request. Can be nullptr if the request is
// failed. Only valid to call after the request is completed.
raw_ptr<QuicChromiumClientSession> session() const {
CHECK(completed_);
return session_;
}
private:
friend class QuicSessionAttemptManager;
explicit QuicSessionAttemptRequest(QuicSessionAttemptManager* manager,
QuicSessionAliasKey key);
void Complete(int rv,
QuicChromiumClientSession* session,
NetErrorDetails error_details);
raw_ptr<QuicSessionAttemptManager> manager_;
const QuicSessionAliasKey key_;
bool completed_ = false;
CompletionOnceCallback callback_;
NetErrorDetails error_details_;
raw_ptr<QuicChromiumClientSession> session_;
};
} // namespace net
#endif // NET_QUIC_QUIC_SESSION_ATTEMPT_REQUEST_H_