|  | // 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_ |