// // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // // Official repository: https://github.com/vinniefalco/CppCon2018 // #ifndef BOOST_BEAST_EXAMPLE_WEBSOCKET_CHAT_MULTI_WEBSOCKET_SESSION_HPP #define BOOST_BEAST_EXAMPLE_WEBSOCKET_CHAT_MULTI_WEBSOCKET_SESSION_HPP #include "net.hpp" #include "beast.hpp" #include "shared_state.hpp" #include #include #include #include // Forward declaration class shared_state; /** Represents an active WebSocket connection to the server */ class websocket_session : public boost::enable_shared_from_this { beast::flat_buffer buffer_; websocket::stream ws_; boost::shared_ptr state_; std::vector> queue_; void fail(beast::error_code ec, char const* what); void on_accept(beast::error_code ec); void on_read(beast::error_code ec, std::size_t bytes_transferred); void on_write(beast::error_code ec, std::size_t bytes_transferred); public: websocket_session( tcp::socket&& socket, boost::shared_ptr const& state); ~websocket_session(); template void run(http::request> req); // Send a message void send(boost::shared_ptr const& ss); private: void on_send(boost::shared_ptr const& ss); }; template void websocket_session:: run(http::request> req) { // Set suggested timeout settings for the websocket ws_.set_option( websocket::stream_base::timeout::suggested( beast::role_type::server)); // Set a decorator to change the Server of the handshake ws_.set_option(websocket::stream_base::decorator( [](websocket::response_type& res) { res.set(http::field::server, std::string(BOOST_BEAST_VERSION_STRING) + " websocket-chat-multi"); })); // Accept the websocket handshake ws_.async_accept( req, beast::bind_front_handler( &websocket_session::on_accept, shared_from_this())); } #endif