From a0eeb7fb71c5ddff4523480246e94d2e1b29158f Mon Sep 17 00:00:00 2001 From: Peter Thorson Date: Wed, 14 Mar 2012 05:54:22 -0500 Subject: [PATCH 1/7] removes legacy code --- Makefile | 6 +- src/legacy/interfaces/connection_handler.hpp | 104 -- src/legacy/interfaces/frame_parser.hpp | 135 -- src/legacy/interfaces/session.hpp | 325 ---- src/legacy/policy.cpp | 103 -- src/legacy/session_handler_interface.hpp | 49 - src/legacy/websocket_client.cpp | 200 --- src/legacy/websocket_client.hpp | 295 ---- src/legacy/websocket_client_session.cpp | 350 ----- src/legacy/websocket_client_session.hpp | 135 -- src/legacy/websocket_connection_handler.hpp | 112 -- src/legacy/websocket_endpoint.hpp | 55 - src/legacy/websocket_frame.cpp | 27 - src/legacy/websocket_server.cpp | 27 - src/legacy/websocket_server.hpp | 1176 -------------- src/legacy/websocket_server_session.cpp | 362 ----- src/legacy/websocket_server_session.hpp | 118 -- src/legacy/websocket_session.cpp | 26 - src/legacy/websocket_session.hpp | 1451 ------------------ 19 files changed, 3 insertions(+), 5053 deletions(-) delete mode 100644 src/legacy/interfaces/connection_handler.hpp delete mode 100644 src/legacy/interfaces/frame_parser.hpp delete mode 100644 src/legacy/interfaces/session.hpp delete mode 100644 src/legacy/policy.cpp delete mode 100644 src/legacy/session_handler_interface.hpp delete mode 100644 src/legacy/websocket_client.cpp delete mode 100644 src/legacy/websocket_client.hpp delete mode 100644 src/legacy/websocket_client_session.cpp delete mode 100644 src/legacy/websocket_client_session.hpp delete mode 100644 src/legacy/websocket_connection_handler.hpp delete mode 100644 src/legacy/websocket_endpoint.hpp delete mode 100644 src/legacy/websocket_frame.cpp delete mode 100644 src/legacy/websocket_server.cpp delete mode 100644 src/legacy/websocket_server.hpp delete mode 100644 src/legacy/websocket_server_session.cpp delete mode 100644 src/legacy/websocket_server_session.hpp delete mode 100644 src/legacy/websocket_session.cpp delete mode 100644 src/legacy/websocket_session.hpp diff --git a/Makefile b/Makefile index e004eb30be..f69b12b92a 100644 --- a/Makefile +++ b/Makefile @@ -74,8 +74,8 @@ srcdir ?= src CXX ?= c++ AR ?= ar PIC ?= PIC -BUILD_TYPE ?= "default" -SHARED ?= "1" +BUILD_TYPE ?= default +SHARED ?= 1 # Internal Variables @@ -84,7 +84,7 @@ include_path = $(prefix)/$(includedir) # BUILD_TYPE specific settings ifeq ($(BUILD_TYPE), debug) - CXXFLAGS = $(cxxflags_debug) + CXXFLAGS : = $(cxxflags_debug) $(CXXFLANGS_EXTRA) libname := $(libname_debug) else CXXFLAGS ?= $(cxxflags_default) diff --git a/src/legacy/interfaces/connection_handler.hpp b/src/legacy/interfaces/connection_handler.hpp deleted file mode 100644 index 7fbff6cb35..0000000000 --- a/src/legacy/interfaces/connection_handler.hpp +++ /dev/null @@ -1,104 +0,0 @@ -/* - * 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_INTERFACE_CONNECTION_HANDLER_HPP -#define WEBSOCKET_INTERFACE_CONNECTION_HANDLER_HPP - -#include - -#include -#include - -namespace websocketpp { - -class connection_handler { -public: - // validate will be called after a websocket handshake has been received and - // before it is accepted. It provides a handler the ability to refuse a - // connection based on application specific logic (ex: restrict domains or - // negotiate subprotocols). To reject the connection throw a handshake_error - // - // Validate is never called for client sessions. To refuse a client session - // (ex: if you do not like the set of extensions/subprotocols the server - // chose) you can close the connection immediately in the on_open method. - // - // handshake_error parameters: - // log_message - error message to send to server log - // http_error_code - numeric HTTP error code to return to the client - // http_error_msg - (optional) string HTTP error code to return to the - // client (useful for returning non-standard error codes) - virtual void validate(session_ptr session) {}; - - // on_open is called after the websocket session has been successfully - // established and is in the OPEN state. The session is now avaliable to - // send messages and will begin reading frames and calling the on_message/ - // on_close/on_error callbacks. A client may reject the connection by - // closing the session at this point. - virtual void on_open(session_ptr session) = 0; - - // on_close is called whenever an open session is closed for any reason. - // This can be due to either endpoint requesting a connection close or an - // error occuring. Information about why the session was closed can be - // extracted from the session itself. - // - // on_close will be the last time a session calls its handler. If your - // application will need information from `session` after this function you - // should either save the session_ptr somewhere or copy the data out. - virtual void on_close(session_ptr session) = 0; - - // on_message (binary version) will be called when a binary message is - // recieved. Message data is passed as a vector of bytes (unsigned char). - // data will not be avaliable after this callback ends so the handler must - // either completely process the message or copy it somewhere else for - // processing later. - virtual void on_message(session_ptr session, - const std::vector &data) = 0; - - // on_message (text version). Identical to on_message except the data - // parameter is a string interpreted as UTF-8. WebSocket++ guarantees that - // this string is valid UTF-8. - virtual void on_message(session_ptr session,const std::string &msg) = 0; - - - - // #### optional error cases #### - - // on_fail is called whenever a session is terminated or failed before it - // was successfully established. This happens if there is an error during - // the handshake process or if the server refused the connection. - // - // on_fail will be the last time a session calls its handler. If your - // application will need information from `session` after this function you - // should either save the session_ptr somewhere or copy the data out. - virtual void on_fail(session_ptr session) {}; - - // experimental - virtual void on_ping_timeout(session_ptr session) {} -}; - -} -#endif // WEBSOCKET_INTERFACE_CONNECTION_HANDLER_HPP diff --git a/src/legacy/interfaces/frame_parser.hpp b/src/legacy/interfaces/frame_parser.hpp deleted file mode 100644 index 68f5bf86f1..0000000000 --- a/src/legacy/interfaces/frame_parser.hpp +++ /dev/null @@ -1,135 +0,0 @@ -/* - * 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_INTERFACE_FRAME_PARSER_HPP -#define WEBSOCKET_INTERFACE_FRAME_PARSER_HPP - -#include -#include -#include - -namespace websocketpp { -namespace frame { - -namespace error { - enum value { - FATAL_SESSION_ERROR = 0, // force session end - SOFT_SESSION_ERROR = 1, // should log and ignore - PROTOCOL_VIOLATION = 2, // must end session - PAYLOAD_VIOLATION = 3, // should end session - INTERNAL_SERVER_ERROR = 4, // cleanly end session - MESSAGE_TOO_BIG = 5 // ??? - }; -} - -// Opcodes are 4 bits -// See spec section 5.2 -namespace opcode { - enum value { - CONTINUATION = 0x0, - TEXT = 0x1, - BINARY = 0x2, - RSV3 = 0x3, - RSV4 = 0x4, - RSV5 = 0x5, - RSV6 = 0x6, - RSV7 = 0x7, - CLOSE = 0x8, - PING = 0x9, - PONG = 0xA, - CONTROL_RSVB = 0xB, - CONTROL_RSVC = 0xC, - CONTROL_RSVD = 0xD, - CONTROL_RSVE = 0xE, - CONTROL_RSVF = 0xF, - }; - - inline bool reserved(value v) { - return (v >= RSV3 && v <= RSV7) || - (v >= CONTROL_RSVB && v <= CONTROL_RSVF); - } - - inline bool invalid(value v) { - return (v > 0xF || v < 0); - } - - inline bool is_control(value v) { - return v >= 0x8; - } -} - -namespace limits { - static const uint8_t PAYLOAD_SIZE_BASIC = 125; - static const uint16_t PAYLOAD_SIZE_EXTENDED = 0xFFFF; // 2^16, 65535 - static const uint64_t PAYLOAD_SIZE_JUMBO = 0x7FFFFFFFFFFFFFFF;//2^63 - - // hardcoded limit - static const uint64_t INTERNAL_MAX_PAYLOAD_SIZE = 100000000; // 100MB -} - -class exception : public std::exception { -public: - exception(const std::string& msg, - frame::error::value code = frame::error::FATAL_SESSION_ERROR) - : m_msg(msg),m_code(code) {} - ~exception() throw() {} - - virtual const char* what() const throw() { - return m_msg.c_str(); - } - - frame::error::value code() const throw() { - return m_code; - } - - std::string m_msg; - frame::error::value m_code; -}; - -class interface { -public: - // consume - virtual bool ready() const = 0; - virtual bool uint64_t get_bytes_needed() const = 0; - virtual void reset() = 0; - - virtual void consume(std::istream& s) = 0; - - // retrieve buffers - - // read frame options - - // Is the last fragment in a message sequence? - virtual bool get_fin() const = 0; - virtual opcode::value() const = 0; - -}; - - -} -} -#endif // WEBSOCKET_INTERFACE_FRAME_PARSER_HPP diff --git a/src/legacy/interfaces/session.hpp b/src/legacy/interfaces/session.hpp deleted file mode 100644 index e150bbeb14..0000000000 --- a/src/legacy/interfaces/session.hpp +++ /dev/null @@ -1,325 +0,0 @@ -/* - * 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_INTERFACE_SESSION_HPP -#define WEBSOCKET_INTERFACE_SESSION_HPP - -#include - -#include -#include - -#include "../websocket_constants.hpp" -#include "../network_utilities.hpp" - -namespace websocketpp { -namespace session { - -namespace state { - enum value { - CONNECTING = 0, - OPEN = 1, - CLOSING = 2, - CLOSED = 3 - }; -} - -namespace error { - enum value { - FATAL_ERROR = 0, // force session end - SOFT_ERROR = 1, // should log and ignore - PROTOCOL_VIOLATION = 2, // must end session - PAYLOAD_VIOLATION = 3, // should end session - INTERNAL_SERVER_ERROR = 4, // cleanly end session - MESSAGE_TOO_BIG = 5 // ??? - }; -} - -class exception : public std::exception { -public: - exception(const std::string& msg, - error::value code = error::FATAL_ERROR) - : m_msg(msg),m_code(code) {} - ~exception() throw() {} - - virtual const char* what() const throw() { - return m_msg.c_str(); - } - - error::value code() const throw() { - return m_code; - } - - std::string m_msg; - error::value m_code; -}; - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Server API * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* -server(uint16_t port, server_handler_ptr handler) -void run(); - - -*/ - - /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Server Session API * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -class server { -public: - // Valid always - virtual session::state::value get_state() const = 0; - virtual unsigned int get_version() const = 0; - - virtual std::string get_request_header(const std::string& key) const = 0; - virtual std::string get_origin() const = 0; - - // Information about the requested URI - virtual bool get_secure() const = 0; - virtual std::string get_host() const = 0; - virtual std::string get_resource() const = 0; - virtual uint16_t get_port() const = 0; - - // Information about the connected endpoint - /* Tentative API member function */ virtual boost::asio::ip::tcp::endpoint get_endpoint() const = 0; - - // Valid for CONNECTING state - virtual void add_response_header(const std::string& key, const std::string& value) = 0; - virtual void replace_response_header(const std::string& key, const std::string& value) = 0; - virtual const std::vector& get_subprotocols() const = 0; - virtual const std::vector& get_extensions() const = 0; - virtual void select_subprotocol(const std::string& value) = 0; - virtual void select_extension(const std::string& value) = 0; - - // Valid for OPEN state - virtual void send(const utf8_string& payload) = 0; - virtual void send(const binary_string& data) = 0; - virtual void close(close::status::value code, const utf8_string& reason) = 0; - virtual void ping(const binary_string& payload) = 0; - virtual void pong(const binary_string& payload) = 0; - - virtual uint64_t buffered_amount() const = 0; - - // Valid for CLOSED state - virtual close::status::value get_local_close_code() const = 0; - virtual utf8_string get_local_close_reason() const = 0; - virtual close::status::value get_remote_close_code() const = 0; - virtual utf8_string get_remote_close_reason() const = 0; - virtual bool get_failed_by_me() const = 0; - virtual bool get_dropped_by_me() const = 0; - virtual bool get_closed_by_me() const = 0; -}; -typedef boost::shared_ptr server_ptr; -typedef server_ptr server_session_ptr; - - /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Server Handler API * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -class server_handler { -public: - virtual ~server_handler() {} - - // validate will be called after a websocket handshake has been received and - // before it is accepted. It provides a handler the ability to refuse a - // connection based on application specific logic (ex: restrict domains or - // negotiate subprotocols). To reject the connection throw a handshake_error - // - // handshake_error parameters: - // log_message - error message to send to server log - // http_error_code - numeric HTTP error code to return to the client - // http_error_msg - (optional) string HTTP error code to return to the - // client (useful for returning non-standard error codes) - virtual void validate(server_ptr session) = 0; - - // on_open is called after the websocket session has been successfully - // established and is in the OPEN state. The session is now avaliable to - // send messages and will begin reading frames and calling the on_message/ - // on_close/on_error callbacks. A client may reject the connection by - // closing the session at this point. - virtual void on_open(server_ptr session) = 0; - - // on_close is called whenever an open session is closed for any reason. - // This can be due to either endpoint requesting a connection close or an - // error occuring. Information about why the session was closed can be - // extracted from the session itself. - // - // on_close will be the last time a session calls its handler. If your - // application will need information from `session` after this function you - // should either save the session_ptr somewhere or copy the data out. - virtual void on_close(server_ptr session) = 0; - - // on_message (binary version) will be called when a binary message is - // recieved. Message data is passed as a vector of bytes (unsigned char). - // data will not be avaliable after this callback ends so the handler must - // either completely process the message or copy it somewhere else for - // processing later. - virtual void on_message(server_ptr session, binary_string_ptr data) = 0; - - // on_message (text version). Identical to on_message except the data - // parameter is a string interpreted as UTF-8. WebSocket++ guarantees that - // this string is valid UTF-8. - virtual void on_message(server_ptr session, utf8_string_ptr msg) = 0; - - // on_fail is called whenever a session is terminated or failed before it - // was successfully established. This happens if there is an error during - // the handshake process or if the server refused the connection. - // - // on_fail will be the last time a session calls its handler. If your - // application will need information from `session` after this function you - // should either save the session_ptr somewhere or copy the data out. - virtual void on_fail(server_ptr session) {}; - - // on_ping is called whenever a ping is recieved with the binary - // application data from the ping. If on_ping returns true the - // implimentation will send a response pong. - virtual bool on_ping(server_ptr session, binary_string_ptr data) { - return true; - } - - // on_pong is called whenever a pong is recieved with the binary - // application data from the pong. - virtual void on_pong(server_ptr session, binary_string_ptr data) {} - - // TODO: on_ping_timeout -}; - -typedef boost::shared_ptr server_handler_ptr; - - /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Client Session API * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -class client { -public: - client(const std::string& uri) {}; - - // Valid always - virtual session::state::value get_state() const = 0; - virtual int get_version() const = 0; - - virtual std::string get_origin() const = 0; - virtual bool get_secure() const = 0; - virtual std::string get_host() const = 0; - virtual std::string get_resource() const = 0; - virtual uint16_t get_port() const = 0; - - // Valid for CONNECTING state - virtual void set_origin(const std::string& origin) = 0; - virtual void add_request_header(const std::string& key, const std::string& value) = 0; - virtual void replace_request_header(const std::string& key, const std::string& value) = 0; - virtual void request_subprotocol(const std::string& value) = 0; - virtual void request_extension(const std::string& value) = 0; - - // Valid for OPEN state - virtual std::string get_response_header(const std::string& key) const = 0; - virtual std::string get_subprotocol() const; - virtual const std::vector& get_extensions() const = 0; - - virtual void send(const utf8_string& msg) = 0; - virtual void send(const binary_string& data) = 0; - virtual void close(close::status::value code, const binary_string& reason) = 0; - virtual void ping(const binary_string& payload) = 0; - virtual void pong(const binary_string& payload) = 0; - - // Valid for CLOSED state - virtual close::status::value get_local_close_code() const = 0; - virtual utf8_string get_local_close_reason() const = 0; - virtual close::status::value get_remote_close_code() const = 0; - virtual utf8_string get_remote_close_reason() const = 0; - virtual bool failed_by_me() const = 0; - virtual bool dropped_by_me() const = 0; - virtual bool closed_by_me() const = 0; -}; - -typedef boost::shared_ptr client_ptr; - - /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Client Handler API * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -class client_handler { -public: - // on_open is called after the websocket session has been successfully - // established and is in the OPEN state. The session is now avaliable to - // send messages and will begin reading frames and calling the on_message/ - // on_close/on_error callbacks. A client may reject the connection by - // closing the session at this point. - virtual void on_open(client_ptr session) = 0; - - // on_close is called whenever an open session is closed for any reason. - // This can be due to either endpoint requesting a connection close or an - // error occuring. Information about why the session was closed can be - // extracted from the session itself. - // - // on_close will be the last time a session calls its handler. If your - // application will need information from `session` after this function you - // should either save the session_ptr somewhere or copy the data out. - virtual void on_close(client_ptr session) = 0; - - // on_message (binary version) will be called when a binary message is - // recieved. Message data is passed as a vector of bytes (unsigned char). - // data will not be avaliable after this callback ends so the handler must - // either completely process the message or copy it somewhere else for - // processing later. - virtual void on_message(client_ptr session, binary_string_ptr data) = 0; - - // on_message (text version). Identical to on_message except the data - // parameter is a string interpreted as UTF-8. WebSocket++ guarantees that - // this string is valid UTF-8. - virtual void on_message(client_ptr session, utf8_string_ptr msg) = 0; - - // on_fail is called whenever a session is terminated or failed before it - // was successfully established. This happens if there is an error during - // the handshake process or if the server refused the connection. - // - // on_fail will be the last time a session calls its handler. If your - // application will need information from `session` after this function you - // should either save the session_ptr somewhere or copy the data out. - virtual void on_fail(client_ptr session) {}; - - // on_ping is called whenever a ping is recieved with the binary - // application data from the ping. If on_ping returns true the - // implimentation will send a response pong. - virtual bool on_ping(server_ptr session, binary_string_ptr data) { - return true; - } - - // on_pong is called whenever a pong is recieved with the binary - // application data from the pong. - virtual void on_pong(server_ptr session, binary_string_ptr data) {} - - // TODO: on_ping_timeout -}; - -typedef boost::shared_ptr client_handler_ptr; - -} -} -#endif // WEBSOCKET_INTERFACE_SESSION_HPP diff --git a/src/legacy/policy.cpp b/src/legacy/policy.cpp deleted file mode 100644 index dd34320642..0000000000 --- a/src/legacy/policy.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/* -build situation -endpoint.hpp -- libboost_system -- libboost_date_time (if you use the default logger) - -sockets/ssl.hpp -- libcrypto -- libssl - -*/ - -// Application start -#include "endpoint.hpp" -#include "roles/server.hpp" -#include "sockets/ssl.hpp" - -typedef websocketpp::endpoint endpoint_type; -//typedef websocketpp::endpoint endpoint_type; -typedef websocketpp::role::server::handler handler_type; -typedef websocketpp::role::server::handler_ptr handler_ptr; - -// application headers -class application_server_handler : public handler_type { -public: - void validate(handler_type::connection_ptr connection) { - //std::cout << "state: " << connection->get_state() << std::endl; - } - - void on_open(handler_type::connection_ptr connection) { - //std::cout << "connection opened" << std::endl; - } - - void on_close(handler_type::connection_ptr connection) { - //std::cout << "connection closed" << std::endl; - } - - void on_message(connection_ptr connection,websocketpp::utf8_string_ptr msg) { - //std::cout << "got message: " << *msg << std::endl; - connection->send(*msg); - } - void on_message(connection_ptr connection,websocketpp::binary_string_ptr data) { - //std::cout << "got binary message of length: " << data->size() << std::endl; - connection->send(*data); - } - - void http(handler_type::connection_ptr connection) { - connection->set_body("HTTP Response!!"); - } - - void on_fail(handler_type::connection_ptr connection) { - std::cout << "connection failed" << std::endl; - } -}; - -typedef websocketpp::endpoint basic_client; -typedef websocketpp::role::client::handler client_handler_type; -typedef websocketpp::role::client::handler_ptr client_handler_ptr; - -class application_client_handler : public client_handler_type { - void validate(handler_type::connection_ptr connection) { - std::cout << "state: " << connection->get_state() << std::endl; - } - - void on_open(handler_type::connection_ptr connection) { - std::cout << "connection opened" << std::endl; - } - - void on_close(handler_type::connection_ptr connection) { - std::cout << "connection closed" << std::endl; - } - - void on_message(connection_ptr connection,websocketpp::utf8_string_ptr msg) { - std::cout << "got message: " << *msg << std::endl; - connection->send(*msg); - } - void on_message(connection_ptr connection,websocketpp::binary_string_ptr data) { - std::cout << "got binary message of length: " << data->size() << std::endl; - connection->send(*data); - } - - void http(handler_type::connection_ptr connection) { - connection->set_body("HTTP Response!!"); - } - - void on_fail(handler_type::connection_ptr connection) { - std::cout << "connection failed" << std::endl; - } -}; - - -int main () { - handler_ptr h(new application_client_handler()); - endpoint_type e(h); - - e.alog().set_level(websocketpp::log::alevel::ALL); - e.elog().set_level(websocketpp::log::elevel::ALL); - - - e.connect("ws://localhost:9002"); - - return 0; -} \ No newline at end of file diff --git a/src/legacy/session_handler_interface.hpp b/src/legacy/session_handler_interface.hpp deleted file mode 100644 index 236904fdc0..0000000000 --- a/src/legacy/session_handler_interface.hpp +++ /dev/null @@ -1,49 +0,0 @@ -/* - * 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 WEBSOCKETPP_SESSION_HANDLER_INTERFACE_HPP -#define WEBSOCKETPP_SESSION_HANDLER_INTERFACE_HPP - -#include - -#include -#include - -namespace websocketpp { -namespace session { - - - -class session_handler_interface { -public: - -}; - - -} -} -#endif // WEBSOCKETPP_SESSION_HANDLER_INTERFACE_HPP diff --git a/src/legacy/websocket_client.cpp b/src/legacy/websocket_client.cpp deleted file mode 100644 index 1e08d9d6bd..0000000000 --- a/src/legacy/websocket_client.cpp +++ /dev/null @@ -1,200 +0,0 @@ -/* - * 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. - * - */ - -#include "websocket_client.hpp" - -#include -#include - -#include - -using websocketpp::client; -using boost::asio::ip::tcp; - -client::client(boost::asio::io_service& io_service, - websocketpp::connection_handler_ptr defc) - : m_elog_level(LOG_OFF), - m_alog_level(ALOG_OFF), - m_state(CLIENT_STATE_NULL), - m_max_message_size(DEFAULT_MAX_MESSAGE_SIZE), - m_io_service(io_service), - m_resolver(io_service), - m_def_con_handler(defc) {} - -void client::init() { - // TODO: sanity check whether the session buffer size bound could be reduced - m_client_session = client_session_ptr( - new client_session( - shared_from_this(), - m_io_service, - m_def_con_handler, - m_max_message_size*2 - ) - ); - m_state = CLIENT_STATE_INITIALIZED; -} - -void client::connect(const std::string& uri) { - if (m_state != CLIENT_STATE_INITIALIZED) { - throw client_error("connect can only be called after init and before a connection has been established"); - } - - m_client_session->set_uri(uri); - - std::stringstream port; - port << m_client_session->get_port(); - - - tcp::resolver::query query(m_client_session->get_host(), - port.str()); - tcp::resolver::iterator iterator = m_resolver.resolve(query); - - boost::asio::async_connect(m_client_session->socket(), - iterator,boost::bind(&client::handle_connect, - this, - boost::asio::placeholders::error)); - m_state = CLIENT_STATE_CONNECTING; -} - - -void client::add_subprotocol(const std::string& p) { - if (m_state != CLIENT_STATE_INITIALIZED) { - throw client_error("add_protocol can only be called after init and before connect"); - } - m_client_session->add_subprotocol(p); -} - -void client::set_header(const std::string& key,const std::string& val) { - if (m_state != CLIENT_STATE_INITIALIZED) { - throw client_error("set_header can only be called after init and before connect"); - } - m_client_session->set_header(key,val); -} - -void client::set_origin(const std::string& val) { - if (m_state != CLIENT_STATE_INITIALIZED) { - throw client_error("set_origin can only be called after init and before connect"); - } - m_client_session->set_origin(val); -} - - -void client::set_max_message_size(uint64_t val) { - if (val > frame::PAYLOAD_64BIT_LIMIT) { - std::stringstream err; - err << "Invalid maximum message size: " << val; - - // TODO: Figure out what the ideal error behavior for this method. - // Options: - // Throw exception - // Log error and set value to maximum allowed - // Log error and leave value at whatever it was before - log(err.str(),LOG_WARN); - //throw client_error(err.str()); - } - m_max_message_size = val; -} - -bool client::test_elog_level(uint16_t level) { - return (level >= m_elog_level); -} -void client::set_elog_level(uint16_t level) { - std::stringstream msg; - msg << "Error logging level changing from " - << m_elog_level << " to " << level; - log(msg.str(),LOG_INFO); - - m_elog_level = level; -} -bool client::test_alog_level(uint16_t level) { - return ((level & m_alog_level) != 0); -} -void client::set_alog_level(uint16_t level) { - if (test_alog_level(level)) { - return; - } - std::stringstream msg; - msg << "Access logging level " << level << " being set"; - access_log(msg.str(),ALOG_INFO); - - m_alog_level |= level; -} -void client::unset_alog_level(uint16_t level) { - if (!test_alog_level(level)) { - return; - } - std::stringstream msg; - msg << "Access logging level " << level << " being unset"; - access_log(msg.str(),ALOG_INFO); - - m_alog_level &= ~level; -} - -bool client::validate_message_size(uint64_t val) { - if (val > m_max_message_size) { - return false; - } - return true; -} - -void client::log(std::string msg,uint16_t level) { - if (!test_elog_level(level)) { - return; - } - std::cerr << "[Error Log] " - << boost::posix_time::to_iso_extended_string( - boost::posix_time::second_clock::local_time()) - << " " << msg << std::endl; -} -void client::access_log(std::string msg,uint16_t level) { - if (!test_alog_level(level)) { - return; - } - std::cout << "[Access Log] " - << boost::posix_time::to_iso_extended_string( - boost::posix_time::second_clock::local_time()) - << " " << msg << std::endl; -} - -void client::handle_connect(const boost::system::error_code& error) { - if (!error) { - std::stringstream err; - err << "Successful Connection "; - log(err.str(),LOG_ERROR); - - std::cout << boost::posix_time::to_iso_extended_string(boost::posix_time::microsec_clock::local_time()) << " TCP established" << std::endl; - - m_state = CLIENT_STATE_CONNECTED; - m_client_session->on_connect(); - } else { - std::stringstream err; - err << "An error occurred while establishing a connection: " << error; - - log(err.str(),LOG_ERROR); - throw client_error(err.str()); - } -} diff --git a/src/legacy/websocket_client.hpp b/src/legacy/websocket_client.hpp deleted file mode 100644 index 0d0bd655eb..0000000000 --- a/src/legacy/websocket_client.hpp +++ /dev/null @@ -1,295 +0,0 @@ -/* - * 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_CLIENT_HPP -#define WEBSOCKET_CLIENT_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/boost_rng.hpp" - -#include "http/parser.hpp" - -using boost::asio::ip::tcp; - -namespace websocketpp { - -class client_error : public std::exception { -public: - client_error(const std::string& msg) - : m_msg(msg) {} - ~client_error() throw() {} - - virtual const char* what() const throw() { - return m_msg.c_str(); - } -private: - std::string m_msg; -}; - -template -class client : public boost::enable_shared_from_this > { -public: - typedef rng_policy rng_t; - - typedef client 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; - - static const uint16_t CLIENT_STATE_NULL = 0; - static const uint16_t CLIENT_STATE_INITIALIZED = 1; - static const uint16_t CLIENT_STATE_CONNECTING = 2; - static const uint16_t CLIENT_STATE_CONNECTED = 3; - - client(boost::asio::io_service& io_service, - connection_handler_ptr defc) - : m_elog_level(LOG_OFF), - m_alog_level(ALOG_OFF), - m_state(CLIENT_STATE_NULL), - m_max_message_size(DEFAULT_MAX_MESSAGE_SIZE), - m_io_service(io_service), - m_resolver(io_service), - m_def_con_handler(defc) {} - - // INTERFACE FOR LOCAL APPLICATIONS - - // initializes the session. Methods that affect the opening handshake - // such as add_protocol and set_header must be called after init and - // before connect. - void init() { - // TODO: sanity check whether the session buffer size bound could be reduced - m_client_session = session_ptr( - new session_type( - endpoint_type::shared_from_this(), - m_io_service, - m_def_con_handler, - m_max_message_size*2 - ) - ); - m_state = CLIENT_STATE_INITIALIZED; - } - - // starts the connection process. Should be called before - // io_service.run(), connection process will not start until run() has - // been called. - void connect(const std::string& u) { - if (m_state != CLIENT_STATE_INITIALIZED) { - throw client_error("connect can only be called after init and before a connection has been established"); - } - - ws_uri uri; - - if (!uri.parse(u)) { - throw client_error("Invalid WebSocket URI"); - } - - if (uri.secure) { - throw client_error("wss / secure connections are not supported at this time"); - } - - m_client_session->set_uri(uri); - - std::stringstream port; - port << uri.port; - - tcp::resolver::query query(uri.host,port.str()); - tcp::resolver::iterator iterator = m_resolver.resolve(query); - - boost::asio::async_connect( - m_client_session->socket(), - iterator, - boost::bind( - &endpoint_type::handle_connect, - endpoint_type::shared_from_this(), - boost::asio::placeholders::error - ) - ); - m_state = CLIENT_STATE_CONNECTING; - } - - // Adds a protocol to the opening handshake. - // Must be called before connect - void add_subprotocol(const std::string& p) { - if (m_state != CLIENT_STATE_INITIALIZED) { - throw client_error("add_protocol can only be called after init and before connect"); - } - m_client_session->add_subprotocol(p); - } - - // Sets the value of the given HTTP header to be sent during the - // opening handshake. Must be called before connect - void set_header(const std::string& key,const std::string& val) { - if (m_state != CLIENT_STATE_INITIALIZED) { - throw client_error("set_header can only be called after init and before connect"); - } - m_client_session->set_request_header(key,val); - } - - void set_origin(const std::string& val) { - if (m_state != CLIENT_STATE_INITIALIZED) { - throw client_error("set_origin can only be called after init and before connect"); - } - m_client_session->set_origin(val); - } - - void set_max_message_size(uint64_t val) { - if (val > frame::limits::PAYLOAD_SIZE_JUMBO) { - std::stringstream err; - err << "Invalid maximum message size: " << val; - - // TODO: Figure out what the ideal error behavior for this method. - // Options: - // Throw exception - // Log error and set value to maximum allowed - // Log error and leave value at whatever it was before - log(err.str(),LOG_WARN); - //throw client_error(err.str()); - } - m_max_message_size = val; - } - - // Test methods determine if a message of the given level should be - // written. elog shows all values above the level set. alog shows only - // the values explicitly set. - bool test_elog_level(uint16_t level) { - return (level >= m_elog_level); - } - void set_elog_level(uint16_t level) { - std::stringstream msg; - msg << "Error logging level changing from " - << m_elog_level << " to " << level; - log(msg.str(),LOG_INFO); - - m_elog_level = level; - } - - bool test_alog_level(uint16_t level) { - return ((level & m_alog_level) != 0); - } - void set_alog_level(uint16_t level) { - if (test_alog_level(level)) { - return; - } - std::stringstream msg; - msg << "Access logging level " << level << " being set"; - access_log(msg.str(),ALOG_INFO); - - m_alog_level |= level; - } - void unset_alog_level(uint16_t level) { - if (!test_alog_level(level)) { - return; - } - std::stringstream msg; - msg << "Access logging level " << level << " being unset"; - access_log(msg.str(),ALOG_INFO); - - m_alog_level &= ~level; - } - - // INTERFACE FOR SESSIONS - - // Check if message size is within server's acceptable parameters - bool validate_message_size(uint64_t val) { - if (val > m_max_message_size) { - return false; - } - return true; - } - - // write to the server's logs - void log(std::string msg,uint16_t level = LOG_ERROR) { - if (!test_elog_level(level)) { - return; - } - std::cerr << "[Error Log] " - << boost::posix_time::to_iso_extended_string( - boost::posix_time::second_clock::local_time()) - << " " << msg << std::endl; - } - void access_log(std::string msg,uint16_t level) { - if (!test_alog_level(level)) { - return; - } - std::cout << "[Access Log] " - << boost::posix_time::to_iso_extended_string( - boost::posix_time::second_clock::local_time()) - << " " << msg << std::endl; - } -private: - // if no errors starts the session's read loop and returns to the - // start_accept phase. - void handle_connect(const boost::system::error_code& error) { - if (!error) { - std::stringstream err; - err << "Successful Connection "; - log(err.str(),LOG_ERROR); - - m_state = CLIENT_STATE_CONNECTED; - m_client_session->on_connect(); - } else { - std::stringstream err; - err << "An error occurred while establishing a connection: " << error; - - log(err.str(),LOG_ERROR); - throw client_error(err.str()); - } - } - -private: - uint16_t m_elog_level; - uint16_t m_alog_level; - - uint16_t m_state; - - std::set m_hosts; - uint64_t m_max_message_size; - boost::asio::io_service& m_io_service; - tcp::resolver m_resolver; - session_ptr m_client_session; - connection_handler_ptr m_def_con_handler; -}; - -} - -#endif // WEBSOCKET_CLIENT_HPP diff --git a/src/legacy/websocket_client_session.cpp b/src/legacy/websocket_client_session.cpp deleted file mode 100644 index 8532afdde6..0000000000 --- a/src/legacy/websocket_client_session.cpp +++ /dev/null @@ -1,350 +0,0 @@ -/* - * 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. - * - */ - -#include "websocketpp.hpp" -#include "websocket_client_session.hpp" - -#include "websocket_frame.hpp" -#include "utf8_validator/utf8_validator.hpp" - -#include -#include -#include -#include -#include - - -#include -#include -#include -#include - -using websocketpp::client_session; - -client_session::client_session (websocketpp::client_ptr c, - boost::asio::io_service& io_service, - websocketpp::connection_handler_ptr defc, - uint64_t buf_size) - : session(io_service,defc,buf_size),m_client(c) {} - -void client_session::on_connect() { - // TODO: section 4.1: Figure out if we have another connection to this - // host/port pending. - write_handshake(); -} - -void client_session::set_uri(const std::string& uri) { - if (!m_uri.parse(uri)) { - throw client_error("Invalid WebSocket URI"); - } - - if (m_uri.secure) { - throw client_error("wss / secure connections are not supported at this time"); - } - - m_resource = m_uri.resource; - - std::stringstream l; - - l << "parsed websocket url: secure: " << m_uri.secure << " host: " << m_uri.host - << " port (final): " << m_uri.port << " resource " << m_uri.resource; - - log(l.str(),LOG_DEBUG); -} - -bool client_session::get_secure() const { - return m_uri.secure; -} - -std::string client_session::get_host() const{ - return m_uri.host; -} - -uint16_t client_session::get_port() const { - return m_uri.port; -} - -void client_session::set_header(const std::string &key,const std::string &val) { - // TODO: prevent use of reserved headers - m_client_headers[key] = val; -} - -void client_session::set_origin(const std::string& val) { - // TODO: input validation - m_client_origin = val; -} - -void client_session::add_subprotocol(const std::string &val) { - // TODO: input validation - m_client_subprotocols.push_back(val); -} - -void client_session::add_extension(const std::string& val) { - // TODO: input validation - m_client_extensions.push_back(val); -} - -void client_session::read_handshake() { - boost::asio::async_read_until( - m_socket, - m_buf, - "\r\n\r\n", - boost::bind( - &session::handle_read_handshake, - shared_from_this(), - boost::asio::placeholders::error, - boost::asio::placeholders::bytes_transferred - ) - ); -} - -void client_session::handle_read_handshake(const boost::system::error_code& e, - std::size_t bytes_transferred) { - - if (e) { - log_error("Error reading server handshake",e); - drop_tcp(); - return; - } - - // parse server handshake - std::istream response_stream(&m_buf); - std::string header; - std::string::size_type end; - - // get status line - std::getline(response_stream, header); - if (header[header.size()-1] == '\r') { - header.erase(header.end()-1); - m_server_http_request = header; - m_raw_server_handshake += header+"\n"; - } - - // get headers - while (std::getline(response_stream, header) && header != "\r") { - if (header[header.size()-1] != '\r') { - continue; // ignore malformed header lines? - } else { - header.erase(header.end()-1); - } - - end = header.find(": ",0); - - if (end != std::string::npos) { - std::string h = header.substr(0,end); - if (get_server_header(h) == "") { - m_server_headers[h] = header.substr(end+2); - } else { - m_server_headers[h] += ", " + header.substr(end+2); - } - } - - m_raw_server_handshake += header+"\n"; - } - - // temporary debugging - if (m_buf.size() > 0) { - std::stringstream foo; - foo << "bytes left over: " << m_buf.size(); - access_log(foo.str(), ALOG_HANDSHAKE); - } - - m_client->access_log(m_raw_server_handshake,ALOG_HANDSHAKE); - - // handshake error checking - try { - std::stringstream err; - std::string h; - - // TODO: allow versions greater than 1.1 - if (m_server_http_request.substr(0,9) != "HTTP/1.1 ") { - err << "Websocket handshake has invalid HTTP version: " - << m_server_http_request.substr(0,9); - - throw(handshake_error(err.str(),400)); - } - - // check the HTTP version - if (m_server_http_request.substr(9,3) != "101") { - err << "Websocket handshake ended with status " - << m_server_http_request.substr(9); - - // TODO: check version header for other supported versions. - - throw(handshake_error(err.str(),400)); - } - - // verify the presence of required headers - h = get_server_header("Upgrade"); - if (h == "") { - throw(handshake_error("Required Upgrade header is missing",400)); - } else if (!boost::iequals(h,"websocket")) { - err << "Upgrade header was \"" << h << "\" instead of \"websocket\""; - throw(handshake_error(err.str(),400)); - } - - h = get_server_header("Connection"); - if (h == "") { - throw(handshake_error("Required Connection header is missing",400)); - } else if (!boost::ifind_first(h,"upgrade")) { - err << "Connection header, \"" << h - << "\", does not contain required token \"upgrade\""; - throw(handshake_error(err.str(),400)); - } - - if (get_server_header("Sec-WebSocket-Accept") == "") { - throw(handshake_error("Required Sec-WebSocket-Key header is missing",400)); - } else { - // TODO: make a helper function for this. - std::string server_key = m_client_key; - server_key += "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; - - SHA1 sha; - uint32_t message_digest[5]; - - sha.Reset(); - sha << server_key.c_str(); - - if (!sha.Result(message_digest)) { - m_client->log("Error computing handshake sha1 hash.",LOG_ERROR); - // TODO: close behavior - return; - } - - // convert sha1 hash bytes to network byte order because this sha1 - // library works on ints rather than bytes - for (int i = 0; i < 5; i++) { - message_digest[i] = htonl(message_digest[i]); - } - - server_key = base64_encode( - reinterpret_cast(message_digest),20); - if (server_key != get_server_header("Sec-WebSocket-Accept")) { - m_client->log("Server key does not match",LOG_ERROR); - // TODO: close behavior - return; - } - } - } catch (const handshake_error& e) { - std::stringstream err; - err << "Caught handshake exception: " << e.what(); - - m_client->access_log(e.what(),ALOG_HANDSHAKE); - m_client->log(err.str(),LOG_ERROR); - - // TODO: close behavior - return; - } - - log_open_result(); - - m_state = STATE_OPEN; - - if (m_local_interface) { - m_local_interface->on_open(shared_from_this()); - } - - reset_message(); - read_frame(); -} - -void client_session::write_handshake() { - // generate client handshake. - std::string client_handshake; - - client_handshake += "GET "+m_resource+" HTTP/1.1\r\n"; - - set_header("Upgrade","websocket"); - set_header("Connection","Upgrade"); - set_header("Sec-WebSocket-Version","13"); - - set_header("Host",m_uri.host); - - if (m_client_origin != "") { - set_header("Origin",m_client_origin); - } - - // TODO: generate proper key - m_client_key = "XO4pxrIMLnK1CEVQP9untQ=="; - - int32_t raw_key[4]; - - boost::random::random_device rng; - boost::random::variate_generator > gen(rng, boost::random::uniform_int_distribution<>(INT32_MIN,INT32_MAX)); - - for (int i = 0; i < 4; i++) { - raw_key[i] = gen(); - } - - m_client_key = base64_encode(reinterpret_cast(raw_key), 16); - - m_client->access_log("Client key chosen: "+m_client_key, ALOG_HANDSHAKE); - - set_header("Sec-WebSocket-Key",m_client_key); - - - - set_header("User Agent","WebSocket++/2011-09-25"); - - header_list::iterator it; - for (it = m_client_headers.begin(); it != m_client_headers.end(); it++) { - client_handshake += it->first + ": " + it->second + "\r\n"; - } - - client_handshake += "\r\n"; - - m_raw_client_handshake = client_handshake; - - // start async write to handle_write_handshake - boost::asio::async_write( - m_socket, - boost::asio::buffer(m_raw_client_handshake), - boost::bind( - &session::handle_write_handshake, - shared_from_this(), - boost::asio::placeholders::error - ) - ); -} - -void client_session::handle_write_handshake(const boost::system::error_code& error) { - if (error) { - log_error("Error writing handshake",error); - drop_tcp(); - return; - } - - read_handshake(); -} - -void client_session::log(const std::string& msg, uint16_t level) const { - m_client->log(msg,level); -} - -void client_session::access_log(const std::string& msg, uint16_t level) const { - m_client->access_log(msg,level); -} diff --git a/src/legacy/websocket_client_session.hpp b/src/legacy/websocket_client_session.hpp deleted file mode 100644 index 2dd431e272..0000000000 --- a/src/legacy/websocket_client_session.hpp +++ /dev/null @@ -1,135 +0,0 @@ -/* - * 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_CLIENT_SESSION_HPP -#define WEBSOCKET_CLIENT_SESSION_HPP - -#include -#include - -#include -#include - -#if defined(WIN32) -#include -#else -#include -#endif - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace websocketpp { - class client_session; - typedef boost::shared_ptr client_session_ptr; -} - -#include "websocket_session.hpp" -#include "websocket_client.hpp" - -using boost::asio::ip::tcp; - -namespace websocketpp { - -class client_session : public session { -public: - client_session (client_ptr c, - boost::asio::io_service& io_service, - connection_handler_ptr defc, - uint64_t buf_size); - - /*** CLIENT INTERFACE ***/ - - // This function is called when a tcp connection has been established and - // the connection is ready to start the opening handshake. - void on_connect(); - - /*** HANDSHAKE INTERFACE ***/ - - void set_uri(const std::string& url); - - bool get_secure() const; - std::string get_host() const; - uint16_t get_port() const; - - // Set an HTTP header for the outgoing client handshake. - void set_header(const std::string& key,const std::string& val); - - // adds a subprotocol. This will result in the appropriate - // Sec-WebSocket-Protocol header being sent with the opening connection. - // Values will be sent in the order they were added. Servers interpret this - // order as the preferred order. - void add_subprotocol(const std::string &val); - - // Sets the origin value that will be sent to the server - void set_origin(const std::string &val); - - // Adds an extension to the extension list. Extensions are sent in the - // order added - void add_extension(const std::string& val); - - /*** SESSION INTERFACE ***/ - // see session - bool is_server() const {return false;} - - void log(const std::string& msg, uint16_t level) const; - void access_log(const std::string& msg, uint16_t level) const; -protected: - // Opening handshake processors and callbacks. - virtual void write_handshake(); - virtual void handle_write_handshake(const boost::system::error_code& e); - virtual void read_handshake(); - virtual void handle_read_handshake(const boost::system::error_code& e, - std::size_t bytes_transferred); - -private: - -protected: - ws_uri m_uri; - // url parts - bool m_secure; - std::string m_host; - uint16_t m_port; - - // handshake stuff - std::string m_client_key; - - // connection resources - client_ptr m_client; -private: - -}; - -} - -#endif // WEBSOCKET_CLIENT_SESSION_HPP diff --git a/src/legacy/websocket_connection_handler.hpp b/src/legacy/websocket_connection_handler.hpp deleted file mode 100644 index 652f5347f1..0000000000 --- a/src/legacy/websocket_connection_handler.hpp +++ /dev/null @@ -1,112 +0,0 @@ -/* - * 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_CONNECTION_HANDLER_HPP -#define WEBSOCKET_CONNECTION_HANDLER_HPP - -#include - -#include -#include - -namespace websocketpp { - -template -class connection_handler { -public: - typedef connection_handler connection_handler_type; - - typedef boost::shared_ptr ptr; - typedef boost::shared_ptr session_ptr; - - // validate will be called after a websocket handshake has been received and - // before it is accepted. It provides a handler the ability to refuse a - // connection based on application specific logic (ex: restrict domains or - // negotiate subprotocols). To reject the connection throw a handshake_error - // - // Validate is never called for client sessions. To refuse a client session - // (ex: if you do not like the set of extensions/subprotocols the server - // chose) you can close the connection immediately in the on_open method. - // - // handshake_error parameters: - // log_message - error message to send to server log - // http_error_code - numeric HTTP error code to return to the client - // http_error_msg - (optional) string HTTP error code to return to the - // client (useful for returning non-standard error codes) - virtual void validate(session_ptr session) {}; - - // on_open is called after the websocket session has been successfully - // established and is in the OPEN state. The session is now avaliable to - // send messages and will begin reading frames and calling the on_message/ - // on_close/on_error callbacks. A client may reject the connection by - // closing the session at this point. - virtual void on_open(session_ptr session) = 0; - - // on_close is called whenever an open session is closed for any reason. - // This can be due to either endpoint requesting a connection close or an - // error occuring. Information about why the session was closed can be - // extracted from the session itself. - // - // on_close will be the last time a session calls its handler. If your - // application will need information from `session` after this function you - // should either save the session_ptr somewhere or copy the data out. - virtual void on_close(session_ptr session) = 0; - - // on_message (binary version) will be called when a binary message is - // recieved. Message data is passed as a vector of bytes (unsigned char). - // data will not be avaliable after this callback ends so the handler must - // either completely process the message or copy it somewhere else for - // processing later. - virtual void on_message(session_ptr session, - const std::vector &data) = 0; - - // on_message (text version). Identical to on_message except the data - // parameter is a string interpreted as UTF-8. WebSocket++ guarantees that - // this string is valid UTF-8. - virtual void on_message(session_ptr session,const std::string &msg) = 0; - - - - // #### optional error cases #### - - // on_fail is called whenever a session is terminated or failed before it - // was successfully established. This happens if there is an error during - // the handshake process or if the server refused the connection. - // - // on_fail will be the last time a session calls its handler. If your - // application will need information from `session` after this function you - // should either save the session_ptr somewhere or copy the data out. - virtual void on_fail(session_ptr session) {}; - - // experimental - virtual void on_ping_timeout(session_ptr session) {} -}; - - - -} -#endif // WEBSOCKET_CONNECTION_HANDLER_HPP diff --git a/src/legacy/websocket_endpoint.hpp b/src/legacy/websocket_endpoint.hpp deleted file mode 100644 index 4f80bf992f..0000000000 --- a/src/legacy/websocket_endpoint.hpp +++ /dev/null @@ -1,55 +0,0 @@ -/* - * 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_ENDPOINT_HPP -#define WEBSOCKET_ENDPOINT_HPP - -#include - -#include -#include - -namespace websocketpp { - class endpoint; - typedef boost::shared_ptr endpoint_ptr; -} - -#include "websocket_session.hpp" - -namespace websocketpp { - -class endpoint : public boost::enable_shared_from_this { -public: - virtual bool is_server() = 0; - // log - // access_log -}; - - - -} -#endif // WEBSOCKET_ENDPOINT_HPP diff --git a/src/legacy/websocket_frame.cpp b/src/legacy/websocket_frame.cpp deleted file mode 100644 index d1001affb6..0000000000 --- a/src/legacy/websocket_frame.cpp +++ /dev/null @@ -1,27 +0,0 @@ -/* - * 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. - * - */ - diff --git a/src/legacy/websocket_server.cpp b/src/legacy/websocket_server.cpp deleted file mode 100644 index d1001affb6..0000000000 --- a/src/legacy/websocket_server.cpp +++ /dev/null @@ -1,27 +0,0 @@ -/* - * 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. - * - */ - diff --git a/src/legacy/websocket_server.hpp b/src/legacy/websocket_server.hpp deleted file mode 100644 index b55f81c7ab..0000000000 --- a/src/legacy/websocket_server.hpp +++ /dev/null @@ -1,1176 +0,0 @@ -/* - * 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 -#include -#include - -//#include // for the ssl policy only - -namespace po = boost::program_options; - -#include -#include - -#include "websocketpp.hpp" - -#include "interfaces/session.hpp" - -// Session processors -#include "interfaces/protocol.hpp" -#include "hybi_legacy_processor.hpp" -#include "hybi_processor.hpp" - -#include "websocket_connection_handler.hpp" - -#include "rng/blank_rng.hpp" -#include "http/parser.hpp" -#include "logger/logger.hpp" - -using boost::asio::ip::tcp; -using websocketpp::session::server_handler_ptr; -using websocketpp::protocol::processor_ptr; - -namespace websocketpp { -namespace server { - -namespace write_state { - enum value { - IDLE = 0, - WRITING = 1, - INTURRUPT = 2 - }; -} - -template - < - typename server_policy, - template class security_policy - > -class connection - : - public security_policy< connection >, - public boost::enable_shared_from_this< connection > { -public: - typedef server_policy server_type; - typedef connection connection_type; - typedef security_policy< connection > security_policy_type; - - typedef boost::shared_ptr ptr; - typedef boost::shared_ptr server_ptr; - - connection(server_ptr s, - boost::asio::io_service& io_service, - server_handler_ptr handler) - : security_policy_type(io_service), - m_server(s), - m_io_service(io_service), - //m_socket(io_service), - m_timer(io_service,boost::posix_time::seconds(0)), - m_buf(/* TODO: needs a max here */), - m_handler(handler), - m_state(session::state::CONNECTING), - m_write_buffer(0), - m_write_state(write_state::IDLE) {} - - // implimentation of the server session API - - // Valid always - session::state::value get_state() const { - // TODO: syncronize - return m_state; - } - - unsigned int get_version() const { - return m_version; - } - - std::string get_origin() const { - return m_origin; - } - - std::string get_request_header(const std::string& key) const { - return m_request.header(key); - } - - bool get_secure() const { - // TODO - return false; - } - - std::string get_host() const { - return m_uri.host; - } - - uint16_t get_port() const { - return m_uri.port; - } - - std::string get_resource() const { - return m_uri.resource; - } - - tcp::endpoint get_endpoint() const { - return security_policy_type::socket().remote_endpoint(); - } - - // Valid for CONNECTING state - void add_response_header(const std::string& key, const std::string& value) { - m_response.add_header(key,value); - } - void replace_response_header(const std::string& key, const std::string& value) { - m_response.replace_header(key,value); - } - const std::vector& get_subprotocols() const { - return m_requested_subprotocols; - } - const std::vector& get_extensions() const { - return m_requested_extensions; - } - void select_subprotocol(const std::string& value) { - std::vector::iterator it; - - it = std::find(m_requested_subprotocols.begin(), - m_requested_subprotocols.end(), - value); - - if (value != "" && it == m_requested_subprotocols.end()) { - throw server_error("Attempted to choose a subprotocol not proposed by the client"); - } - - m_subprotocol = value; - } - void select_extension(const std::string& value) { - if (value == "") { - return; - } - - std::vector::iterator it; - - it = std::find(m_requested_extensions.begin(), - m_requested_extensions.end(), - value); - - if (it == m_requested_extensions.end()) { - throw server_error("Attempted to choose an extension not proposed by the client"); - } - - m_extensions.push_back(value); - } - - // Valid for OPEN state - - // These functions invoke write_message through the io_service to gain - // thread safety - void send(const utf8_string& payload) { - binary_string_ptr msg(m_processor->prepare_frame(frame::opcode::TEXT,false,payload)); - - m_io_service.post(boost::bind(&connection_type::write_message,connection_type::shared_from_this(),msg)); - - // TODO: return bytes in flight somehow? - } - - void send(const binary_string& data) { - binary_string_ptr msg(m_processor->prepare_frame(frame::opcode::BINARY,false,data)); - m_io_service.post(boost::bind(&connection_type::write_message,connection_type::shared_from_this(),msg)); - } - - void close(close::status::value code, const utf8_string& reason) { - // TODO - } - - void ping(const binary_string& payload) { - binary_string_ptr msg(m_processor->prepare_frame(frame::opcode::PING,false,payload)); - - m_io_service.post(boost::bind(&connection_type::write_message,connection_type::shared_from_this(),msg)); - } - - void pong(const binary_string& payload) { - binary_string_ptr msg(m_processor->prepare_frame(frame::opcode::PONG,false,payload)); - m_io_service.post(boost::bind(&connection_type::write_message,connection_type::shared_from_this(),msg)); - } - - uint64_t buffered_amount() const { - // TODO: syncronize this member function - return m_write_buffer; - } - - // Valid for CLOSED state - close::status::value get_local_close_code() const { - return m_local_close_code; - } - utf8_string get_local_close_reason() const { - return m_local_close_reason; - } - close::status::value get_remote_close_code() const { - return m_remote_close_code; - } - utf8_string get_remote_close_reason() const { - return m_remote_close_reason; - } - bool get_failed_by_me() const { - return m_failed_by_me; - } - bool get_dropped_by_me() const { - return m_dropped_by_me; - } - bool get_closed_by_me() const { - return m_closed_by_me; - } - - //////// - - // now provided by a policy class - /*tcp::socket& get_socket() { - return m_socket; - }*/ - - void read_request() { - // start reading HTTP header and attempt to determine if the incoming - // connection is a websocket connection. If it is determine the version - // and generate a session processor for that version. If it is not a - // websocket connection either drop or pass to the default HTTP pass - // through handler. - - m_timer.expires_from_now(boost::posix_time::seconds(5 /* TODO */)); - - m_timer.async_wait( - boost::bind( - &connection_type::fail_on_expire, - connection_type::shared_from_this(), - boost::asio::placeholders::error - ) - ); - - boost::asio::async_read_until( - security_policy_type::socket(), - m_buf, - "\r\n\r\n", - boost::bind( - &connection_type::handle_read_request, - connection_type::shared_from_this(), - boost::asio::placeholders::error, - boost::asio::placeholders::bytes_transferred - ) - ); - } - - void handle_read_request(const boost::system::error_code& e, - std::size_t bytes_transferred) { - if (e) { - log_error("Error reading HTTP request",e); - terminate_connection(false); - return; - } - - try { - std::istream request(&m_buf); - - // TODO: use a more generic consume api where we just call read_some - // and have the handshake consume and validate as we go. - // - // For now, because it simplifies things we will use the parse_header - // member function which requires the complete header to be passed in - // initially. ASIO can guarantee us this. - // - // - //m_remote_handshake.consume(response_stream); - if (!m_request.parse_complete(request)) { - // not a valid HTTP request/response - throw http::exception("Recieved invalid HTTP Request",http::status_code::BAD_REQUEST); - } - - // Log the raw handshake. - m_server->alog().at(log::alevel::DEBUG_HANDSHAKE) << m_request.raw() << log::endl; - - // Determine what sort of connection this is: - m_version = -1; - - std::string h = m_request.header("Upgrade"); - if (boost::ifind_first(h,"websocket")) { - h = m_request.header("Sec-WebSocket-Version"); - if (h == "") { - m_version = 0; - } else { - m_version = atoi(h.c_str()); - if (m_version == 0) { - throw(http::exception("Unable to determine connection version",http::status_code::BAD_REQUEST)); - } - } - } - - m_server->alog().at(log::alevel::DEBUG_HANDSHAKE) << "determined connection version: " << m_version << log::endl; - - if (m_version == -1) { - // Probably a plain HTTP request - // TODO: forward to an http handler? - - } else { - // websocket connection - // create a processor based on version. - if (m_version == 0) { - // create hybi 00 processor - - // grab hybi00 token first - char foo[9]; - foo[8] = 0; - - request.get(foo,9); - - if (request.gcount() != 8) { - throw http::exception("Missing Key3",http::status_code::BAD_REQUEST); - } - m_request.add_header("Sec-WebSocket-Key3",std::string(foo)); - - m_processor = processor_ptr(new protocol::hybi_legacy_processor(false)); - } else if (m_version == 7 || m_version == 8 || m_version == 13) { - // create hybi 17 processor - m_processor = processor_ptr(new protocol::hybi_processor(false,m_rng)); - } else { - // TODO: respond with unknown version message per spec - } - - // ask new protocol whether this set of headers is valid - m_processor->validate_handshake(m_request); - m_origin = m_processor->get_origin(m_request); - m_uri = m_processor->get_uri(m_request); - - // ask local application to confirm that it wants to accept - m_handler->validate(boost::static_pointer_cast(connection_type::shared_from_this())); - - m_response.set_status(http::status_code::SWITCHING_PROTOCOLS); - } - - } catch (const http::exception& e) { - m_server->alog().at(log::alevel::DEBUG_HANDSHAKE) << e.what() << log::endl; - - m_server->elog().at(log::elevel::ERROR) - << "Caught handshake exception: " << e.what() << log::endl; - - m_response.set_status(e.m_error_code,e.m_error_msg); - } - - write_response(); - } - - // write the response to the client's request. - void write_response() { - std::string response; - - m_response.set_version("HTTP/1.1"); - - if (m_response.status_code() == http::status_code::SWITCHING_PROTOCOLS) { - // websocket response - m_processor->handshake_response(m_request,m_response); - - if (m_subprotocol != "") { - m_response.replace_header("Sec-WebSocket-Protocol",m_subprotocol); - } - - // TODO: return negotiated extensions - } else { - // HTTP response - } - - m_response.replace_header("Server","WebSocket++/2011-10-31"); - - std::string raw = m_response.raw(); - - // Hack for legacy HyBi - if (m_version == 0) { - raw += boost::dynamic_pointer_cast(m_processor)->get_key3(); - } - - m_server->alog().at(log::alevel::DEBUG_HANDSHAKE) << raw << log::endl; - - // start async write to handle_write_handshake - boost::asio::async_write( - security_policy_type::socket(), - boost::asio::buffer(raw), - boost::bind( - &connection_type::handle_write_response, - connection_type::shared_from_this(), - boost::asio::placeholders::error - ) - ); - } - - void handle_write_response(const boost::system::error_code& error) { - // stop the handshake timer - m_timer.cancel(); - - if (error) { - log_error("Network error writing handshake response",error); - terminate_connection(false); - m_handler->on_fail(boost::static_pointer_cast(connection_type::shared_from_this())); - return; - } - - log_open_result(); - - // log error if this was - if (m_version != -1 && m_response.status_code() != http::status_code::SWITCHING_PROTOCOLS) { - m_server->elog().at(log::elevel::ERROR) - << "Handshake ended with HTTP error: " - << m_response.status_code() << " " << m_response.status_msg() - << log::endl; - - terminate_connection(true); - m_handler->on_fail(boost::static_pointer_cast(connection_type::shared_from_this())); - return; - } - - m_state = session::state::OPEN; - - m_handler->on_open(boost::static_pointer_cast(connection_type::shared_from_this())); - - // TODO: start read message loop. - m_server->alog().at(log::alevel::DEVEL) << "calling handle_read_frame" << log::endl; - handle_read_frame(boost::system::error_code()); - } - - void handle_read_frame (const boost::system::error_code& error) { - // check if state changed while we were waiting for a read. - if (m_state == session::state::CLOSED) { return; } - - if (error) { - if (error == boost::asio::error::eof) { - // got unexpected EOF - // TODO: log error - terminate_connection(false); - } else if (error == boost::asio::error::operation_aborted) { - // got unexpected abort (likely our server issued an abort on - // all connections on this io_service) - - // TODO: log error - terminate_connection(true); - } else { - // Other unexpected error - - // TODO: log error - terminate_connection(false); - } - } - - // process data from the buffer just read into - std::istream s(&m_buf); - - m_server->alog().at(log::alevel::DEVEL) << "starting while, buffer size: " << m_buf.size() << log::endl; - - while (m_state != session::state::CLOSED && m_buf.size() > 0) { - try { - m_server->alog().at(log::alevel::DEVEL) << "starting consume, buffer size: " << m_buf.size() << log::endl; - m_processor->consume(s); - m_server->alog().at(log::alevel::DEVEL) << "done consume, buffer size: " << m_buf.size() << log::endl; - - if (m_processor->ready()) { - m_server->alog().at(log::alevel::DEVEL) << "new message ready" << m_buf.size() << log::endl; - - bool response; - switch (m_processor->get_opcode()) { - case frame::opcode::TEXT: - m_handler->on_message(boost::static_pointer_cast(connection_type::shared_from_this()),m_processor->get_utf8_payload()); - break; - case frame::opcode::BINARY: - m_handler->on_message(boost::static_pointer_cast(connection_type::shared_from_this()),m_processor->get_binary_payload()); - break; - case frame::opcode::PING: - response = m_handler->on_ping(boost::static_pointer_cast(connection_type::shared_from_this()),m_processor->get_binary_payload()); - - if (response) { - // send response ping - write_message(m_processor->prepare_frame(frame::opcode::PONG,false,*m_processor->get_binary_payload())); - } - break; - case frame::opcode::PONG: - m_handler->on_pong(boost::static_pointer_cast(connection_type::shared_from_this()),m_processor->get_binary_payload()); - - // TODO: disable ping response timer - - break; - case frame::opcode::CLOSE: - m_remote_close_code = m_processor->get_close_code(); - m_remote_close_reason = m_processor->get_close_reason(); - - // check that the codes we got over the wire are - // valid - - if (close::status::invalid(m_remote_close_code)) { - throw session::exception("Invalid close code",session::error::PROTOCOL_VIOLATION); - } - - if (close::status::reserved(m_remote_close_code)) { - throw session::exception("Reserved close code",session::error::PROTOCOL_VIOLATION); - } - - if (m_state == session::state::OPEN) { - // other end is initiating - m_server->elog().at(log::elevel::DEVEL) - << "sending close ack" << log::endl; - - send_close_ack(); - } else if (m_state == session::state::CLOSING) { - // ack of our close - m_server->elog().at(log::elevel::DEVEL) - << "got close ack" << log::endl; - - terminate_connection(false); - // TODO: start terminate timer (if client) - } - break; - default: - throw session::exception("Invalid Opcode",session::error::PROTOCOL_VIOLATION); - break; - } - m_processor->reset(); - } - } catch (const session::exception& e) { - m_server->elog().at(log::elevel::ERROR) - << "Caught session exception: " << e.what() << log::endl; - - // if the exception happened while processing. - // TODO: this is not elegant, perhaps separate frame read vs process - // exceptions need to be used. - if (m_processor->ready()) { - m_processor->reset(); - } - - if (e.code() == session::error::PROTOCOL_VIOLATION) { - send_close(close::status::PROTOCOL_ERROR, e.what()); - } else if (e.code() == session::error::PAYLOAD_VIOLATION) { - send_close(close::status::INVALID_PAYLOAD, e.what()); - } else if (e.code() == session::error::INTERNAL_SERVER_ERROR) { - send_close(close::status::POLICY_VIOLATION, e.what()); - } else if (e.code() == session::error::SOFT_ERROR) { - // ignore and continue processing frames - continue; - } else { - // Fatal error, forcibly end connection immediately. - m_server->elog().at(log::elevel::DEVEL) - << "Dropping TCP due to unrecoverable exception" - << log::endl; - terminate_connection(true); - } - break; - } - } - - // try and read more - if (m_state != session::state::CLOSED && - m_processor->get_bytes_needed() > 0) { - // TODO: read timeout timer? - - boost::asio::async_read( - security_policy_type::socket(), - m_buf, - boost::asio::transfer_at_least(m_processor->get_bytes_needed()), - boost::bind( - &connection_type::handle_read_frame, - connection_type::shared_from_this(), - boost::asio::placeholders::error - ) - ); - } - } - - void send_close(close::status::value code, const std::string& reason) { - if (m_state != session::state::OPEN) { - m_server->elog().at(log::elevel::WARN) - << "Tried to disconnect a session that wasn't open" << log::endl; - return; - } - - if (close::status::invalid(code)) { - m_server->elog().at(log::elevel::WARN) - << "Tried to close a connection with invalid close code: " << code << log::endl; - return; - } else if (close::status::reserved(code)) { - m_server->elog().at(log::elevel::WARN) - << "Tried to close a connection with reserved close code: " << code << log::endl; - return; - } - - m_state = session::state::CLOSING; - - m_closed_by_me = true; - - m_timer.expires_from_now(boost::posix_time::milliseconds(1000)); - m_timer.async_wait( - boost::bind( - &connection_type::fail_on_expire, - connection_type::shared_from_this(), - boost::asio::placeholders::error - ) - ); - - m_local_close_code = code; - m_local_close_reason = reason; - - - write_message(m_processor->prepare_close_frame(m_local_close_code, - false, - m_local_close_reason)); - m_write_state = write_state::INTURRUPT; - } - - // send an acknowledgement close frame - void send_close_ack() { - // TODO: state should be OPEN - - // echo close value unless there is a good reason not to. - if (m_remote_close_code == close::status::NO_STATUS) { - m_local_close_code = close::status::NORMAL; - m_local_close_reason = ""; - } else if (m_remote_close_code == close::status::ABNORMAL_CLOSE) { - // TODO: can we possibly get here? This means send_close_ack was - // called after a connection ended without getting a close - // frame - throw "shouldn't be here"; - } else if (close::status::invalid(m_remote_close_code)) { - m_local_close_code = close::status::PROTOCOL_ERROR; - m_local_close_reason = "Status code is invalid"; - } else if (close::status::reserved(m_remote_close_code)) { - m_local_close_code = close::status::PROTOCOL_ERROR; - m_local_close_reason = "Status code is reserved"; - } else { - m_local_close_code = m_remote_close_code; - m_local_close_reason = m_remote_close_reason; - } - - // TODO: check whether we should cancel the current in flight write. - // if not canceled the close message will be sent as soon as the - // current write completes. - - - write_message(m_processor->prepare_close_frame(m_local_close_code, - false, - m_local_close_reason)); - m_write_state = write_state::INTURRUPT; - } - - void write_message(binary_string_ptr msg) { - m_write_buffer += msg->size(); - m_write_queue.push(msg); - write(); - } - - void write() { - switch (m_write_state) { - case write_state::IDLE: - break; - case write_state::WRITING: - // already writing. write() will get called again by the write - // handler once it is ready. - return; - case write_state::INTURRUPT: - // clear the queue except for the last message - while (m_write_queue.size() > 1) { - m_write_buffer -= m_write_queue.front()->size(); - m_write_queue.pop(); - } - break; - default: - // TODO: assert shouldn't be here - break; - } - - if (m_write_queue.size() > 0) { - if (m_write_state == write_state::IDLE) { - m_write_state = write_state::WRITING; - } - - boost::asio::async_write( - security_policy_type::socket(), - boost::asio::buffer(*m_write_queue.front()), - boost::bind( - &connection_type::handle_write, - connection_type::shared_from_this(), - boost::asio::placeholders::error - ) - ); - } else { - // if we are in an inturrupted state and had nothing else to write - // it is safe to terminate the connection. - if (m_write_state == write_state::INTURRUPT) { - terminate_connection(false); - } - } - } - - void handle_write(const boost::system::error_code& error) { - if (error) { - if (error == boost::asio::error::operation_aborted) { - // previous write was aborted - std::cout << "aborted" << std::endl; - } else { - log_error("Error writing frame data",error); - terminate_connection(false); - return; - } - } - - if (m_write_queue.size() == 0) { - std::cout << "handle_write called with empty queue" << std::endl; - return; - } - - m_write_buffer -= m_write_queue.front()->size(); - m_write_queue.pop(); - - if (m_write_state == write_state::WRITING) { - m_write_state = write_state::IDLE; - } - - write(); - } - - // end conditions - // - tcp connection is closed - // - session state is CLOSED - // - session end flags are set - // - application is notified - void terminate_connection(bool failed_by_me) { - m_server->alog().at(log::alevel::DEBUG_CLOSE) << "terminate called" << log::endl; - - if (m_state == session::state::CLOSED) { - // shouldn't be here - } - - // cancel the close timeout - m_timer.cancel(); - - try { - if (security_policy_type::socket().is_open()) { - security_policy_type::socket().shutdown(tcp::socket::shutdown_both); - security_policy_type::socket().close(); - m_dropped_by_me = true; - } - } catch (boost::system::system_error& e) { - if (e.code() == boost::asio::error::not_connected) { - // this means the socket was disconnected by the other side before - // we had a chance to. Ignore and continue. - } else { - throw e; - } - } - - m_failed_by_me = failed_by_me; - - session::state::value old_state = m_state; - m_state = session::state::CLOSED; - - // If we called terminate from the connecting state call on_fail - if (old_state == session::state::CONNECTING) { - m_handler->on_fail(boost::static_pointer_cast(connection_type::shared_from_this())); - } else if (old_state == session::state::OPEN || - old_state == session::state::CLOSING) { - m_handler->on_close(boost::static_pointer_cast(connection_type::shared_from_this())); - } else { - // if we were already closed something is wrong - } - } - - // this is called when an async asio call encounters an error - void log_error(std::string msg,const boost::system::error_code& e) { - m_server->elog().at(log::elevel::ERROR) - << msg << "(" << e << ")" << log::endl; - } - void log_close_result() { - m_server->alog().at(log::alevel::DISCONNECT) - //<< "Disconnect " << (m_was_clean ? "Clean" : "Unclean") - << "Disconnect " - << " close local:[" << m_local_close_code - << (m_local_close_reason == "" ? "" : ","+m_local_close_reason) - << "] remote:[" << m_remote_close_code - << (m_remote_close_reason == "" ? "" : ","+m_remote_close_reason) << "]" - << log::endl; - } - void log_open_result() { - m_server->alog().at(log::alevel::CONNECT) << "Connection " - << security_policy_type::socket().remote_endpoint() << " v" << m_version << " " - << (get_request_header("User-Agent") == "" ? "NULL" : get_request_header("User-Agent")) - << " " << m_uri.resource << " " << m_response.status_code() - << log::endl; - } - - void fail_on_expire(const boost::system::error_code& error) { - if (error) { - if (error != boost::asio::error::operation_aborted) { - m_server->elog().at(log::elevel::DEVEL) - << "fail_on_expire timer ended in unknown error" << log::endl; - terminate_connection(false); - } - return; - } - m_server->elog().at(log::elevel::DEVEL) - << "fail_on_expire timer expired" << log::endl; - terminate_connection(true); - } - -private: - server_ptr m_server; - - boost::asio::io_service& m_io_service; - //tcp::socket m_socket; - boost::asio::deadline_timer m_timer; - boost::asio::streambuf m_buf; - - server_handler_ptr m_handler; - processor_ptr m_processor; - blank_rng m_rng; - - // Connection state - http::parser::request m_request; - http::parser::response m_response; - - std::vector m_requested_subprotocols; - std::vector m_requested_extensions; - std::string m_subprotocol; - std::vector m_extensions; - std::string m_origin; - unsigned int m_version; - bool m_secure; - ws_uri m_uri; - - session::state::value m_state; - - // Write queue - std::queue m_write_queue; - uint64_t m_write_buffer; - write_state::value m_write_state; - - // Close state - close::status::value m_local_close_code; - std::string m_local_close_reason; - close::status::value m_remote_close_code; - std::string m_remote_close_reason; - bool m_closed_by_me; - bool m_failed_by_me; - bool m_dropped_by_me; -}; - -class server_connection_policy { - -}; - -class server_role { - typedef websocketpp::session::server connection_interface; - typedef websocketpp::server::server_connection_policy connection_policy; -}; - -// ******* SSL SECURITY POLICY ******* -//typedef boost::asio::ssl::stream ssl_socket; - -/*class connection_ssl { -public: - ssl_socket::lowest_layer_type& socket() { - return m_socket.lowest_layer(); - } - - void handshake() { - m_socket.async_handshake( - boost::asio::ssl::stream_base::server, - boost::bind( - &connection_ssl::handle_handshake, - shared_from_this(), - boost::asio::placeholders::error - ) - ); - } - - void handle_handshake() { - read_request(); - } - -private: - ssl_socket m_socket; -}; - -class endpoint_ssl { -public: - typedef websocketpp::server::connection_ssl connection_policy; - -private: - boost::asio::ssl::context m_context; -};*/ -// ******* END SSL SECURITY POLICY ******* - -// ******* PLAIN SECURITY POLICY ******* -template -class connection_plain { -public: - connection_plain(boost::asio::io_service& io_service) : m_socket(io_service) {} - - boost::asio::ip::tcp::socket& socket() { - return m_socket; - } - - void handshake() { - connection_type::read_request(); - } -private: - boost::asio::ip::tcp::socket m_socket; -}; - -template -class endpoint_plain { -protected: - // base security class for connections that plain endpoints create - template - class connection_security_policy { - public: - connection_security_policy(boost::asio::io_service& io_service) : m_socket(io_service) {} - - typedef connection_security_policy foo; - - boost::asio::ip::tcp::socket& socket() { - return m_socket; - } - - void handshake(boost::shared_ptr foo) { - //connection_type::read_request(); - //static_cast(this)->read_request(); - foo->read_request(); - - //boost::static_pointer_cast(foo::shared_from_this()) - - //m_handler->on_close(boost::static_pointer_cast(connection_type::shared_from_this())); - } - private: - boost::asio::ip::tcp::socket m_socket; - }; - -}; -// ******* END PLAIN SECURITY POLICY ******* - -// TODO: potential policies: -// - http parser -template - < - template class security_policy, - template class logger_type = log::logger - > -class endpoint - : - public security_policy< endpoint >, - public boost::enable_shared_from_this< endpoint > { -public: - typedef endpoint endpoint_type; - typedef security_policy< endpoint > security_type; - - typedef logger_type alog_type; - typedef logger_type elog_type; - - using security_type::connection_security_policy; - - typedef connection connection_type; - - typedef boost::shared_ptr ptr; - //typedef websocketpp::session::server_ptr session_ptr; - typedef boost::shared_ptr connection_ptr; - - endpoint(uint16_t port, server_handler_ptr handler) - : m_endpoint(tcp::v6(),port), - m_acceptor(m_io_service,m_endpoint), - m_handler(handler), - m_max_message_size(DEFAULT_MAX_MESSAGE_SIZE), - 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 run() { - start_accept(); - m_io_service.run(); - } - - - - // INTERFACE FOR LOCAL APPLICATIONS - void set_max_message_size(uint64_t val) { - if (val > frame::limits::PAYLOAD_SIZE_JUMBO) { - // TODO: Figure out what the ideal error behavior for this method. - // Options: - // Throw exception - // Log error and set value to maximum allowed - // Log error and leave value at whatever it was before - elog().at(log::elevel::WARN) << "Invalid maximum message size: " - << val << log::endl; - //throw server_error(err.str()); - } - m_max_message_size = val; - } - - void parse_command_line(int ac, char* av[]) { - po::store(po::parse_command_line(ac,av, m_desc),m_vm); - po::notify(m_vm); - - if (m_vm.count("help") ) { - std::cout << m_desc << std::endl; - } - - //m_vm["host"].as(); - - // TODO: template "as" weirdness - // const std::vector< std::string > &foo = m_vm["host"].as< std::vector >(); - - const std::vector< std::string > &foo = m_vm["host"].template as< std::vector >(); - - for (int i = 0; i < foo.size(); i++) { - std::cout << foo[i] << std::endl; - } - - //std::cout << m_vm["host"].as< std::vector >() << std::endl; - } - - // INTERFACE FOR SESSIONS - - static const bool is_server = true; - - /*rng_policy& get_rng() { - return m_rng; - }*/ - - // Confirms that the port in the host string matches the port we are listening - // on. End user application is responsible for checking the /host/ part. - bool validate_host(std::string host) { - // find colon. - // if no colon assume default port - - // if port == port - // return true - // else - // return false - - // TODO: just check the port. Otherwise user is responsible for checking this - - return true; - } - - // Check if message size is within server's acceptable parameters - bool validate_message_size(uint64_t val) { - if (val > m_max_message_size) { - return false; - } - return true; - } - - logger_type& alog() { - return m_alog; - } - - logger_type& elog() { - return m_elog; - } - -private: - // creates a new session object and connects the next websocket - // connection to it. - void start_accept() { - // TODO: sanity check whether the session buffer size bound could be reduced - connection_ptr new_session( - new connection_type( - endpoint_type::shared_from_this(), - m_io_service, - m_handler - ) - ); - - m_acceptor.async_accept( - new_session->socket(), - boost::bind( - &endpoint_type::handle_accept, - endpoint_type::shared_from_this(), - new_session, - boost::asio::placeholders::error - ) - ); - } - - // if no errors starts the session's read loop and returns to the - // start_accept phase. - void handle_accept(connection_ptr connection,const boost::system::error_code& error) - { - if (!error) { - connection->handshake(connection); - - // TODO: add session to local session vector - } else { - std::stringstream err; - err << "Error accepting socket connection: " << error; - - elog().at(log::elevel::ERROR) << err.str() << log::endl; - throw server_error(err.str()); - } - - this->start_accept(); - } - -private: - boost::asio::io_service m_io_service; - tcp::endpoint m_endpoint; - tcp::acceptor m_acceptor; - - server_handler_ptr m_handler; - - logger_type m_alog; - logger_type m_elog; - - std::vector m_connections; - - uint64_t m_max_message_size; - - po::options_description m_desc; - po::variables_map m_vm; -}; - -} - -// convenience type interface - -// websocketpp::server_ptr represents a basic non-secure websocket server -typedef server::endpoint basic_server; -typedef basic_server::ptr basic_server_ptr; - -// websocketpp::secure_server_ptr represents a basic secure websocket server -// TODO: -//typedef server::server<> secure_server; -//typedef secure_server::ptr secure_server_ptr; - -} - -#endif // WEBSOCKET_SERVER_HPP diff --git a/src/legacy/websocket_server_session.cpp b/src/legacy/websocket_server_session.cpp deleted file mode 100644 index d8f0aa6c38..0000000000 --- a/src/legacy/websocket_server_session.cpp +++ /dev/null @@ -1,362 +0,0 @@ -/* - * 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. - * - */ - -#include "websocketpp.hpp" -#include "websocket_server_session.hpp" - -#include "websocket_frame.hpp" -#include "utf8_validator/utf8_validator.hpp" - -#include -#include -#include - - -#include -#include -#include -#include - -using websocketpp::server_session; - -server_session::server_session(websocketpp::server_ptr s, - boost::asio::io_service& io_service, - websocketpp::connection_handler_ptr defc, - uint64_t buf_size) - : session(io_service,defc,buf_size),m_server(s) {} - -void server_session::on_connect() { - read_handshake(); -} - - -void server_session::set_header(const std::string &key,const std::string &val) { - // TODO: prevent use of reserved headers; - m_server_headers[key] = val; -} - -void server_session::select_subprotocol(const std::string& val) { - std::vector::iterator it; - - it = std::find(m_client_subprotocols.begin(), - m_client_subprotocols.end(), - val); - - if (val != "" && it == m_client_subprotocols.end()) { - throw server_error("Attempted to choose a subprotocol not proposed by the client"); - } - - m_server_subprotocol = val; -} - -void server_session::select_extension(const std::string& val) { - if (val == "") { - return; - } - - std::vector::iterator it; - - it = std::find(m_client_extensions.begin(), - m_client_extensions.end(), - val); - - if (it == m_client_extensions.end()) { - throw server_error("Attempted to choose an extension not proposed by the client"); - } - - m_server_extensions.push_back(val); -} - -void server_session::read_handshake() { - m_timer.expires_from_now(boost::posix_time::seconds(5)); - - m_timer.async_wait( - boost::bind( - &session::handle_handshake_expired, - shared_from_this(), - boost::asio::placeholders::error - ) - ); - - boost::asio::async_read_until( - m_socket, - m_buf, - "\r\n\r\n", - boost::bind( - &session::handle_read_handshake, - shared_from_this(), - boost::asio::placeholders::error, - boost::asio::placeholders::bytes_transferred - ) - ); -} - -void server_session::handle_read_handshake(const boost::system::error_code& e, - std::size_t bytes_transferred) { - std::ostringstream line; - line << &m_buf; - m_raw_client_handshake += line.str(); - - access_log(m_raw_client_handshake,ALOG_HANDSHAKE); - - std::vector tokens; - std::string::size_type start = 0; - std::string::size_type end; - - // Get request and parse headers - end = m_raw_client_handshake.find("\r\n",start); - - while(end != std::string::npos) { - tokens.push_back(m_raw_client_handshake.substr(start, end - start)); - - start = end + 2; - - end = m_raw_client_handshake.find("\r\n",start); - } - - for (size_t i = 0; i < tokens.size(); i++) { - if (i == 0) { - m_client_http_request = tokens[i]; - } - - end = tokens[i].find(": ",0); - - if (end != std::string::npos) { - std::string h = tokens[i].substr(0,end); - - if (get_client_header(h) == "") { - m_client_headers[h] = tokens[i].substr(end+2); - } else { - m_client_headers[h] += ", " + tokens[i].substr(end+2); - } - } - } - - // handshake error checking - try { - std::stringstream err; - std::string h; - - // check the method - if (m_client_http_request.substr(0,4) != "GET ") { - err << "Websocket handshake has invalid method: " - << m_client_http_request.substr(0,4); - - throw(handshake_error(err.str(),400)); - } - - // check the HTTP version - // TODO: allow versions greater than 1.1 - end = m_client_http_request.find(" HTTP/1.1",4); - if (end == std::string::npos) { - err << "Websocket handshake has invalid HTTP version"; - throw(handshake_error(err.str(),400)); - } - - m_resource = m_client_http_request.substr(4,end-4); - - // verify the presence of required headers - h = get_client_header("Host"); - if (h == "") { - throw(handshake_error("Required Host header is missing",400)); - } else if (!m_server->validate_host(h)) { - err << "Host " << h << " is not one of this server's names."; - throw(handshake_error(err.str(),400)); - } - - h = get_client_header("Upgrade"); - if (h == "") { - throw(handshake_error("Required Upgrade header is missing",400)); - } else if (!boost::iequals(h,"websocket")) { - err << "Upgrade header was " << h << " instead of \"websocket\""; - throw(handshake_error(err.str(),400)); - } - - h = get_client_header("Connection"); - if (h == "") { - throw(handshake_error("Required Connection header is missing",400)); - } else if (!boost::ifind_first(h,"upgrade")) { - err << "Connection header, \"" << h - << "\", does not contain required token \"upgrade\""; - throw(handshake_error(err.str(),400)); - } - - if (get_client_header("Sec-WebSocket-Key") == "") { - throw(handshake_error("Required Sec-WebSocket-Key header is missing",400)); - } - - h = get_client_header("Sec-WebSocket-Version"); - if (h == "") { - throw(handshake_error("Required Sec-WebSocket-Version header is missing",400)); - } else { - m_version = atoi(h.c_str()); - - if (m_version != 7 && m_version != 8 && m_version != 13) { - err << "This server doesn't support WebSocket protocol version " - << m_version; - throw(handshake_error(err.str(),400)); - } - } - - if (m_version < 13) { - h = get_client_header("Sec-WebSocket-Origin"); - } else { - h = get_client_header("Origin"); - } - - if (h != "") { - m_client_origin = h; - } - - // TODO: extract subprotocols - // TODO: extract extensions - - // optional headers (delegated to the local interface) - if (m_local_interface) { - m_local_interface->validate(shared_from_this()); - } - - m_server_http_code = 101; - m_server_http_string = "Switching Protocols"; - } catch (const handshake_error& e) { - std::stringstream err; - err << "Caught handshake exception: " << e.what(); - - access_log(e.what(),ALOG_HANDSHAKE); - log(err.str(),LOG_ERROR); - - m_server_http_code = e.m_http_error_code; - m_server_http_string = e.m_http_error_msg; - } - - write_handshake(); -} - -void server_session::write_handshake() { - std::stringstream h; - - - - if (m_server_http_code == 101) { - std::string server_key = get_client_header("Sec-WebSocket-Key"); - server_key += "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; - - SHA1 sha; - uint32_t message_digest[5]; - - sha.Reset(); - sha << server_key.c_str(); - - if (sha.Result(message_digest)){ - // convert sha1 hash bytes to network byte order because this sha1 - // library works on ints rather than bytes - for (int i = 0; i < 5; i++) { - message_digest[i] = htonl(message_digest[i]); - } - - server_key = base64_encode( - reinterpret_cast(message_digest),20); - - // set handshake accept headers - set_header("Sec-WebSocket-Accept",server_key); - set_header("Upgrade","websocket"); - set_header("Connection","Upgrade"); - } else { - log("Error computing handshake sha1 hash.",LOG_ERROR); - m_server_http_code = 500; - m_server_http_string = ""; - } - } - - // hardcoded server headers - set_header("Server","WebSocket++/2011-09-25"); - - h << "HTTP/1.1 " << m_server_http_code << " " - << (m_server_http_string != "" ? m_server_http_string : - lookup_http_error_string(m_server_http_code)) - << "\r\n"; - - header_list::iterator it; - for (it = m_server_headers.begin(); it != m_server_headers.end(); it++) { - h << it->first << ": " << it->second << "\r\n"; - } - - h << "\r\n"; - - m_raw_server_handshake = h.str(); - - // start async write to handle_write_handshake - boost::asio::async_write( - m_socket, - boost::asio::buffer(m_raw_server_handshake), - boost::bind( - &session::handle_write_handshake, - shared_from_this(), - boost::asio::placeholders::error - ) - ); -} - -void server_session::handle_write_handshake(const boost::system::error_code& error) { - if (error) { - log_error("Error writing handshake response",error); - drop_tcp(); - return; - } - - log_open_result(); - - if (m_server_http_code != 101) { - std::stringstream err; - err << "Handshake ended with HTTP error: " << m_server_http_code << " " - << (m_server_http_string != "" ? m_server_http_string : lookup_http_error_string(m_server_http_code)); - log(err.str(),LOG_ERROR); - drop_tcp(); - // TODO: tell client that connection failed. - return; - } - - m_state = STATE_OPEN; - - // stop the handshake timer - m_timer.cancel(); - - if (m_local_interface) { - m_local_interface->on_open(shared_from_this()); - } - - reset_message(); - this->read_frame(); -} - -void server_session::log(const std::string& msg, uint16_t level) const { - m_server->log(msg,level); -} - -void server_session::access_log(const std::string& msg, uint16_t level) const { - m_server->access_log(msg,level); -} diff --git a/src/legacy/websocket_server_session.hpp b/src/legacy/websocket_server_session.hpp deleted file mode 100644 index 538edaba72..0000000000 --- a/src/legacy/websocket_server_session.hpp +++ /dev/null @@ -1,118 +0,0 @@ -/* - * 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_SESSION_HPP -#define WEBSOCKET_SERVER_SESSION_HPP - -#include -#include - -#include -#include - -#if defined(WIN32) -#include -#else -#include -#endif - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace websocketpp { - class server_session; - typedef boost::shared_ptr server_session_ptr; -} - -#include "websocket_session.hpp" -#include "websocket_server.hpp" - -using boost::asio::ip::tcp; - -namespace websocketpp { - -class server_session : public session { -public: - server_session (server_ptr s, - boost::asio::io_service& io_service, - connection_handler_ptr defc, - uint64_t buf_size); - - /*** SERVER INTERFACE ***/ - - // This function is called when a connection to a new client has been - // established and the server is ready to read the client handshake. - void on_connect(); - - /*** HANDSHAKE INTERFACE ***/ - - // Set an HTTP header for the outgoing server handshake response. - void set_header(const std::string& key, const std::string& val); - - // Selects a subprotocol for the connection to use. val must be a value - // present in the client's opening handshake or the empty string for null. - void select_subprotocol(const std::string& val); - - // Selects an extension from the list offered by the client. Each extension - // selected must have been offered by the client. Extensions will be used - // in the order that they were selected here. - void select_extension(const std::string& val); - - /*** SESSION INTERFACE ***/ - // see session - virtual bool is_server() const { return true;} - - void log(const std::string& msg, uint16_t level) const; - void access_log(const std::string& msg, uint16_t level) const; -protected: - // Opening handshake processors and callbacks. These need to be defined in - virtual void write_handshake(); - virtual void handle_write_handshake(const boost::system::error_code& e); - virtual void read_handshake(); - virtual void handle_read_handshake(const boost::system::error_code& e, - std::size_t bytes_transferred); - - - -private: - -protected: - // connection resources - server_ptr m_server; -private: - -}; - -} - -#endif // WEBSOCKET_SERVER_SESSION_HPP diff --git a/src/legacy/websocket_session.cpp b/src/legacy/websocket_session.cpp deleted file mode 100644 index 65d401e974..0000000000 --- a/src/legacy/websocket_session.cpp +++ /dev/null @@ -1,26 +0,0 @@ -/* - * 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. - * - */ diff --git a/src/legacy/websocket_session.hpp b/src/legacy/websocket_session.hpp deleted file mode 100644 index 76c48bddf0..0000000000 --- a/src/legacy/websocket_session.hpp +++ /dev/null @@ -1,1451 +0,0 @@ -/* - * 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. - * - */ - -/* - - Exit path mapping - - In every path: - - If it is safe to close cleanly, close cleanly - - Write to the access log on clean close - - Write to the error log on unclean close and clean closes with a server error. - - If session state is open and a local client is connected, send on_close msg - - - make sure the following bits are properly set: - - - If we initiated the close by sending the first close frame or by dropping the TCP connection, set closed_by_me. If the other endpoint sent the first close method or we got an EOF while reading clear closed_by_me - - If we initiated the TCP connection drop set dropped_by_me. If we got EOF while reading clear dropped_by_me - - If we sent and received a close frame or we received and sent an acknowledgement close frame set was_clean to true. - - - If we are the server we should drop TCP immediately - - If we are the client we should drop TCP immediately except in the case where we just recieved an acknowledgement close frame. In this case wait a certain period of time for the server EOF. - - Questions: - - if the client rejects - - Paths: (+ indicates path has been checked and implimented) - Server Handshake Paths - - Accept connection, read handshake, handshake is valid, write handshake, no errors. This is the correct path and leads to the frame reading paths - - Accept connection, connection is not in state open after a time out (due to no bytes being read or no CRLFCRLF being read). This needs a time out after which we drop TCP. - - Accept connection, read handshake, handshake is invalid. write HTTP error. drop TCP - - Accept connection, read handshake, handshake is valid, write handshake returns EOF. This means client rejected something about our response. We should drop and notify our client. (note alternative client handshake reject method is to accept the handshake then immediately send a close message with the non-acceptance reason) - - Accept connection, read handshake, handshake is valid, write handshake returns another error. We should drop and notify our client. - Client Handshake Paths - - - Server Frame Reading Paths - - async read returns EOF. Close our own socket and notify our local interface. - - async read returns another error - - - - - Timeouts: - - handshake timeout - - wait for close frame after error - - (client) wait for server to drop tcp after close handshake - - idle client timeout? API specifiable? - - wait for pong? - - - - INTERFACES - - CLIENT ENDPOINT - - SERVER ENDPOINT - - CLIENT HANDLER - Valid for OPEN connections - - get_state() // CONNECTING, OPEN, CLOSING, CLOSED - - get_origin() - - get_request_header(const std::string&) - - get_version() - - get_uri() // includes secure, host, port, resource - - get_secure() - - - send(const std::string&) - - send(const std::vector&) - - close(status::code::value,const std::string&) - - ping(const std::string&) - - pong(const std::string&) - - - get_subprotocol() - - **** get extensions **** - - get_request_header(const std::string&) - - get_response_header(const std::string&) - - - Valid for CLOSED connections - - get_local_close_code() - - get_local_close_reason() - - get_remote_close_code() - - get_remote_close_reason() - - dropped_by_me? - - failed_by_me? - - closed_by_me? - - Callbacks that may be implimented - - on_message(const std::string&) - - on_message(const std::vector&) - - on_close - - on_fail? - - on_write_avaliable - - SERVER HANDLER - - Valid for CONNECTING connections - - **** get subprotocols **** - - **** get extensions **** - - set_request_header(const std::string&,const std::string&) - - select_subprotocol(const std::string&) - - select_extension(const std::string&) - - Valid during and after CONNECTING - - get_origin() - - get_request_header(const std::string&) - - get_version() - - get_uri() // includes secure, host, port, resource - - get_secure() - - get_state() // CONNECTING, OPEN, CLOSING, CLOSED - - Valid for OPEN connections - - send(const std::string&) - - send(const std::vector&) - - close(status::code::value,const std::string&) - - ping(const std::string&) - - pong(const std::string&) - - - get_subprotocol() - - **** get extensions **** - - get_response_header(const std::string&) - - Valid for CLOSED connections - - get_local_close_code() - - get_local_close_reason() - - get_remote_close_code() - - get_remote_close_reason() - - dropped_by_me? - - failed_by_me? - - closed_by_me? - - Callbacks that may be implimented - - validate - - on_message(const std::string&) - - on_message(const std::vector&) - - on_close - - on_fail? - - on_write_avaliable - - */ - -#ifndef WEBSOCKET_SESSION_HPP -#define WEBSOCKET_SESSION_HPP - -#include -#include -#include - -#include -#include - -#if defined(WIN32) -#include -#else -#include -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace websocketpp { - class handshake_error; -} - -#include "websocketpp.hpp" -#include "websocket_frame.hpp" -#include "websocket_server.hpp" // for server error? -#include "websocket_connection_handler.hpp" - -#include "base64/base64.h" -#include "sha1/sha1.h" -#include "utf8_validator/utf8_validator.hpp" - -#include "http/parser.hpp" -#include "logger/logger.hpp" - -using boost::asio::ip::tcp; - -namespace websocketpp { - -namespace state { - enum value { - CONNECTING = 0, - OPEN = 1, - CLOSING = 2, - CLOSED = 3 - }; -} - -// Exception classes - -class handshake_error : public std::exception { -public: - handshake_error(const std::string& msg, - http::status_code::value http_error, - const std::string& http_msg = "") - : m_msg(msg),m_http_error_code(http_error),m_http_error_msg(http_msg) {} - ~handshake_error() throw() {} - - virtual const char* what() const throw() { - return m_msg.c_str(); - } - - std::string m_msg; - http::status_code::value m_http_error_code; - std::string m_http_error_msg; -}; - -typedef std::map header_list; - -template -class session : public boost::enable_shared_from_this< session > { -public: - typedef endpoint_policy endpoint_type; - typedef session session_type; - typedef connection_handler connection_handler_type; - - typedef boost::shared_ptr endpoint_ptr; - typedef boost::shared_ptr ptr; - typedef boost::shared_ptr connection_handler_ptr; - - friend class handshake_error; - - session (endpoint_ptr e, - boost::asio::io_service& io_service, - connection_handler_ptr defc, - uint64_t buf_size) - : m_secure(false), - m_state(state::CONNECTING), - m_writing(false), - m_local_close_code(close::status::NO_STATUS), - m_remote_close_code(close::status::NO_STATUS), - m_was_clean(false), - m_closed_by_me(false), - m_dropped_by_me(false), - m_socket(io_service), - m_io_service(io_service), - m_endpoint(e), - m_local_interface(defc), - m_timer(io_service,boost::posix_time::seconds(0)), - m_buf(buf_size), // maximum buffered (unconsumed) bytes from network - m_utf8_state(utf8_validator::UTF8_ACCEPT), - m_utf8_codepoint(0), - m_read_frame(e->get_rng()), - m_write_frame(e->get_rng()) {} - - /*** ENDPOINT INTERFACE ***/ - tcp::socket& socket() { - return m_socket; - } - - boost::asio::io_service& io_service() { - return m_io_service; - } - - void set_uri(const ws_uri& uri) { - m_uri = uri; - } - - const ws_uri& get_uri() { - return m_uri; - } - - void set_origin(const std::string& val) { - // TODO: input validation - m_origin = val; - } - - // TODO: should these be one set? - void set_request_header(const std::string& key,const std::string& val) { - // TODO: input validation - m_request.set_header(key,val); - } - - void set_response_header(const std::string& key,const std::string& val) { - // TODO: input validation - m_response.set_header(key,val); - } - - // Adds a subprotocol to the list to propose to the remote endpoint - // TODO: this should not be callable by server handlers - void request_subprotocol(const std::string &val) { - // TODO: input validation - m_requested_subprotocols.push_back(val); - } - - // Adds an extension to the list to propose to the remote endpoint - // TODO: this should not be callable by server handlers - void request_extension(const std::string& val) { - // TODO: input validation - m_requested_extensions.push_back(val); - } - - // Selects a subprotocol from the requested list to use. - // TODO: this should only be callable by server handlers - void select_subprotocol(const std::string& val) { - std::vector::iterator it; - - it = std::find(m_requested_subprotocols.begin(), - m_requested_subprotocols.end(), - val); - - if (val != "" && it == m_requested_subprotocols.end()) { - throw server_error("Attempted to choose a subprotocol not proposed by the client"); - } - - m_subprotocol = val; - } - - // Selects an extension from the requested list to use. - // TODO: this should only be callable by server handlers - void select_extension(const std::string& val) { - if (val == "") { - return; - } - - std::vector::iterator it; - - it = std::find(m_requested_extensions.begin(), - m_requested_extensions.end(), - val); - - if (it == m_requested_extensions.end()) { - throw server_error("Attempted to choose an extension not proposed by the client"); - } - - m_extensions.push_back(val); - } - - /*** SERVER INTERFACE ***/ - - // sets the internal connection handler of this connection to new_con. - // This is useful if you want to switch handler objects during a connection - // Example: a generic lobby handler could validate the handshake negotiate a - // sub protocol to talk to and then pass the connection off to a handler for - // that sub protocol. - void set_handler(connection_handler_ptr new_con) { - if (m_local_interface) { - // TODO: this should be another method and not reusing onclose - //m_local_interface->disconnect(shared_from_this(),4000,"Setting new connection handler"); - } - m_local_interface = new_con; - m_local_interface->on_open(session_type::shared_from_this()); - } - - - /*** HANDSHAKE INTERFACE ***/ - // Set session connection information (avaliable only before/during the - // opening handshake) - - // Get session status (valid once the connection is open) - - // returns the subprotocol that was negotiated during the opening handshake - // or the empty string if no subprotocol was requested. - const std::string& get_subprotocol() const { - if (m_state == state::CONNECTING) { - m_endpoint->elog().at(log::elevel::LIBRARY) - << "Subprotocol is not avaliable before the handshake has completed" - << log::endl; - - // TODO: fix server_error - //throw server_error("Subprotocol is not avaliable before the handshake has completed."); - throw "Subprotocol is not avaliable before the handshake has completed"; - } - return m_subprotocol; - } - - const std::string& get_resource() const { - return m_uri.resource; - } - const std::string& get_origin() const { - return m_origin; - } - std::string get_request_header(const std::string& key) const { - return m_request.header(key); - } - std::string get_response_header(const std::string& key) const { - return m_response.header(key); - } - const std::vector& get_extensions() const { - return m_extensions; - } - unsigned int get_version() const { - return m_version; - } - - /*** SESSION INTERFACE ***/ - - // send basic frame types - void send(const std::string &msg) { - if (m_state != state::OPEN) { - m_endpoint->elog().at(log::elevel::WARN) - << "Tried to send a message from a session that wasn't open" - << log::endl; - - return; - } - m_write_frame.set_fin(true); - m_write_frame.set_opcode(frame::opcode::TEXT); - m_write_frame.set_payload(msg); - - write_frame(); - } - - void send(const std::vector &data) { - if (m_state != state::OPEN) { - m_endpoint->elog().at(log::elevel::WARN) - << "Tried to send a message from a session that wasn't open" - << log::endl; - return; - } - m_write_frame.set_fin(true); - m_write_frame.set_opcode(frame::opcode::BINARY); - m_write_frame.set_payload(data); - - write_frame(); - } - void ping(const std::string &msg) { - if (m_state != state::OPEN) { - m_endpoint->elog().at(log::elevel::WARN) - << "Tried to send a ping from a session that wasn't open" - << log::endl; - return; - } - m_write_frame.set_fin(true); - m_write_frame.set_opcode(frame::opcode::PING); - m_write_frame.set_payload(msg); - - write_frame(); - } - void pong(const std::string &msg) { - if (m_state != state::OPEN) { - m_endpoint->elog().at(log::elevel::WARN) - << "Tried to send a pong from a session that wasn't open" - << log::endl; - return; - } - m_write_frame.set_fin(true); - m_write_frame.set_opcode(frame::opcode::PONG); - m_write_frame.set_payload(msg); - - write_frame(); - } - - // initiate a connection close - void close(close::status::value status,const std::string &reason) { - validate_app_close_status(status); - send_close(status,reason); - } - - bool is_server() const { - return endpoint_type::is_server; - } - - // These two function series are called to begin the session loop. The first - // method and all that come after it are called as a result of an async - // event completing. if any method in this chain returns before adding a new - // async event the session will end. - - // ****** Read Handshake Thread *********************** - // read_request -> handle_read_request -> - // write_response > handle_write_response -> - // read frame - // **************************************************** - - // Initiates the read of an HTTP request - void read_request() { - m_timer.expires_from_now(boost::posix_time::seconds(5)); - - m_timer.async_wait( - boost::bind( - &session_type::handle_handshake_expired, - session_type::shared_from_this(), - boost::asio::placeholders::error - ) - ); - - boost::asio::async_read_until( - m_socket, - m_buf, - "\r\n\r\n", - boost::bind( - &session_type::handle_read_request, - session_type::shared_from_this(), - boost::asio::placeholders::error, - boost::asio::placeholders::bytes_transferred - ) - ); - } - - // Callback for reading an HTTP request - void handle_read_request(const boost::system::error_code& e, - std::size_t bytes_transferred) { - if (e) { - log_error("Error reading HTTP request",e); - drop_tcp(); - return; - } - - try { - std::istream request(&m_buf); - - // TODO: use a more generic consume api where we just call read_some - // and have the handshake consume and validate as we go. - // - // For now, because it simplifies things we will use the parse_header - // member function which requires the complete header to be passed in - // initially. ASIO can guarantee us this. - // - // - //m_remote_handshake.consume(response_stream); - if (!m_request.parse_complete(request)) { - // not a valid HTTP request/response - throw handshake_error("Recieved invalid HTTP Request",http::status_code::BAD_REQUEST); - } - - // Log the raw handshake. - m_endpoint->alog().at(log::alevel::DEBUG_HANDSHAKE) << m_request.raw() << log::endl; - - // confirm that this is a valid handshake / response for our endpoint type. - m_endpoint->validate_handshake(m_request); - - // set some connection state from the handshake - // The endpoint validation should have ensured that all of these values - // exist and are acceptable. - std::string h = m_request.header("Sec-WebSocket-Version"); - - m_version = (h == "" ? 0 : atoi(h.c_str())); - - h = (m_version < 13 ? "Sec-WebSocket-Origin" : "Origin"); - - m_origin = m_request.header(h); - - // TODO: how does a server know if it is secure or not? - // set m_uri based on client host header - // TODO: what if uri is a full uri? - m_uri.secure = false; - m_uri.host = "localhost"; - m_uri.port = 9002; - m_uri.resource = m_request.uri(); - - h = m_request.header("Sec-WebSocket-Version"); - - // TODO: the generic consume API will handle this better. - // if we have determined that this is trying to be a websocket - // connection for hybi-00 read the key after the HTTP request. - if (m_version == 0) { - char foo[9]; - foo[8] = 0; - - request.get(foo,9); - - if (request.gcount() != 8) { - - std::cout << "gcount: " << request.gcount() << " foo: " << foo << std::endl; - - throw handshake_error("Missing Key3",http::status_code::BAD_REQUEST); - } - - m_request.set_header("Sec-WebSocket-Key3",std::string(foo)); - } - - // TODO: extract subprotocols? - // TODO: extract extensions? - - // Check with the local interface to confirm that it wants to accept - // this connection. - if (m_local_interface) { - m_local_interface->validate(session_type::shared_from_this()); - } - - m_response.set_status(http::status_code::SWITCHING_PROTOCOLS); - } catch (const handshake_error& e) { - // TODO: add a hook here for passing the request to the local handler - // in case they can answer it instead of returning an error. - - m_endpoint->alog().at(log::alevel::DEBUG_HANDSHAKE) << e.what() << log::endl; - - m_endpoint->elog().at(log::elevel::ERROR) - << "Caught handshake exception: " << e.what() << log::endl; - - m_response.set_status(e.m_http_error_code,e.m_http_error_msg); - } - - write_response(); - } - - // write the response to the client's request. - void write_response() { - std::stringstream h; - - m_response.set_version("HTTP/1.1"); - - char digest[17]; - - if (m_response.status_code() == http::status_code::SWITCHING_PROTOCOLS) { - if (m_version == 0) { - char key_final[16]; - - // key1 - *reinterpret_cast(&key_final[0]) = decode_hybi_00_client_key( - m_request.header("Sec-WebSocket-Key2")); - - // key2 - *reinterpret_cast(&key_final[4]) = decode_hybi_00_client_key( - m_request.header("Sec-WebSocket-Key2")); - - // key3 - memcpy(&key_final[8], - m_request.header("Sec-WebSocket-Key3").c_str(), - 8); - - // md5 - md5_hash_string(key_final,digest); - digest[16] = 0; - - m_response.set_header("Upgrade","websocket"); - m_response.set_header("Connection","Upgrade"); - - // Echo back client's origin unless our local application set a - // more restrictive one. - if (m_response.header("Sec-WebSocket-Origin") == "") { - m_response.set_header("Sec-WebSocket-Origin",m_request.header("Origin")); - } - - // Echo back the client's request host unless our local application - // set a different one. - if (m_response.header("Sec-WebSocket-Location") == "") { - m_response.set_header("Sec-WebSocket-Location",m_uri.base()); - } - } else { - std::string server_key = m_request.header("Sec-WebSocket-Key"); - server_key += "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; - - SHA1 sha; - uint32_t message_digest[5]; - - sha.Reset(); - sha << server_key.c_str(); - - if (sha.Result(message_digest)){ - // convert sha1 hash bytes to network byte order because this sha1 - // library works on ints rather than bytes - for (int i = 0; i < 5; i++) { - message_digest[i] = htonl(message_digest[i]); - } - - server_key = base64_encode( - reinterpret_cast(message_digest),20 - ); - - // set handshake accept headers - m_response.replace_header("Sec-WebSocket-Accept",server_key); - m_response.set_header("Upgrade","websocket"); - m_response.set_header("Connection","Upgrade"); - } else { - m_endpoint->elog().at(log::elevel::ERROR) - << "Error computing handshake sha1 hash" << log::endl; - - m_response.set_status(http::status_code::INTERNAL_SERVER_ERROR); - } - } - } - - if (m_subprotocol != "") { - m_response.replace_header("Sec-WebSocket-Protocol",m_subprotocol); - } - - // TODO: return negotiated extensions - - // hardcoded server headers - // TODO: make this configurable - m_response.replace_header("Server","WebSocket++/2011-10-31"); - - m_endpoint->alog().at(log::alevel::DEBUG_HANDSHAKE) - << m_response.raw() << log::endl; - - std::string raw = m_response.raw(); - - if (m_version == 0) { - raw += digest; - } - - // start async write to handle_write_handshake - boost::asio::async_write( - m_socket, - boost::asio::buffer(raw), - boost::bind( - &session_type::handle_write_response, - session_type::shared_from_this(), - boost::asio::placeholders::error - ) - ); - } - - // - void handle_write_response(const boost::system::error_code& error) { - if (error) { - log_error("Error writing handshake response",error); - drop_tcp(); - return; - } - - log_open_result(); - - if (m_response.status_code() != http::status_code::SWITCHING_PROTOCOLS) { - m_endpoint->elog().at(log::elevel::ERROR) - << "Handshake ended with HTTP error: " - << m_response.status_code() << " " << m_response.status_msg() - << log::endl; - - drop_tcp(); - // TODO: tell client that connection failed? - // use on_fail? - return; - } - - m_state = state::OPEN; - - // stop the handshake timer - m_timer.cancel(); - - if (m_local_interface) { - m_local_interface->on_open(session_type::shared_from_this()); - } - - reset_message(); - this->read_frame(); - } - - // ****** Write Handshake Thread ********************** - // write_request -> handle_write_request -> - // read_response > handle_read_response -> - // read frame - // **************************************************** - - void write_request() { - m_request.set_method("GET"); - m_request.set_uri(m_uri.resource); - m_request.set_version("HTTP/1.1"); - - // Set request headers - m_request.set_header("Upgrade","websocket"); - m_request.set_header("Connection","Upgrade"); - m_request.replace_header("Sec-WebSocket-Version","13"); - m_version = 13; - - std::stringstream host; - if (m_uri.port == (m_secure ? 443 : 80)) { - host << m_uri.host; - } else { - host << m_uri.host << ":" << m_uri.port; - } - m_request.replace_header("Host",host.str()); - - if (m_origin != "") { - m_request.replace_header("Origin",m_origin); - } - - std::string client_key; - int32_t raw_key[4]; - - for (int i = 0; i < 4; i++) { - raw_key[i] = m_endpoint->get_rng().gen(); - } - - client_key = base64_encode(reinterpret_cast(raw_key), 16); - - m_endpoint->alog().at(log::alevel::DEBUG_HANDSHAKE) - << "Client key chosen: " << client_key << log::endl; - - m_request.replace_header("Sec-WebSocket-Key",client_key); - m_request.replace_header("User Agent","WebSocket++/2011-10-31"); - - // start async write to write the request - boost::asio::async_write( - m_socket, - boost::asio::buffer(m_request.raw()), - boost::bind( - &session_type::handle_write_request, - session_type::shared_from_this(), - boost::asio::placeholders::error - ) - ); - } - - void handle_write_request(const boost::system::error_code& error) { - if (error) { - log_error("Error writing HTTP request",error); - drop_tcp(); - return; - } - - read_response(); - } - - void read_response() { - boost::asio::async_read_until( - m_socket, - m_buf, - "\r\n\r\n", - boost::bind( - &session_type::handle_read_response, - session_type::shared_from_this(), - boost::asio::placeholders::error, - boost::asio::placeholders::bytes_transferred - ) - ); - } - - void handle_read_response(const boost::system::error_code& e,std::size_t bytes_transferred) { - - } - - void read_frame() { - // the initial read in the handshake may have read in the first frame. - // handle it (if it exists) before we read anything else. - handle_read_frame(boost::system::error_code()); - } - // handle_read_frame reads and processes all socket read commands for the - // session by consuming the read buffer and then starting an async read with - // itself as the callback. The connection is over when this method returns. - void handle_read_frame (const boost::system::error_code& error) { - if (m_state != state::OPEN && m_state != state::CLOSING) { - m_endpoint->elog().at(log::elevel::ERROR) - << "handle_read_frame called in invalid state" << log::endl; - return; - } - - if (error) { - if (error == boost::asio::error::eof) { - // if this is a case where we are expecting eof, return, else log & drop - - log_error("Recieved EOF",error); - //drop_tcp(false); - //m_state = STATE_CLOSED; - } else if (error == boost::asio::error::operation_aborted) { - // some other part of our client called shutdown on our socket. - // This is usually due to a write error. Everything should have - // already been logged and dropped so we just return here - return; - } else { - log_error("Error reading frame",error); - //drop_tcp(false); - m_state = state::CLOSED; - } - } - - std::istream s(&m_buf); - - while (m_buf.size() > 0 && m_state != state::CLOSED) { - try { - if (m_read_frame.get_bytes_needed() == 0) { - throw frame::exception("have bytes that no frame needs",frame::error::FATAL_SESSION_ERROR); - } - - // Consume will read bytes from s - // will throw a frame_error on error. - - - //err << "consuming. have: " << m_buf.size() << " bytes. Need: " << m_read_frame.get_bytes_needed() << " state: " << (int)m_read_frame.get_state(); - //log(err.str(),LOG_DEBUG); - m_read_frame.consume(s); - - //err.str(""); - //err << "consume complete, " << m_buf.size() << " bytes left, " << m_read_frame.get_bytes_needed() << " still needed, state: " << (int)m_read_frame.get_state(); - //log(err.str(),LOG_DEBUG); - - if (m_read_frame.ready()) { - // process frame and reset frame state for the next frame. - // will throw a frame_error on error. May set m_state to CLOSED, - // if so no more frames should be processed. - m_endpoint->elog().at(log::elevel::DEVEL) - << "processing frame " << m_buf.size() << log::endl; - - m_timer.cancel(); - process_frame(); - } - } catch (const frame::exception& e) { - m_endpoint->elog().at(log::elevel::ERROR) - << "Caught frame exception: " << e.what() << log::endl; - - // if the exception happened while processing. - // TODO: this is not elegant, perhaps separate frame read vs process - // exceptions need to be used. - if (m_read_frame.ready()) { - m_read_frame.reset(); - } - - // process different types of frame errors - // - if (e.code() == frame::error::PROTOCOL_VIOLATION) { - send_close(close::status::PROTOCOL_ERROR, e.what()); - } else if (e.code() == frame::error::PAYLOAD_VIOLATION) { - send_close(close::status::INVALID_PAYLOAD, e.what()); - } else if (e.code() == frame::error::INTERNAL_SERVER_ERROR) { - send_close(close::status::ABNORMAL_CLOSE, e.what()); - } else if (e.code() == frame::error::SOFT_SESSION_ERROR) { - // ignore and continue processing frames - continue; - } else { - // Fatal error, forcibly end connection immediately. - m_endpoint->elog().at(log::elevel::DEVEL) - << "Dropping TCP due to unrecoverable exception" - << log::endl; - drop_tcp(true); - } - - break; - } - } - - if (error == boost::asio::error::eof) { - m_state = state::CLOSED; - } - - // we have read everything, check if we should read more - - if ((m_state == state::OPEN || m_state == state::CLOSING) && m_read_frame.get_bytes_needed() > 0) { - m_endpoint->elog().at(log::elevel::DEVEL) - << "Starting async read for " << m_read_frame.get_bytes_needed() - << " bytes" << log::endl; - - - // TODO: set a timer here in case we don't want to read forever. - // Ex: when the frame is in a degraded state. - - boost::asio::async_read( - m_socket, - m_buf, - boost::asio::transfer_at_least(m_read_frame.get_bytes_needed()), - boost::bind( - &session::handle_read_frame, - session::shared_from_this(), - boost::asio::placeholders::error - ) - ); - } else if (m_state == state::CLOSED) { - log_close_result(); - - if (m_local_interface) { - // TODO: make sure close code/msg are properly set. - m_local_interface->on_close(session_type::shared_from_this()); - } - - m_timer.cancel(); - } else { - m_endpoint->elog().at(log::elevel::ERROR) - << "handle_read_frame ended in an invalid state" << log::endl; - } - } - - // write m_write_frame out to the socket. - void write_frame() { - if (!is_server()) { - m_write_frame.set_masked(true); // client must mask frames - } - - m_write_frame.process_payload(); - - std::vector data; - - data.push_back( - boost::asio::buffer( - m_write_frame.get_header(), - m_write_frame.get_header_len() - ) - ); - data.push_back( - boost::asio::buffer(m_write_frame.get_payload()) - ); - - m_endpoint->elog().at(log::elevel::DEVEL) - << "Write Frame: " << m_write_frame.print_frame() << log::endl; - - m_writing = true; - - boost::asio::async_write( - m_socket, - data, - boost::bind( - &session::handle_write_frame, - session::shared_from_this(), - boost::asio::placeholders::error - ) - ); - - } - void handle_write_frame (const boost::system::error_code& error) { - if (error) { - log_error("Error writing frame data",error); - drop_tcp(false); - } - - m_writing = false; - } - - void handle_timer_expired(const boost::system::error_code& error) { - if (error) { - if (error == boost::asio::error::operation_aborted) { - m_endpoint->elog().at(log::elevel::DEVEL) - << "timer was aborted" << log::endl; - } else { - m_endpoint->elog().at(log::elevel::DEVEL) - << "timer ended with error" << log::endl; - } - return; - } - - m_endpoint->elog().at(log::elevel::DEVEL) - << "timer ended without error" << log::endl; - } - void handle_handshake_expired(const boost::system::error_code& error) { - if (error) { - if (error != boost::asio::error::operation_aborted) { - m_endpoint->elog().at(log::elevel::DEVEL) - << "unexpected handshake timer error" << log::endl; - drop_tcp(true); - } - return; - } - - m_endpoint->elog().at(log::elevel::DEVEL) - << "Handshake timed out" << log::endl; - drop_tcp(true); - } - void handle_close_expired(const boost::system::error_code& error) { - if (error) { - if (error == boost::asio::error::operation_aborted) { - m_endpoint->elog().at(log::elevel::DEVEL) - << "timer was aborted" << log::endl; - } else { - m_endpoint->elog().at(log::elevel::DEVEL) - << "Unexpected close timer error" << log::endl; - drop_tcp(false); - } - return; - } - - if (m_state != state::CLOSED) { - m_endpoint->elog().at(log::elevel::DEVEL) - << "close timed out" << log::endl; - drop_tcp(false); - } - } - // The error timer is set when we want to give the other endpoint some time to - // do something but don't want to wait forever. There is a special error code - // that represents the timer being canceled by us (because the other endpoint - // responded in time. All other cases should assume that the other endpoint is - // irrepairibly broken and drop the TCP connection. - void handle_error_timer_expired (const boost::system::error_code& error) { - if (error) { - if (error == boost::asio::error::operation_aborted) { - m_endpoint->elog().at(log::elevel::DEVEL) - << "error timer was aborted" << log::endl; - } else { - m_endpoint->elog().at(log::elevel::DEVEL) - << "error timer ended with error" << log::endl; - drop_tcp(true); - } - return; - } - - m_endpoint->elog().at(log::elevel::DEVEL) - << "error timer ended without error" << log::endl; - drop_tcp(true); - } - - // helper functions for processing each opcode - void process_frame() { - if (m_state == state::OPEN) { - switch (m_read_frame.get_opcode()) { - case frame::opcode::CONTINUATION: - process_continuation(); - break; - case frame::opcode::TEXT: - process_text(); - break; - case frame::opcode::BINARY: - process_binary(); - break; - case frame::opcode::CLOSE: - process_close(); - break; - case frame::opcode::PING: - process_ping(); - break; - case frame::opcode::PONG: - process_pong(); - break; - default: - throw frame::exception("Invalid Opcode", - frame::error::PROTOCOL_VIOLATION); - break; - } - } else if (m_state == state::CLOSING) { - if (m_read_frame.get_opcode() == frame::opcode::CLOSE) { - process_close(); - } else { - // Ignore all other frames in closing state - m_endpoint->elog().at(log::elevel::DEVEL) - << "ignoring this frame" << log::endl; - } - } else { - // Recieved message before or after connection was opened/closed - throw frame::exception("process_frame called from invalid state"); - } - - m_read_frame.reset(); - } - void process_ping() { - m_endpoint->alog().at(log::alevel::CONTROL) - << "Recieved Ping Frame" << log::endl; - // TODO: on_ping - - // send pong - m_write_frame.set_fin(true); - m_write_frame.set_opcode(frame::opcode::PONG); - m_write_frame.set_payload(m_read_frame.get_payload()); - - write_frame(); - } - void process_pong() { - m_endpoint->alog().at(log::alevel::CONTROL) - << "Recieved Pong Frame" << log::endl; - // TODO: on_pong - } - void process_text() { - // this will throw an exception if validation fails at any point - m_read_frame.validate_utf8(&m_utf8_state,&m_utf8_codepoint); - - // otherwise, treat as binary - process_binary(); - } - void process_binary() { - if (m_fragmented) { - throw frame::exception("Got a new message before the previous was finished.",frame::error::PROTOCOL_VIOLATION); - } - - m_current_opcode = m_read_frame.get_opcode(); - - if (m_read_frame.get_fin()) { - deliver_message(); - reset_message(); - } else { - m_fragmented = true; - extract_payload(); - } - } - void process_continuation() { - if (!m_fragmented) { - throw frame::exception("Got a continuation frame without an outstanding message.",frame::error::PROTOCOL_VIOLATION); - } - - if (m_current_opcode == frame::opcode::TEXT) { - // this will throw an exception if validation fails at any point - m_read_frame.validate_utf8(&m_utf8_state,&m_utf8_codepoint); - } - - extract_payload(); - - // check if we are done - if (m_read_frame.get_fin()) { - deliver_message(); - reset_message(); - } - } - void process_close() { - m_remote_close_code = m_read_frame.get_close_status(); - m_remote_close_msg = m_read_frame.get_close_msg(); - - if (m_state == state::OPEN) { - m_endpoint->elog().at(log::elevel::DEVEL) - << "process_close sending ack" << log::endl; - // This is the case where the remote initiated the close. - m_closed_by_me = false; - // send acknowledgement - - // TODO: check if the remote close code - if (m_remote_close_code >= close::status::RSV_START) { - - } - - send_close(m_remote_close_code,m_remote_close_msg); - } else if (m_state == state::CLOSING) { - m_endpoint->elog().at(log::elevel::DEVEL) - << "process_close got ack" << log::endl; - // this is an ack of our close message - m_closed_by_me = true; - } else { - throw frame::exception("process_closed called from wrong state"); - } - - m_was_clean = true; - m_state = state::CLOSED; - } - - // deliver message if we have a local interface attached - void deliver_message() { - if (!m_local_interface) { - return; - } - - if (m_current_opcode == frame::opcode::BINARY) { - //log("Dispatching Binary Message",LOG_DEBUG); - if (m_fragmented) { - m_local_interface->on_message(session_type::shared_from_this(),m_current_message); - } else { - m_local_interface->on_message(session_type::shared_from_this(), - m_read_frame.get_payload()); - } - } else if (m_current_opcode == frame::opcode::TEXT) { - std::string msg; - - // make sure the finished frame is valid utf8 - // the streaming validator checks for bad codepoints as it goes. It - // doesn't know where the end of the message is though, so we need to - // check here to make sure the final message ends on a valid codepoint. - if (m_utf8_state != utf8_validator::UTF8_ACCEPT) { - throw frame::exception("Invalid UTF-8 Data", - frame::error::PAYLOAD_VIOLATION); - } - - if (m_fragmented) { - msg.append(m_current_message.begin(),m_current_message.end()); - } else { - msg.append( - m_read_frame.get_payload().begin(), - m_read_frame.get_payload().end() - ); - } - - //log("Dispatching Text Message",LOG_DEBUG); - m_local_interface->on_message(session_type::shared_from_this(),msg); - } else { - // Not sure if this should be a fatal error or not - std::stringstream err; - err << "Attempted to deliver a message of unsupported opcode " << m_current_opcode; - throw frame::exception(err.str(),frame::error::SOFT_SESSION_ERROR); - } - } - - // copies the current read frame payload into the session so that the read - // frame can be cleared for the next read. This is done when fragmented - // messages are recieved. - void extract_payload() { - std::vector &msg = m_read_frame.get_payload(); - m_current_message.resize(m_current_message.size()+msg.size()); - std::copy(msg.begin(),msg.end(),m_current_message.end()-msg.size()); - } - - // reset session for a new message - void reset_message() { - m_fragmented = false; - m_current_message.clear(); - - m_utf8_state = utf8_validator::UTF8_ACCEPT; - m_utf8_codepoint = 0; - } - - // logging - void log_close_result() { - m_endpoint->alog().at(log::alevel::DISCONNECT) - << "Disconnect " << (m_was_clean ? "Clean" : "Unclean") - << " close local:[" << m_local_close_code - << (m_local_close_msg == "" ? "" : ","+m_local_close_msg) - << "] remote:[" << m_remote_close_code - << (m_remote_close_msg == "" ? "" : ","+m_remote_close_msg) << "]" - << log::endl; - } - void log_open_result() { - m_endpoint->alog().at(log::alevel::CONNECT) << "Connection " - << m_socket.remote_endpoint() << " v" << m_version << " " - << (get_request_header("User-Agent") == "" ? "NULL" : get_request_header("User-Agent")) - << " " << m_uri.resource << " " << m_response.status_code() - << log::endl; - } - // this is called when an async asio call encounters an error - void log_error(std::string msg,const boost::system::error_code& e) { - m_endpoint->elog().at(log::elevel::ERROR) - << msg << "(" << e << ")" << log::endl; - } - - // misc helpers - - // validates status codes that the end application is allowed to use - bool validate_app_close_status(close::status::value status) { - if (status == close::status::NORMAL) { - return true; - } - - if (status >= 4000 && status < 5000) { - return true; - } - - return false; - } - - void send_close(close::status::value status,const std::string& reason) { - if (m_state != state::OPEN) { - m_endpoint->elog().at(log::elevel::WARN) - << "Tried to disconnect a session that wasn't open" << log::endl; - return; - } - - m_state = state::CLOSING; - - m_timer.expires_from_now(boost::posix_time::milliseconds(1000)); - - m_timer.async_wait( - boost::bind( - &session::handle_close_expired, - session::shared_from_this(), - boost::asio::placeholders::error - ) - ); - - m_local_close_code = status; - m_local_close_msg = reason; - - m_write_frame.set_fin(true); - m_write_frame.set_opcode(frame::opcode::CLOSE); - - // echo close value unless there is a good reason not to. - if (status == close::status::NO_STATUS) { - m_write_frame.set_status(close::status::NORMAL,""); - } else if (status == close::status::ABNORMAL_CLOSE) { - // Internal implimentation error. There is no good close code for this. - m_write_frame.set_status(close::status::POLICY_VIOLATION,reason); - } else if (close::status::invalid(status)) { - m_write_frame.set_status(close::status::PROTOCOL_ERROR,"Status code is invalid"); - } else if (close::status::reserved(status)) { - m_write_frame.set_status(close::status::PROTOCOL_ERROR,"Status code is reserved"); - } else { - m_write_frame.set_status(status,reason); - } - - write_frame(); - } - - void drop_tcp(bool dropped_by_me = true) { - m_timer.cancel(); - try { - if (m_socket.is_open()) { - m_socket.shutdown(tcp::socket::shutdown_both); - m_socket.close(); - } - } catch (boost::system::system_error& e) { - if (e.code() == boost::asio::error::not_connected) { - // this means the socket was disconnected by the other side before - // we had a chance to. Ignore and continue. - } else { - throw e; - } - } - m_dropped_by_me = dropped_by_me; - m_state = state::CLOSED; - } -private: - std::string get_header(const std::string& key, - const header_list& list) const { - header_list::const_iterator h = list.find(key); - - if (h == list.end()) { - return ""; - } else { - return h->second; - } - } - - http::parser::request m_request; - http::parser::response m_response; - - // some settings about the connection - std::vector m_requested_subprotocols; - std::vector m_requested_extensions; - std::string m_subprotocol; - std::vector m_extensions; - std::string m_origin; - unsigned int m_version; - bool m_secure; - ws_uri m_uri; - - // Mutable connection state; - uint8_t m_state; - bool m_writing; - - // Close state - close::status::value m_local_close_code; - std::string m_local_close_msg; - close::status::value m_remote_close_code; - std::string m_remote_close_msg; - bool m_was_clean; - bool m_closed_by_me; - bool m_dropped_by_me; - - // Connection Resources - tcp::socket m_socket; - boost::asio::io_service& m_io_service; - endpoint_ptr m_endpoint; - connection_handler_ptr m_local_interface; - boost::asio::deadline_timer m_timer; - - // Buffers - boost::asio::streambuf m_buf; - - // current message state - uint32_t m_utf8_state; - uint32_t m_utf8_codepoint; - std::vector m_current_message; - bool m_fragmented; - frame::opcode::value m_current_opcode; - - // frame parsers - frame::parser m_read_frame; - frame::parser m_write_frame; -}; - -} - -#endif // WEBSOCKET_SESSION_HPP From 02dd3f81935e6f4350c8e8821b65ce0084bc5952 Mon Sep 17 00:00:00 2001 From: Peter Thorson Date: Wed, 14 Mar 2012 06:26:55 -0500 Subject: [PATCH 2/7] removes legacy files --- examples/echo_client/echo_client_handler.cpp | 56 --------------- examples/echo_client/echo_client_handler.hpp | 75 -------------------- examples/echo_server/echo.cpp | 27 ------- examples/echo_server/echo.hpp | 32 --------- 4 files changed, 190 deletions(-) delete mode 100644 examples/echo_client/echo_client_handler.cpp delete mode 100644 examples/echo_client/echo_client_handler.hpp delete mode 100644 examples/echo_server/echo.cpp delete mode 100644 examples/echo_server/echo.hpp diff --git a/examples/echo_client/echo_client_handler.cpp b/examples/echo_client/echo_client_handler.cpp deleted file mode 100644 index 1c3b9a8f7d..0000000000 --- a/examples/echo_client/echo_client_handler.cpp +++ /dev/null @@ -1,56 +0,0 @@ -/* - * 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. - * - */ - -#include "echo_client_handler.hpp" - -#include -#include - -using websocketecho::echo_client_handler; -using websocketpp::client_session_ptr; - -void echo_client_handler::on_open(session_ptr s) { - std::cout << " Successfully connected (handshake complete): " << s->get_resource() << std::endl; -} - -void echo_client_handler::on_close(session_ptr s) { - std::cout << " client was disconnected (WS state is now CLOSED)" << std::endl; -} - -void echo_client_handler::on_message(session_ptr s,const std::string &msg) { - if (s->get_resource() == "/getCaseCount") { - std::cout << "Detected " << msg << " test cases." << std::endl; - m_case_count = atoi(msg.c_str()); - } else { - s->send(msg); - } -} - -void echo_client_handler::on_message(session_ptr s, - const std::vector &data) { - s->send(data); -} diff --git a/examples/echo_client/echo_client_handler.hpp b/examples/echo_client/echo_client_handler.hpp deleted file mode 100644 index 05425f2b50..0000000000 --- a/examples/echo_client/echo_client_handler.hpp +++ /dev/null @@ -1,75 +0,0 @@ -/* - * 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 ECHO_CLIENT_HANDLER_HPP -#define ECHO_CLIENT_HANDLER_HPP - -// com.zaphoyd.websocketpp.chat protocol -// -// client messages: -// alias [UTF8 text, 16 characters max] -// msg [UTF8 text] -// -// server messages: -// {"type":"msg","sender":"","value":"" } -// {"type":"participants","value":[,...]} - -#include - -#include "../../src/websocketpp.hpp" -#include "../../src/websocket_connection_handler.hpp" - -#include -#include -#include - -namespace websocketecho { - -class echo_client_handler : public websocketpp::connection_handler { -public: - echo_client_handler() : m_case_count(0) {} - virtual ~echo_client_handler() {} - - // connection to chat room complete - void on_open(session_ptr s); - - // connection to chat room closed - void on_close(session_ptr sn); - - // got a new message from server - void on_message(session_ptr s,const std::string &msg); - - // ignore messages - void on_message(session_ptr s,const std::vector &data); - - int m_case_count; -}; - -typedef boost::shared_ptr echo_client_handler_ptr; - -} -#endif // ECHO_CLIENT_HANDLER_HPP diff --git a/examples/echo_server/echo.cpp b/examples/echo_server/echo.cpp deleted file mode 100644 index d1001affb6..0000000000 --- a/examples/echo_server/echo.cpp +++ /dev/null @@ -1,27 +0,0 @@ -/* - * 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. - * - */ - diff --git a/examples/echo_server/echo.hpp b/examples/echo_server/echo.hpp deleted file mode 100644 index 40214a5ba4..0000000000 --- a/examples/echo_server/echo.hpp +++ /dev/null @@ -1,32 +0,0 @@ -/* - * 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 ECHO_SERVER_HANDLER_HPP -#define ECHO_SERVER_HANDLER_HPP - - -#endif // ECHO_SERVER_HANDLER_HPP From 576b6e43ad898e4657a33a7f9ac464ebc8f5b7ae Mon Sep 17 00:00:00 2001 From: Peter Thorson Date: Wed, 14 Mar 2012 06:27:10 -0500 Subject: [PATCH 3/7] unix makefile updates --- examples/chat_client/Makefile | 2 +- examples/chat_server/Makefile | 2 +- examples/echo_client/Makefile | 2 +- examples/echo_server/Makefile | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/chat_client/Makefile b/examples/chat_client/Makefile index 19d4151bca..6743e85533 100644 --- a/examples/chat_client/Makefile +++ b/examples/chat_client/Makefile @@ -7,7 +7,7 @@ SHARED ?= "1" ifeq ($(SHARED), 1) LDFLAGS := $(LDFLAGS) -lboost_system -lboost_thread -lwebsocketpp else - LDFLAGS := $(LDFLAGS) -lboost_system -lboost_thread -lboost_date_time -lboost_regex -lboost_random ../../libwebsocketpp.a + LDFLAGS := $(LDFLAGS) ../../libwebsocketpp.a $(BOOST_LIB_PATH)/libboost_system.a $(BOOST_LIB_PATH)/libboost_date_time.a $(BOOST_LIB_PATH)/libboost_regex.a $(BOOST_LIB_PATH)/libboost_random.a $(BOOST_LIB_PATH)/libboost_thread.a -lpthread endif chat_client: chat_client.o chat_client_handler.o diff --git a/examples/chat_server/Makefile b/examples/chat_server/Makefile index 5062d989a6..dfd1193bb7 100644 --- a/examples/chat_server/Makefile +++ b/examples/chat_server/Makefile @@ -9,7 +9,7 @@ CXX ?= c++ SHARED ?= "1" ifeq ($(SHARED), 1) - LDFLAGS := $(LDFLAGS) -lboost_system -lboost_date_time -lboost_program_options -lboost_thread -lpthread -lwebsocketpp + LDFLAGS := $(LDFLAGS) -lboost_system -lboost_date_time -lboost_thread -lboost_regex -lpthread -lwebsocketpp else LDFLAGS := $(LDFLAGS) ../../libwebsocketpp.a $(BOOST_LIB_PATH)/libboost_system.a $(BOOST_LIB_PATH)/libboost_date_time.a $(BOOST_LIB_PATH)/libboost_regex.a $(BOOST_LIB_PATH)/libboost_thread.a -lpthread endif diff --git a/examples/echo_client/Makefile b/examples/echo_client/Makefile index ec17a3dab5..bc48bddeea 100644 --- a/examples/echo_client/Makefile +++ b/examples/echo_client/Makefile @@ -7,7 +7,7 @@ SHARED ?= "1" ifeq ($(SHARED), 1) LDFLAGS := $(LDFLAGS) -lboost_system -lboost_thread -lpthread -lwebsocketpp else - LDFLAGS := $(LDFLAGS) ../../libwebsocketpp.a -lboost_system -lboost_thread -lboost_date_time -lboost_regex -lboost_random -lboost_program_options -lpthread + LDFLAGS := $(LDFLAGS) ../../libwebsocketpp.a $(BOOST_LIB_PATH)/libboost_system.a $(BOOST_LIB_PATH)/libboost_date_time.a $(BOOST_LIB_PATH)/libboost_regex.a $(BOOST_LIB_PATH)/libboost_random.a $(BOOST_LIB_PATH)/libboost_thread.a -lpthread endif echo_client: echo_client.o diff --git a/examples/echo_server/Makefile b/examples/echo_server/Makefile index 9c396693eb..606bb08046 100644 --- a/examples/echo_server/Makefile +++ b/examples/echo_server/Makefile @@ -9,7 +9,7 @@ CXX ?= c++ SHARED ?= "1" ifeq ($(SHARED), 1) - LDFLAGS := $(LDFLAGS) -lboost_system -lboost_date_time -lboost_program_options -lboost_thread -lpthread -lwebsocketpp + LDFLAGS := $(LDFLAGS) -lboost_system -lboost_date_time -lboost_thread -lpthread -lwebsocketpp else LDFLAGS := $(LDFLAGS) ../../libwebsocketpp.a $(BOOST_LIB_PATH)/libboost_system.a $(BOOST_LIB_PATH)/libboost_date_time.a $(BOOST_LIB_PATH)/libboost_regex.a $(BOOST_LIB_PATH)/libboost_thread.a -lpthread endif From 7fca59a99bc0fe558305860f40882030879fc59f Mon Sep 17 00:00:00 2001 From: Peter Thorson Date: Wed, 14 Mar 2012 06:27:28 -0500 Subject: [PATCH 4/7] fixes example server bugs and logging levels --- examples/chat_server/chat_server.cpp | 8 +++++--- examples/echo_server/echo_server.cpp | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/examples/chat_server/chat_server.cpp b/examples/chat_server/chat_server.cpp index 6779e535d4..85db01719e 100644 --- a/examples/chat_server/chat_server.cpp +++ b/examples/chat_server/chat_server.cpp @@ -40,7 +40,7 @@ int main(int argc, char* argv[]) { if (argc == 2) { // TODO: input validation? - port = atoi(argv[2]); + port = atoi(argv[1]); } try { @@ -50,9 +50,11 @@ int main(int argc, char* argv[]) { // create a server that listens on port `port` and uses our handler server endpoint(handler); - endpoint.elog().set_levels(websocketpp::log::elevel::DEVEL,websocketpp::log::elevel::FATAL); + endpoint.alog().set_level(websocketpp::log::alevel::CONNECT); + endpoint.alog().set_level(websocketpp::log::alevel::DISCONNECT); - endpoint.alog().set_level(websocketpp::log::alevel::ALL); + endpoint.elog().set_level(websocketpp::log::elevel::RERROR); + endpoint.elog().set_level(websocketpp::log::elevel::FATAL); // setup server settings // Chat server should only be receiving small text messages, reduce max diff --git a/examples/echo_server/echo_server.cpp b/examples/echo_server/echo_server.cpp index fb722a2826..98174411be 100644 --- a/examples/echo_server/echo_server.cpp +++ b/examples/echo_server/echo_server.cpp @@ -58,6 +58,7 @@ int main(int argc, char* argv[]) { echo_endpoint.elog().unset_level(websocketpp::log::elevel::ALL); echo_endpoint.alog().set_level(websocketpp::log::alevel::CONNECT); + echo_endpoint.alog().set_level(websocketpp::log::alevel::DISCONNECT); echo_endpoint.elog().set_level(websocketpp::log::elevel::RERROR); echo_endpoint.elog().set_level(websocketpp::log::elevel::FATAL); From 6471b95a4028a5118a57fb79197cd9943a067195 Mon Sep 17 00:00:00 2001 From: Peter Thorson Date: Wed, 14 Mar 2012 06:27:34 -0500 Subject: [PATCH 5/7] Xcode project update --- websocketpp.xcodeproj/project.pbxproj | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/websocketpp.xcodeproj/project.pbxproj b/websocketpp.xcodeproj/project.pbxproj index 5f525eb982..49cbc24541 100644 --- a/websocketpp.xcodeproj/project.pbxproj +++ b/websocketpp.xcodeproj/project.pbxproj @@ -244,7 +244,6 @@ /* Begin PBXFileReference section */ B6138760145AD09700ED9B19 /* Makefile */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.make; name = Makefile; path = examples/echo_server/Makefile; sourceTree = ""; }; - B6138762145AD0A500ED9B19 /* Makefile */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.make; name = Makefile; path = examples/echo_client/Makefile; sourceTree = ""; }; B6138763145AD1F700ED9B19 /* chat_client.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = chat_client.html; path = examples/chat_server/chat_client.html; sourceTree = ""; }; B6138764145AD1F700ED9B19 /* chat_server.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = chat_server.cpp; path = examples/chat_server/chat_server.cpp; sourceTree = ""; }; B6138765145AD1F700ED9B19 /* chat.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = chat.cpp; path = examples/chat_server/chat.cpp; sourceTree = ""; }; @@ -276,6 +275,11 @@ B62A5A71147759EA005F9EB0 /* common.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = common.hpp; path = src/common.hpp; sourceTree = ""; }; B63E51A814C9A5790006BF9A /* shared_const_buffer.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = shared_const_buffer.hpp; path = src/shared_const_buffer.hpp; sourceTree = ""; }; B649759D150BA96100BE17D1 /* wscmd.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = wscmd.cpp; path = examples/wsperf/wscmd.cpp; sourceTree = ""; }; + B64975A01510B3FD00BE17D1 /* SConscript */ = {isa = PBXFileReference; lastKnownFileType = text; name = SConscript; path = examples/echo_server/SConscript; sourceTree = ""; }; + B64975A11510B41400BE17D1 /* SConscript */ = {isa = PBXFileReference; lastKnownFileType = text; path = SConscript; sourceTree = ""; }; + B64975A21510B54900BE17D1 /* SConscript */ = {isa = PBXFileReference; lastKnownFileType = text; name = SConscript; path = examples/chat_server/SConscript; sourceTree = ""; }; + B64975A31510B55600BE17D1 /* SConscript */ = {isa = PBXFileReference; lastKnownFileType = text; name = SConscript; path = examples/chat_client/SConscript; sourceTree = ""; }; + B64975A41510B62700BE17D1 /* Makefile */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.make; name = Makefile; path = examples/chat_client/Makefile; sourceTree = ""; }; B64E12D214BDE132006F20F0 /* logging.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = logging.cpp; sourceTree = ""; }; B64E12D314BDE132006F20F0 /* Makefile */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = ""; }; B64E12D414BDE132006F20F0 /* parsing.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = parsing.cpp; sourceTree = ""; }; @@ -727,6 +731,7 @@ B6CF18121437C370009295BE /* echo_client */ = { isa = PBXGroup; children = ( + B64975A11510B41400BE17D1 /* SConscript */, B6CF18131437C370009295BE /* echo_client.cpp */, B6CF18141437C370009295BE /* echo_client_handler.cpp */, B6CF18151437C370009295BE /* echo_client_handler.hpp */, @@ -870,6 +875,7 @@ B6DF1CC71435ED420029A1B1 /* echo_server */ = { isa = PBXGroup; children = ( + B64975A01510B3FD00BE17D1 /* SConscript */, B6DF1CCA1435ED760029A1B1 /* echo_server.cpp */, B6DF1CCB1435ED760029A1B1 /* echo.cpp */, B6DF1CCC1435ED760029A1B1 /* echo.hpp */, @@ -884,7 +890,8 @@ B6828875143745DA002BA48B /* chat_client_handler.cpp */, B6828876143745DA002BA48B /* chat_client_handler.hpp */, B6828877143745DA002BA48B /* chat_client.cpp */, - B6138762145AD0A500ED9B19 /* Makefile */, + B64975A31510B55600BE17D1 /* SConscript */, + B64975A41510B62700BE17D1 /* Makefile */, ); name = chat_client; sourceTree = ""; @@ -896,6 +903,7 @@ B6138764145AD1F700ED9B19 /* chat_server.cpp */, B6138765145AD1F700ED9B19 /* chat.cpp */, B6138766145AD1F700ED9B19 /* chat.hpp */, + B64975A21510B54900BE17D1 /* SConscript */, B6138767145AD1F700ED9B19 /* Makefile */, ); name = chat_server; From 046c2dea910df709851ca19350f206de84a8c988 Mon Sep 17 00:00:00 2001 From: Peter Thorson Date: Wed, 14 Mar 2012 06:28:10 -0500 Subject: [PATCH 6/7] scons build supports echo_client, chat_server, chat_client --- Makefile | 6 +++--- SConstruct | 12 ++++++++++++ examples/chat_client/SConscript | 21 +++++++++++++++++++++ examples/chat_server/SConscript | 20 ++++++++++++++++++++ examples/echo_client/SConscript | 21 +++++++++++++++++++++ 5 files changed, 77 insertions(+), 3 deletions(-) create mode 100644 examples/chat_client/SConscript create mode 100644 examples/chat_server/SConscript create mode 100644 examples/echo_client/SConscript diff --git a/Makefile b/Makefile index f69b12b92a..e004eb30be 100644 --- a/Makefile +++ b/Makefile @@ -74,8 +74,8 @@ srcdir ?= src CXX ?= c++ AR ?= ar PIC ?= PIC -BUILD_TYPE ?= default -SHARED ?= 1 +BUILD_TYPE ?= "default" +SHARED ?= "1" # Internal Variables @@ -84,7 +84,7 @@ include_path = $(prefix)/$(includedir) # BUILD_TYPE specific settings ifeq ($(BUILD_TYPE), debug) - CXXFLAGS : = $(cxxflags_debug) $(CXXFLANGS_EXTRA) + CXXFLAGS = $(cxxflags_debug) libname := $(libname_debug) else CXXFLAGS ?= $(cxxflags_default) diff --git a/SConstruct b/SConstruct index 1dbf72d0dc..7fdaca4c7b 100644 --- a/SConstruct +++ b/SConstruct @@ -104,3 +104,15 @@ wsperf = SConscript('#/examples/wsperf/SConscript', echo_server = SConscript('#/examples/echo_server/SConscript', variant_dir = builddir + 'echo_server', duplicate = 0) + +echo_client = SConscript('#/examples/echo_client/SConscript', + variant_dir = builddir + 'echo_client', + duplicate = 0) + +chat_client = SConscript('#/examples/chat_client/SConscript', + variant_dir = builddir + 'chat_client', + duplicate = 0) + +chat_server = SConscript('#/examples/chat_server/SConscript', + variant_dir = builddir + 'chat_server', + duplicate = 0) diff --git a/examples/chat_client/SConscript b/examples/chat_client/SConscript new file mode 100644 index 0000000000..c987382aa6 --- /dev/null +++ b/examples/chat_client/SConscript @@ -0,0 +1,21 @@ +## chat_client +## + +Import('env') +Import('boostlibs') +Import('wslib') +Import('platform_libs') + +localenv = env.Clone () + +sources = ["chat_client","chat_client_handler.cpp"] + +LIBS = [wslib, platform_libs] + boostlibs(['system', + 'date_time', + 'regex', + 'thread', + 'random']) + +prg = localenv.Program('chat_client', sources, LIBS = LIBS) + +Return('prg') diff --git a/examples/chat_server/SConscript b/examples/chat_server/SConscript new file mode 100644 index 0000000000..fe5bbd949d --- /dev/null +++ b/examples/chat_server/SConscript @@ -0,0 +1,20 @@ +## chat_server +## + +Import('env') +Import('boostlibs') +Import('wslib') +Import('platform_libs') + +localenv = env.Clone () + +sources = ["chat_server.cpp","chat.cpp"] + +LIBS = [wslib, platform_libs] + boostlibs(['system', + 'date_time', + 'regex', + 'thread']) + +prg = localenv.Program('chat_server', sources, LIBS = LIBS) + +Return('prg') diff --git a/examples/echo_client/SConscript b/examples/echo_client/SConscript new file mode 100644 index 0000000000..84e56f1318 --- /dev/null +++ b/examples/echo_client/SConscript @@ -0,0 +1,21 @@ +## echo_client +## + +Import('env') +Import('boostlibs') +Import('wslib') +Import('platform_libs') + +localenv = env.Clone () + +sources = ["echo_client.cpp"] + +LIBS = [wslib, platform_libs] + boostlibs(['system', + 'date_time', + 'regex', + 'thread', + 'random']) + +prg = localenv.Program('echo_client', sources, LIBS = LIBS) + +Return('prg') From 35691eca17f97b08e09e4a89a6d1eacc4fc25b7c Mon Sep 17 00:00:00 2001 From: Peter Thorson Date: Wed, 14 Mar 2012 06:39:18 -0500 Subject: [PATCH 7/7] adds more scons targets --- SConstruct | 15 +++++++++++++ examples/concurrent_server/SConscript | 20 +++++++++++++++++ .../concurrent_server/concurrent_server.cpp | 2 +- examples/echo_server_tls/SConscript | 21 ++++++++++++++++++ examples/echo_server_tls/echo_server_tls | Bin 1446824 -> 0 bytes websocketpp.xcodeproj/project.pbxproj | 4 ++++ 6 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 examples/concurrent_server/SConscript create mode 100644 examples/echo_server_tls/SConscript delete mode 100755 examples/echo_server_tls/echo_server_tls diff --git a/SConstruct b/SConstruct index 7fdaca4c7b..5b29895c3c 100644 --- a/SConstruct +++ b/SConstruct @@ -71,8 +71,12 @@ else: env['BOOST_LIBS']] platform_libs = [] +tls_libs = [] if env['PLATFORM'] == 'posix': platform_libs = ['pthread', 'rt'] + tls_libs = ['ssl', 'crypto'] +elif env['PLATFORM'] == 'darwin': + tls_libs = ['ssl', 'crypto'] elif env['PLATFORM'].startswith('win'): # Win/VC++ supports autolinking. nothing to do. pass @@ -85,6 +89,7 @@ builddir = releasedir Export('env') Export('platform_libs') Export('boostlibs') +Export('tls_libs') ## END OF CONFIG !! @@ -105,6 +110,10 @@ echo_server = SConscript('#/examples/echo_server/SConscript', variant_dir = builddir + 'echo_server', duplicate = 0) +echo_server_tls = SConscript('#/examples/echo_server_tls/SConscript', + variant_dir = builddir + 'echo_server_tls', + duplicate = 0) + echo_client = SConscript('#/examples/echo_client/SConscript', variant_dir = builddir + 'echo_client', duplicate = 0) @@ -116,3 +125,9 @@ chat_client = SConscript('#/examples/chat_client/SConscript', chat_server = SConscript('#/examples/chat_server/SConscript', variant_dir = builddir + 'chat_server', duplicate = 0) + +concurrent_server = SConscript('#/examples/concurrent_server/SConscript', + variant_dir = builddir + 'concurrent_server', + duplicate = 0) + + diff --git a/examples/concurrent_server/SConscript b/examples/concurrent_server/SConscript new file mode 100644 index 0000000000..6e526bbcdf --- /dev/null +++ b/examples/concurrent_server/SConscript @@ -0,0 +1,20 @@ +## concurrent_server.cpp +## + +Import('env') +Import('boostlibs') +Import('wslib') +Import('platform_libs') + +localenv = env.Clone () + +sources = ["concurrent_server.cpp"] + +LIBS = [wslib, platform_libs] + boostlibs(['system', + 'date_time', + 'regex', + 'thread']) + +prg = localenv.Program('concurrent_server', sources, LIBS = LIBS) + +Return('prg') diff --git a/examples/concurrent_server/concurrent_server.cpp b/examples/concurrent_server/concurrent_server.cpp index 9a072230bb..d865094166 100644 --- a/examples/concurrent_server/concurrent_server.cpp +++ b/examples/concurrent_server/concurrent_server.cpp @@ -183,7 +183,7 @@ int main(int argc, char* argv[]) { echo_endpoint.alog().unset_level(websocketpp::log::alevel::ALL); echo_endpoint.elog().unset_level(websocketpp::log::elevel::ALL); - echo_endpoint.elog().set_level(websocketpp::log::elevel::ERROR); + echo_endpoint.elog().set_level(websocketpp::log::elevel::RERROR); echo_endpoint.elog().set_level(websocketpp::log::elevel::FATAL); std::list > threads; diff --git a/examples/echo_server_tls/SConscript b/examples/echo_server_tls/SConscript new file mode 100644 index 0000000000..6f2f5434a6 --- /dev/null +++ b/examples/echo_server_tls/SConscript @@ -0,0 +1,21 @@ +## echo_server_tls +## + +Import('env') +Import('boostlibs') +Import('wslib') +Import('platform_libs') +Import('tls_libs') + +localenv = env.Clone () + +sources = ["echo_server_tls.cpp"] + +LIBS = [wslib, platform_libs, tls_libs] + boostlibs(['system', + 'date_time', + 'regex', + 'thread']) + +prg = localenv.Program('echo_server_tls', sources, LIBS = LIBS) + +Return('prg') diff --git a/examples/echo_server_tls/echo_server_tls b/examples/echo_server_tls/echo_server_tls deleted file mode 100755 index 255d92b4710fe72c55222c00ec7ba9cecc44c524..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1446824 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 z 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%0ANpCl} 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

m#Xo!tLm>e0OA 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