diff --git a/include/fc/network/http/websocket.hpp b/include/fc/network/http/websocket.hpp index 0fd208b..953db69 100644 --- a/include/fc/network/http/websocket.hpp +++ b/include/fc/network/http/websocket.hpp @@ -45,7 +45,7 @@ namespace fc { namespace http { class websocket_server { public: - websocket_server( std::string forward_header_key = std::string() ); + websocket_server(); ~websocket_server(); void on_connection( const on_connection_handler& handler); @@ -53,6 +53,7 @@ namespace fc { namespace http { void listen( const fc::ip::endpoint& ep ); uint16_t get_listening_port(); void start_accept(); + void set_forward_header_key(const std::string& key); void stop_listening(); void close(); @@ -74,7 +75,7 @@ namespace fc { namespace http { void listen( uint16_t port ); void listen( const fc::ip::endpoint& ep ); void start_accept(); - + void set_forward_header_key(const std::string& key); private: friend class detail::websocket_tls_server_impl; std::unique_ptr my; diff --git a/src/network/http/websocket.cpp b/src/network/http/websocket.cpp index b09e4e3..62f01bf 100644 --- a/src/network/http/websocket.cpp +++ b/src/network/http/websocket.cpp @@ -190,8 +190,8 @@ namespace fc { namespace http { class websocket_server_impl { public: - websocket_server_impl(const std::string& forward_header_key = std::string() ) - :_server_thread( fc::thread::current() ), fwd_header_key(forward_header_key) + websocket_server_impl() + :_server_thread( fc::thread::current() ), fwd_header_key("") { _server.clear_access_channels( websocketpp::log::alevel::all ); _server.init_asio(&fc::asio::default_io_service()); @@ -293,6 +293,8 @@ namespace fc { namespace http { if( _closed ) _closed->wait(); } + void set_forward_header_key(const std::string& key) { fwd_header_key = key; } + typedef std::map > con_map; con_map _connections; @@ -310,7 +312,6 @@ namespace fc { namespace http { websocket_tls_server_impl( const string& server_pem, const string& ssl_password ) :_server_thread( fc::thread::current() ) { - //if( server_pem.size() ) { _server.set_tls_init_handler( [=]( websocketpp::connection_hdl hdl ) -> context_ptr { context_ptr ctx = websocketpp::lib::make_shared(boost::asio::ssl::context::tlsv1); @@ -344,6 +345,8 @@ namespace fc { namespace http { assert( current_con != _connections.end() ); auto received = msg->get_payload(); std::shared_ptr con = current_con->second; + wlog( "Websocket TLS Server Remote: ${host} Payload: ${body}", + ("host", con->get_remote_hostname(fwd_header_key)) ("body", msg->get_payload())); fc::async([con,received](){ con->on_message( received ); }); }).wait(); }); @@ -390,6 +393,7 @@ namespace fc { namespace http { } }); } + ~websocket_tls_server_impl() { if( _server.is_listening() ) @@ -399,6 +403,8 @@ namespace fc { namespace http { _server.close( item.first, 0, "server exit" ); } + void set_forward_header_key( const std::string& key ) { fwd_header_key = key; } + typedef std::map > con_map; con_map _connections; @@ -406,6 +412,7 @@ namespace fc { namespace http { websocket_tls_server_type _server; on_connection_handler _on_connection; fc::promise::ptr _closed; + std::string fwd_header_key; }; typedef websocketpp::client websocket_client_type; @@ -594,8 +601,8 @@ namespace fc { namespace http { } // namespace detail - websocket_server::websocket_server(std::string forward_header_key) - :my( new detail::websocket_server_impl(forward_header_key) ) {} + websocket_server::websocket_server() + :my( new detail::websocket_server_impl() ) {} websocket_server::~websocket_server(){} void websocket_server::on_connection( const on_connection_handler& handler ) @@ -633,7 +640,10 @@ namespace fc { namespace http { my->_server.close(connection.first, websocketpp::close::status::normal, "Goodbye"); } - + void websocket_server::set_forward_header_key( const std::string& key ) + { + my->set_forward_header_key( key ); + } websocket_tls_server::websocket_tls_server( const string& server_pem, const string& ssl_password ):my( new detail::websocket_tls_server_impl(server_pem, ssl_password) ) {} websocket_tls_server::~websocket_tls_server(){} diff --git a/tests/network/http/websocket_test.cpp b/tests/network/http/websocket_test.cpp index ffad3f4..4bb3e69 100644 --- a/tests/network/http/websocket_test.cpp +++ b/tests/network/http/websocket_test.cpp @@ -19,7 +19,10 @@ BOOST_AUTO_TEST_CASE(websocket_test) fc::http::websocket_connection_ptr s_conn, c_conn; int port; { - fc::http::websocket_server server("MyProxyHeaderKey"); + fc::http::websocket_server server; + // even with this set, if the remote does not provide it, it will revert to + // the remote endpoint + server.set_forward_header_key("MyProxyHeaderKey"); server.on_connection([&]( const fc::http::websocket_connection_ptr& c ){ s_conn = c; c->on_message_handler([&](const std::string& s){ @@ -77,7 +80,8 @@ BOOST_AUTO_TEST_CASE(websocket_test_with_proxy_header) int port; { // the server will be on the lookout for the key in the header - fc::http::websocket_server server("MyProxyHeaderKey"); + fc::http::websocket_server server; + server.set_forward_header_key("MyProxyHeaderKey"); server.on_connection([&]( const fc::http::websocket_connection_ptr& c ){ s_conn = c; c->on_message_handler([&](const std::string& s){ diff --git a/tests/ws_test_server.cpp b/tests/ws_test_server.cpp index e088681..4cb58f7 100644 --- a/tests/ws_test_server.cpp +++ b/tests/ws_test_server.cpp @@ -13,7 +13,8 @@ int main(int argc, char** argv) fc::logger l = fc::logger::get("rpc"); l.add_appender( ca ); - fc::http::websocket_server server("MyForwardHeaderKey"); + fc::http::websocket_server server; + server.set_forward_header_key("MyForwardHeaderKey"); server.on_connection([&]( const fc::http::websocket_connection_ptr& c ){ c->on_message_handler([&](const std::string& s){