quic/client/connector/QuicConnector.h (60 lines of code) (raw):

/* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #include <fizz/client/AsyncFizzClient.h> #include <folly/io/SocketOptionMap.h> #include <quic/api/LoopDetectorCallback.h> #include <quic/api/QuicSocket.h> #include <quic/client/QuicClientTransport.h> #include <quic/common/TimeUtil.h> #include <quic/fizz/client/handshake/QuicPskCache.h> #include <quic/logging/QLogger.h> namespace quic { /** * A QUIC connector class that connects to an address, reports success/error and * drops the connection. */ class QuicConnector : private quic::QuicSocket::ConnectionSetupCallback, private folly::HHWheelTimer::Callback { public: /** * Callback to report success/error and first packet processed. */ class Callback { public: virtual ~Callback() = default; virtual void onConnectError(QuicError errorCode) = 0; virtual void onConnectSuccess() = 0; }; QuicConnector(Callback* cb); void connect( folly::EventBase* eventBase, folly::Optional<folly::SocketAddress> localAddr, const folly::SocketAddress& connectAddr, std::shared_ptr<const fizz::client::FizzClientContext> fizzContext, std::shared_ptr<const fizz::CertificateVerifier> verifier, std::shared_ptr<quic::QuicPskCache> quicPskCache, quic::TransportSettings transportSettings, const std::vector<QuicVersion>& supportedQuicVersions, std::chrono::milliseconds connectTimeout = std::chrono::milliseconds(1000), const folly::SocketOptionMap& socketOptions = folly::emptySocketOptionMap, const folly::Optional<std::string>& sni = folly::none, std::shared_ptr<quic::QLogger> qLogger = nullptr, std::shared_ptr<quic::LoopDetectorCallback> quicLoopDetectorCallback = nullptr, std::shared_ptr<quic::QuicTransportStatsCallback> quicTransportStatsCallback = nullptr); [[nodiscard]] bool isBusy() const { return quicClient_ != nullptr; } void reset(); std::chrono::milliseconds timeElapsed(); // For testing. void connect( std::shared_ptr<quic::QuicClientTransport> quicClient, std::chrono::milliseconds connectTimeout); private: void doConnect(std::chrono::milliseconds connectTimeout); void cleanUp(); void cleanUpAndCloseSocket(); void timeoutExpired() noexcept override; // QuicSocket::ConnectionSetupCallback overrides. void onFirstPeerPacketProcessed() noexcept override {} void onConnectionSetupError(QuicError code) noexcept override; void onTransportReady() noexcept override {} void onReplaySafe() noexcept override; Callback* cb_; TimePoint connectStart_; std::shared_ptr<quic::QuicClientTransport> quicClient_{nullptr}; }; } // namespace quic