| // Copyright 2019 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_MASQUE_MASQUE_SERVER_SESSION_H_ | |
| #define QUICHE_QUIC_MASQUE_MASQUE_SERVER_SESSION_H_ | |
| #include "quic/core/quic_types.h" | |
| #include "quic/core/quic_udp_socket.h" | |
| #include "quic/masque/masque_compression_engine.h" | |
| #include "quic/masque/masque_server_backend.h" | |
| #include "quic/masque/masque_utils.h" | |
| #include "quic/platform/api/quic_epoll.h" | |
| #include "quic/platform/api/quic_export.h" | |
| #include "quic/tools/quic_simple_server_session.h" | |
| namespace quic { | |
| // QUIC server session for connection to MASQUE proxy. | |
| class QUIC_NO_EXPORT MasqueServerSession | |
| : public QuicSimpleServerSession, | |
| public MasqueServerBackend::BackendClient, | |
| public QuicEpollCallbackInterface { | |
| public: | |
| // Interface meant to be implemented by owner of this MasqueServerSession | |
| // instance. | |
| class QUIC_NO_EXPORT Visitor { | |
| public: | |
| virtual ~Visitor() {} | |
| // Register a client connection ID as being handled by this session. | |
| virtual void RegisterClientConnectionId( | |
| QuicConnectionId client_connection_id, | |
| MasqueServerSession* masque_server_session) = 0; | |
| // Unregister a client connection ID. | |
| virtual void UnregisterClientConnectionId( | |
| QuicConnectionId client_connection_id) = 0; | |
| }; | |
| explicit MasqueServerSession( | |
| MasqueMode masque_mode, const QuicConfig& config, | |
| const ParsedQuicVersionVector& supported_versions, | |
| QuicConnection* connection, QuicSession::Visitor* visitor, Visitor* owner, | |
| QuicEpollServer* epoll_server, QuicCryptoServerStreamBase::Helper* helper, | |
| const QuicCryptoServerConfig* crypto_config, | |
| QuicCompressedCertsCache* compressed_certs_cache, | |
| MasqueServerBackend* masque_server_backend); | |
| // Disallow copy and assign. | |
| MasqueServerSession(const MasqueServerSession&) = delete; | |
| MasqueServerSession& operator=(const MasqueServerSession&) = delete; | |
| // From QuicSession. | |
| void OnMessageReceived(absl::string_view message) override; | |
| void OnMessageAcked(QuicMessageId message_id, | |
| QuicTime receive_timestamp) override; | |
| void OnMessageLost(QuicMessageId message_id) override; | |
| void OnConnectionClosed(const QuicConnectionCloseFrame& frame, | |
| ConnectionCloseSource source) override; | |
| void OnStreamClosed(QuicStreamId stream_id) override; | |
| // From MasqueServerBackend::BackendClient. | |
| std::unique_ptr<QuicBackendResponse> HandleMasqueRequest( | |
| const std::string& masque_path, | |
| const spdy::Http2HeaderBlock& request_headers, | |
| const std::string& request_body, | |
| QuicSimpleServerBackend::RequestHandler* request_handler) override; | |
| // From QuicEpollCallbackInterface. | |
| void OnRegistration(QuicEpollServer* eps, QuicUdpSocketFd fd, | |
| int event_mask) override; | |
| void OnModification(QuicUdpSocketFd fd, int event_mask) override; | |
| void OnEvent(QuicUdpSocketFd fd, QuicEpollEvent* event) override; | |
| void OnUnregistration(QuicUdpSocketFd fd, bool replaced) override; | |
| void OnShutdown(QuicEpollServer* eps, QuicUdpSocketFd fd) override; | |
| std::string Name() const override; | |
| // Handle packet for client, meant to be called by MasqueDispatcher. | |
| void HandlePacketFromServer(const ReceivedPacketInfo& packet_info); | |
| QuicEpollServer* epoll_server() const { return epoll_server_; } | |
| private: | |
| // State that the MasqueServerSession keeps for each CONNECT-UDP request. | |
| class QUIC_NO_EXPORT ConnectUdpServerState | |
| : public QuicSpdyStream::Http3DatagramRegistrationVisitor, | |
| public QuicSpdyStream::Http3DatagramVisitor { | |
| public: | |
| // ConnectUdpServerState takes ownership of |fd|. It will unregister it | |
| // from |epoll_server| and close the file descriptor when destructed. | |
| explicit ConnectUdpServerState( | |
| QuicSpdyStream* stream, | |
| absl::optional<QuicDatagramContextId> context_id, | |
| const QuicSocketAddress& target_server_address, QuicUdpSocketFd fd, | |
| MasqueServerSession* masque_session); | |
| ~ConnectUdpServerState(); | |
| // Disallow copy but allow move. | |
| ConnectUdpServerState(const ConnectUdpServerState&) = delete; | |
| ConnectUdpServerState(ConnectUdpServerState&&); | |
| ConnectUdpServerState& operator=(const ConnectUdpServerState&) = delete; | |
| ConnectUdpServerState& operator=(ConnectUdpServerState&&); | |
| QuicSpdyStream* stream() const { return stream_; } | |
| absl::optional<QuicDatagramContextId> context_id() const { | |
| return context_id_; | |
| } | |
| const QuicSocketAddress& target_server_address() const { | |
| return target_server_address_; | |
| } | |
| QuicUdpSocketFd fd() const { return fd_; } | |
| // From QuicSpdyStream::Http3DatagramVisitor. | |
| void OnHttp3Datagram(QuicStreamId stream_id, | |
| absl::optional<QuicDatagramContextId> context_id, | |
| absl::string_view payload) override; | |
| // From QuicSpdyStream::Http3DatagramRegistrationVisitor. | |
| void OnContextReceived(QuicStreamId stream_id, | |
| absl::optional<QuicDatagramContextId> context_id, | |
| DatagramFormatType format_type, | |
| absl::string_view format_additional_data) override; | |
| void OnContextClosed(QuicStreamId stream_id, | |
| absl::optional<QuicDatagramContextId> context_id, | |
| ContextCloseCode close_code, | |
| absl::string_view close_details) override; | |
| private: | |
| QuicSpdyStream* stream_; | |
| absl::optional<QuicDatagramContextId> context_id_; | |
| QuicSocketAddress target_server_address_; | |
| QuicUdpSocketFd fd_; // Owned. | |
| MasqueServerSession* masque_session_; // Unowned. | |
| bool context_received_ = false; | |
| bool context_registered_ = false; | |
| }; | |
| // From QuicSpdySession. | |
| bool OnSettingsFrame(const SettingsFrame& frame) override; | |
| HttpDatagramSupport LocalHttpDatagramSupport() override { | |
| return HttpDatagramSupport::kDraft00And04; | |
| } | |
| MasqueServerBackend* masque_server_backend_; // Unowned. | |
| Visitor* owner_; // Unowned. | |
| QuicEpollServer* epoll_server_; // Unowned. | |
| MasqueCompressionEngine compression_engine_; | |
| MasqueMode masque_mode_; | |
| std::list<ConnectUdpServerState> connect_udp_server_states_; | |
| bool masque_initialized_ = false; | |
| }; | |
| } // namespace quic | |
| #endif // QUICHE_QUIC_MASQUE_MASQUE_SERVER_SESSION_H_ |