| // Copyright 2026 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef QUICHE_QUIC_TOOLS_WEB_TRANSPORT_ONLY_CLIENT_H_ | |
| #define QUICHE_QUIC_TOOLS_WEB_TRANSPORT_ONLY_CLIENT_H_ | |
| #include <memory> | |
| #include <string> | |
| #include "absl/base/nullability.h" | |
| #include "absl/status/status.h" | |
| #include "absl/status/statusor.h" | |
| #include "absl/strings/string_view.h" | |
| #include "absl/types/span.h" | |
| #include "quiche/quic/core/crypto/proof_verifier.h" | |
| #include "quiche/quic/core/crypto/quic_crypto_client_config.h" | |
| #include "quiche/quic/core/http/quic_spdy_client_session.h" | |
| #include "quiche/quic/core/http/quic_spdy_client_stream.h" | |
| #include "quiche/quic/core/http/quic_spdy_session.h" | |
| #include "quiche/quic/core/io/quic_event_loop.h" | |
| #include "quiche/quic/core/quic_config.h" | |
| #include "quiche/quic/core/quic_connection.h" | |
| #include "quiche/quic/core/quic_path_validator.h" | |
| #include "quiche/quic/core/quic_server_id.h" | |
| #include "quiche/quic/core/quic_session.h" | |
| #include "quiche/quic/core/quic_versions.h" | |
| #include "quiche/quic/platform/api/quic_socket_address.h" | |
| #include "quiche/quic/tools/quic_client_base.h" | |
| #include "quiche/quic/tools/quic_client_default_network_helper.h" | |
| #include "quiche/common/http/http_header_block.h" | |
| #include "quiche/common/quiche_callbacks.h" | |
| #include "quiche/web_transport/web_transport.h" | |
| namespace quic { | |
| // WebTransportOnlyClient is a dedicated client for applications that | |
| // are written against the webtransport::Session API. It serves as the client | |
| // counterpart to WebTransportOnlyDispatcher. | |
| class WebTransportOnlyClient : public QuicClientBase { | |
| public: | |
| using VisitorFactory = | |
| quiche::UnretainedCallback<std::unique_ptr<webtransport::SessionVisitor>( | |
| webtransport::Session*)>; | |
| WebTransportOnlyClient( | |
| QuicSocketAddress server_address, const QuicServerId& server_id, | |
| const ParsedQuicVersionVector& supported_versions, | |
| const QuicConfig& config, QuicEventLoop* event_loop, | |
| std::unique_ptr<QuicClientDefaultNetworkHelper> absl_nullable | |
| network_helper, | |
| std::unique_ptr<ProofVerifier> absl_nonnull proof_verifier, | |
| std::unique_ptr<SessionCache> absl_nullable session_cache); | |
| WebTransportOnlyClient(const WebTransportOnlyClient&) = delete; | |
| WebTransportOnlyClient& operator=(const WebTransportOnlyClient&) = delete; | |
| ~WebTransportOnlyClient() override; | |
| // Synchronously establishes a WebTransport session to the server at `path`, | |
| // configuring the session visitor by calling `visitor_factory` if the | |
| // connection succeeds. | |
| // | |
| // Note that the function returns when the client creates the CONNECT stream, | |
| // and not when the HTTP response for it is received. Doing so allows the | |
| // client to open streams before receiving the HTTP response. To wait until | |
| // the actual response is received, use OnSessionReady in the session visitor. | |
| absl::Status ConnectSync(std::string path, VisitorFactory visitor_factory, | |
| absl::Span<const std::string> subprotocols = {}, | |
| const quiche::HttpHeaderBlock& extra_headers = {}); | |
| QuicClientDefaultNetworkHelper* default_network_helper(); | |
| protected: | |
| // QuicClientBase implementation. | |
| void InitializeSession() override; | |
| bool EarlyDataAccepted() override; | |
| bool ReceivedInchoateReject() override; | |
| int GetNumSentClientHellosFromSession() override; | |
| int GetNumReceivedServerConfigUpdatesFromSession() override; | |
| bool HasActiveRequests() override; | |
| std::unique_ptr<QuicSession> CreateQuicClientSession( | |
| const ParsedQuicVersionVector& supported_versions, | |
| QuicConnection* connection) override; | |
| private: | |
| class Session : public QuicSpdyClientSession { | |
| public: | |
| Session(const QuicConfig& config, | |
| const ParsedQuicVersionVector& supported_versions, | |
| QuicConnection* connection, | |
| QuicClientBase::NetworkHelper* network_helper, | |
| const QuicServerId& server_id, | |
| QuicCryptoClientConfig* crypto_config); | |
| ~Session() override = default; | |
| WebTransportHttp3VersionSet LocallySupportedWebTransportVersions() | |
| const override; | |
| HttpDatagramSupport LocalHttpDatagramSupport() override; | |
| void CreateContextForMultiPortPath( | |
| std::unique_ptr<MultiPortPathContextObserver> context_observer) | |
| override; | |
| void MigrateToMultiPortPath( | |
| std::unique_ptr<QuicPathValidationContext> context) override; | |
| private: | |
| QuicClientBase::NetworkHelper* network_helper_; | |
| }; | |
| Session* client_session(); | |
| }; | |
| } // namespace quic | |
| #endif // QUICHE_QUIC_TOOLS_WEB_TRANSPORT_ONLY_CLIENT_H_ |