From bfbb4a94db155b9f033129b943c42ea9076c51af Mon Sep 17 00:00:00 2001 From: Peter Thorson Date: Sat, 6 Apr 2013 15:30:58 -0500 Subject: [PATCH] adds an example to demonstrate subprotocol negotiation --- SConstruct | 3 ++ examples/subprotocol_server/SConscript | 23 ++++++++ .../subprotocol_server/subprotocol_server.cpp | 52 +++++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 examples/subprotocol_server/SConscript create mode 100644 examples/subprotocol_server/subprotocol_server.cpp diff --git a/SConstruct b/SConstruct index 45ea5b6194..ec0d956a2b 100644 --- a/SConstruct +++ b/SConstruct @@ -194,6 +194,9 @@ broadcast_server = SConscript('#/examples/broadcast_server/SConscript',variant_d # echo_client echo_client = SConscript('#/examples/echo_client/SConscript',variant_dir = builddir + 'echo_client',duplicate = 0) +# subprotocol_server +subprotocol_server = SConscript('#/examples/subprotocol_server/SConscript',variant_dir = builddir + 'subprotocol_server',duplicate = 0) + # #wsperf = SConscript('#/examples/wsperf/SConscript', # variant_dir = builddir + 'wsperf', diff --git a/examples/subprotocol_server/SConscript b/examples/subprotocol_server/SConscript new file mode 100644 index 0000000000..2ce12359f1 --- /dev/null +++ b/examples/subprotocol_server/SConscript @@ -0,0 +1,23 @@ +## Main development example +## + +Import('env') +Import('env_cpp11') +Import('boostlibs') +Import('platform_libs') +Import('polyfill_libs') + +env = env.Clone () +env_cpp11 = env_cpp11.Clone () + +prgs = [] + +# if a C++11 environment is avaliable build using that, otherwise use boost +if env_cpp11.has_key('WSPP_CPP11_ENABLED'): + ALL_LIBS = boostlibs(['system'],env_cpp11) + [platform_libs] + [polyfill_libs] + prgs += env_cpp11.Program('subprotocol_server', ["subprotocol_server.cpp"], LIBS = ALL_LIBS) +else: + ALL_LIBS = boostlibs(['system','regex'],env) + [platform_libs] + [polyfill_libs] + prgs += env.Program('subprotocol_server', ["subprotocol_server.cpp"], LIBS = ALL_LIBS) + +Return('prgs') diff --git a/examples/subprotocol_server/subprotocol_server.cpp b/examples/subprotocol_server/subprotocol_server.cpp new file mode 100644 index 0000000000..0cdc1d0cd0 --- /dev/null +++ b/examples/subprotocol_server/subprotocol_server.cpp @@ -0,0 +1,52 @@ +#include + +#include +#include + +typedef websocketpp::server server; + +using websocketpp::connection_hdl; +using websocketpp::lib::placeholders::_1; +using websocketpp::lib::placeholders::_2; +using websocketpp::lib::bind; +using websocketpp::lib::ref; + + +bool validate(server & s, connection_hdl hdl) { + server::connection_ptr con = s.get_con_from_hdl(hdl); + + std::cout << "Cache-Control: " << con->get_request_header("Cache-Control") << std::endl; + + const std::vector & subp_requests = con->get_requested_subprotocols(); + std::vector::const_iterator it; + + for (it = subp_requests.begin(); it != subp_requests.end(); ++it) { + std::cout << "Requested: " << *it << std::endl; + } + + if (subp_requests.size() > 0) { + con->select_subprotocol(subp_requests[0]); + } + + return true; +} + +int main() { + try { + server s; + + s.set_validate_handler(bind(&validate,ref(s),::_1)); + + s.init_asio(); + s.listen(9005); + s.start_accept(); + + s.run(); + } catch (const std::exception & e) { + std::cout << e.what() << std::endl; + } catch (websocketpp::lib::error_code e) { + std::cout << e.message() << std::endl; + } catch (...) { + std::cout << "other exception" << std::endl; + } +} \ No newline at end of file