fixed adding file problem
[c11concurrency-benchmarks.git] / gdax-orderbook-hpp / demo / dependencies / websocketpp-0.7.0 / examples / echo_server_both / echo_server_both.cpp
1 #include <websocketpp/config/asio.hpp>
2 #include <websocketpp/server.hpp>
3
4 #include <iostream>
5
6 // define types for two different server endpoints, one for each config we are
7 // using
8 typedef websocketpp::server<websocketpp::config::asio> server_plain;
9 typedef websocketpp::server<websocketpp::config::asio_tls> server_tls;
10
11 // alias some of the bind related functions as they are a bit long
12 using websocketpp::lib::placeholders::_1;
13 using websocketpp::lib::placeholders::_2;
14 using websocketpp::lib::bind;
15
16 // type of the ssl context pointer is long so alias it
17 typedef websocketpp::lib::shared_ptr<boost::asio::ssl::context> context_ptr;
18
19 // The shared on_message handler takes a template parameter so the function can
20 // resolve any endpoint dependent types like message_ptr or connection_ptr
21 template <typename EndpointType>
22 void on_message(EndpointType* s, websocketpp::connection_hdl hdl,
23     typename EndpointType::message_ptr msg)
24 {
25     std::cout << "on_message called with hdl: " << hdl.lock().get()
26               << " and message: " << msg->get_payload()
27               << std::endl;
28
29     try {
30         s->send(hdl, msg->get_payload(), msg->get_opcode());
31     } catch (const websocketpp::lib::error_code& e) {
32         std::cout << "Echo failed because: " << e
33                   << "(" << e.message() << ")" << std::endl;
34     }
35 }
36
37 // No change to TLS init methods from echo_server_tls
38 std::string get_password() {
39     return "test";
40 }
41
42 context_ptr on_tls_init(websocketpp::connection_hdl hdl) {
43     std::cout << "on_tls_init called with hdl: " << hdl.lock().get() << std::endl;
44     context_ptr ctx(new boost::asio::ssl::context(boost::asio::ssl::context::tlsv1));
45
46     try {
47         ctx->set_options(boost::asio::ssl::context::default_workarounds |
48                          boost::asio::ssl::context::no_sslv2 |
49                          boost::asio::ssl::context::no_sslv3 |
50                          boost::asio::ssl::context::single_dh_use);
51         ctx->set_password_callback(bind(&get_password));
52         ctx->use_certificate_chain_file("server.pem");
53         ctx->use_private_key_file("server.pem", boost::asio::ssl::context::pem);
54     } catch (std::exception& e) {
55         std::cout << e.what() << std::endl;
56     }
57     return ctx;
58 }
59
60 int main() {
61     // set up an external io_service to run both endpoints on. This is not
62     // strictly necessary, but simplifies thread management a bit.
63     boost::asio::io_service ios;
64
65     // set up plain endpoint
66     server_plain endpoint_plain;
67     // initialize asio with our external io_service rather than an internal one
68     endpoint_plain.init_asio(&ios);
69     endpoint_plain.set_message_handler(
70         bind(&on_message<server_plain>,&endpoint_plain,::_1,::_2));
71     endpoint_plain.listen(80);
72     endpoint_plain.start_accept();
73
74     // set up tls endpoint
75     server_tls endpoint_tls;
76     endpoint_tls.init_asio(&ios);
77     endpoint_tls.set_message_handler(
78         bind(&on_message<server_tls>,&endpoint_tls,::_1,::_2));
79     // TLS endpoint has an extra handler for the tls init
80     endpoint_tls.set_tls_init_handler(bind(&on_tls_init,::_1));
81     // tls endpoint listens on a different port
82     endpoint_tls.listen(443);
83     endpoint_tls.start_accept();
84
85     // Start the ASIO io_service run loop running both endpoints
86     ios.run();
87 }