/* * Copyright (c) 2011, Peter Thorson. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the WebSocket++ Project nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef WEBSOCKET_SERVER_HPP #define WEBSOCKET_SERVER_HPP #include #include #include #include namespace po = boost::program_options; #include #include "websocketpp.hpp" #include "websocket_session.hpp" #include "websocket_connection_handler.hpp" #include #include "rng/blank_rng.hpp" #include "http/parser.hpp" #include "logger/logger.hpp" using boost::asio ::ip::tcp; namespace websocketpp { // TODO: potential policies: // - http parser template class logger_type = log::logger> class server : public boost::enable_shared_from_this< server > { public: typedef rng_policy rng_t; typedef server endpoint_type; typedef session session_type; typedef connection_handler connection_handler_type; typedef boost::shared_ptr ptr; typedef boost::shared_ptr session_ptr; typedef boost::shared_ptr connection_handler_ptr; server(boost::asio::io_service& io_service, const tcp::endpoint& endpoint) : m_max_message_size(DEFAULT_MAX_MESSAGE_SIZE), m_io_service(io_service), m_acceptor(io_service, endpoint), m_desc("websocketpp::server") { m_desc.add_options() ("help", "produce help message") ("host,h",po::value >()->multitoken()->composing(), "hostnames to listen on") ("port,p",po::value(), "port to listen on") ; } void set_default_connection_handler(connection_handler_ptr c) { m_def_con_handler = c; } // creates a new session object and connects the next websocket // connection to it. void start_accept() { if (m_def_con_handler == connection_handler_ptr()) { throw server_error("start_accept called before a connection handler was set"); } // TODO: sanity check whether the session buffer size bound could be reduced session_ptr new_session( new session_type( endpoint_type::shared_from_this(), m_io_service, m_def_con_handler, m_max_message_size*2 ) ); m_acceptor.async_accept( new_session->socket(), boost::bind( &endpoint_type::handle_accept, endpoint_type::shared_from_this(), new_session, boost::asio::placeholders::error ) ); } template