Skip to content

Commit 64fffed

Browse files
author
Peter Thorson
committed
Add combination plain+TLS echo example
1 parent 7137105 commit 64fffed

File tree

5 files changed

+184
-0
lines changed

5 files changed

+184
-0
lines changed

SConstruct

+1
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,7 @@ echo_server = SConscript('#/examples/echo_server/SConscript',variant_dir = build
214214
# echo_server_tls
215215
if tls_build:
216216
echo_server_tls = SConscript('#/examples/echo_server_tls/SConscript',variant_dir = builddir + 'echo_server_tls',duplicate = 0)
217+
echo_server_both = SConscript('#/examples/echo_server_both/SConscript',variant_dir = builddir + 'echo_server_both',duplicate = 0)
217218

218219
# broadcast_server
219220
broadcast_server = SConscript('#/examples/broadcast_server/SConscript',variant_dir = builddir + 'broadcast_server',duplicate = 0)
+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
2+
file (GLOB SOURCE_FILES *.cpp)
3+
file (GLOB HEADER_FILES *.hpp)
4+
5+
6+
if (OPENSSL_FOUND)
7+
8+
init_target (echo_server_both)
9+
10+
build_executable (${TARGET_NAME} ${SOURCE_FILES} ${HEADER_FILES})
11+
12+
link_boost ()
13+
link_openssl()
14+
final_target ()
15+
endif()

examples/echo_server_both/SConscript

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
## Combo plain+tls echo server
2+
##
3+
4+
Import('env')
5+
Import('env_cpp11')
6+
Import('boostlibs')
7+
Import('platform_libs')
8+
Import('polyfill_libs')
9+
Import('tls_libs')
10+
11+
env = env.Clone ()
12+
env_cpp11 = env_cpp11.Clone ()
13+
14+
prgs = []
15+
16+
# if a C++11 environment is available build using that, otherwise use boost
17+
if env_cpp11.has_key('WSPP_CPP11_ENABLED'):
18+
ALL_LIBS = boostlibs(['system'],env_cpp11) + [platform_libs] + [polyfill_libs] + [tls_libs]
19+
prgs += env_cpp11.Program('echo_server_both', ["echo_server_both.cpp"], LIBS = ALL_LIBS)
20+
else:
21+
ALL_LIBS = boostlibs(['system'],env) + [platform_libs] + [polyfill_libs] + [tls_libs]
22+
prgs += env.Program('echo_server_both', ["echo_server_both.cpp"], LIBS = ALL_LIBS)
23+
24+
Return('prgs')
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
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::single_dh_use);
50+
ctx->set_password_callback(bind(&get_password));
51+
ctx->use_certificate_chain_file("server.pem");
52+
ctx->use_private_key_file("server.pem", boost::asio::ssl::context::pem);
53+
} catch (std::exception& e) {
54+
std::cout << e.what() << std::endl;
55+
}
56+
return ctx;
57+
}
58+
59+
int main() {
60+
// set up an external io_service to run both endpoints on. This is not
61+
// strictly necessary, but simplifies thread management a bit.
62+
boost::asio::io_service ios;
63+
64+
// set up plain endpoint
65+
server_plain endpoint_plain;
66+
// initialize asio with our external io_service rather than an internal one
67+
endpoint_plain.init_asio(&ios);
68+
endpoint_plain.set_message_handler(
69+
bind(&on_message<server_plain>,&endpoint_plain,::_1,::_2));
70+
endpoint_plain.listen(80);
71+
endpoint_plain.start_accept();
72+
73+
// set up tls endpoint
74+
server_tls endpoint_tls;
75+
endpoint_tls.init_asio(&ios);
76+
endpoint_tls.set_message_handler(
77+
bind(&on_message<server_tls>,&endpoint_tls,::_1,::_2));
78+
// TLS endpoint has an extra handler for the tls init
79+
endpoint_tls.set_tls_init_handler(bind(&on_tls_init,::_1));
80+
// tls endpoint listens on a different port
81+
endpoint_tls.listen(443);
82+
endpoint_tls.start_accept();
83+
84+
// Start the ASIO io_service run loop running both endpoints
85+
ios.run();
86+
}

examples/echo_server_both/server.pem

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
Proc-Type: 4,ENCRYPTED
3+
DEK-Info: DES-EDE3-CBC,A0ED66EF872A48A9
4+
5+
gXuvKojXzApVhhPVNdRliiajbC4PtwQG5c8TA7JADLgwOR7o9t6KtXEr37bDRpvB
6+
9aO9P+SJaK5OOp3XKPGthOdqv+tvCRTlmzmC8GjPLBX389DWT2xoGu7JkGwDtdSm
7+
rnF49Rlp5bfjpACk5xKNiKeDo1CWfeEJzw9Kto0g+5eMaEdors64oPzjXs3geA2g
8+
TxCJSHv9qSX6++pCLKKCUTbyzidAxV/Zb0AAubt5V40QKqX4HhSwwstFnTaX3tlb
9+
3QOdY+y04VIkM6d7qN5W8M7NzRkMpZ1qBpQcUMpkhQcRzWP2wub5AAff9D2GntRd
10+
4Dz1vn3u41U3Okdr0CNj+iH7byCzuokoAhk6ZQEN6WB+GTpGgfBXdtUZrfpb0MKm
11+
UNYP5AF2AmUqJRXhViTDVtu/V2tHF3LGuNT+W2Dz+spFZEq0byEO0N858eR0dikc
12+
6jOASvNQbSwD0+mkgBC1gXKKU3ngj2gpJUwljeACdWFd8N2egrZfyI05CmX7vPNC
13+
NXbs7k2buWNdjP4/D8IM+HDVidWzQa/kG/qokXKqllem9Egg37lUucwnP3cX2/Hw
14+
U2mfaBWzeZtqc+GqRp08rYIql+Reai3sUYlQMnNk01prVY47UQb+dxuqjaxGV5Xx
15+
Xkx0s2mfQnNRjL4S7Hjhqelufi6GpkCQ2EGsPpA+6K1ztZ0ame9Q2BE1SXeM/6vU
16+
rxT5nRrCxueyXAyQSGcqMX9//gSeK8WWBqG/c1IAMVDa0NWrJeOJhSziE+ta3B0m
17+
bHAPBY6vh0iB3lLdRlbUOPbC6R1TpxMOs+6Vbs2+OTifFpvOVymEoZq/nroyg68P
18+
vn5uCKogwWA7o8EArf/UTlIwWJmH9bgILdZKld4wMel2HQg16RDzm+mEXAJi52a/
19+
FC+fgfphdxltmUJ+rqOyR4AHULjaTWUQqTIB6sdlzgmES1nXAiE71zX//KFqomar
20+
O60SPPk3C1bs0x5DsvmGJa8SIfDhyd+D7NPyqwEKqrZsaotYGklNkfqxa6pa8mrc
21+
ejxquW1PK4FvBk26+osu5a90Jih0PcQM7DUMMr2WHdTiMSXWAiK2ToYF8Itt25Qv
22+
Cd0CsSYw9CJkXNr1u1+mObheaY9QYOmztnSJLy4ZO2JsMhqNwuAueIcwmhXOREq7
23+
kzlnGMgJcuSeAS/OBNj8Zgx0c7QQ0kzc+YmnOCsqoMtPsu/CsXJ4iJiM3Tki/2jT
24+
bywrTiQwE6R3a/87GREOREX+WLicZBWX3k9/4tBL5XSe1p5wPpuIRQUDvAGNfNHP
25+
JN7kujDF4SehilF1qtvCygAwvxHFDj+EwhXKNDKJzoZZIM15rAk3k92n2j6nz1qH
26+
a3xOU05yydOlO6F6w51I1QoDddmkzCRNB0TeO3D6rekHsCK1aDWmC+qRcm2ZFtVz
27+
sY6fdZN2NEmMQokIh9Opi1f8CSYSizPESMzdu2SF0xVO9n/IGIkn1ksK04O2BZo0
28+
X3LBPHLfCRsQNY1eF17bj07fYU2oPZKs/XzJiwxkqK6LFvpeAVaYrtg9fqRO/UVe
29+
QhUIj3BL550ocEpa15xLehLrmwzYiW5zwGjSHQ4EgZluGLCwyKGTh4QswEJRA9Rt
30+
-----END RSA PRIVATE KEY-----
31+
-----BEGIN CERTIFICATE-----
32+
MIIE0DCCA7igAwIBAgIJAM5MuKJezXq0MA0GCSqGSIb3DQEBBQUAMIGgMQswCQYD
33+
VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xGDAW
34+
BgNVBAoTD1phcGhveWQgU3R1ZGlvczEUMBIGA1UECxMLV2ViU29ja2V0KysxFjAU
35+
BgNVBAMTDVBldGVyIFRob3Jzb24xJDAiBgkqhkiG9w0BCQEWFXdlYm1hc3RlckB6
36+
YXBob3lkLmNvbTAeFw0xMTExMTUyMTIwMDZaFw0xMjExMTQyMTIwMDZaMIGgMQsw
37+
CQYDVQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28x
38+
GDAWBgNVBAoTD1phcGhveWQgU3R1ZGlvczEUMBIGA1UECxMLV2ViU29ja2V0Kysx
39+
FjAUBgNVBAMTDVBldGVyIFRob3Jzb24xJDAiBgkqhkiG9w0BCQEWFXdlYm1hc3Rl
40+
ckB6YXBob3lkLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANR0
41+
tdwAnIB8I9qRZ7QbzEWY95RpM7GIn0u/9oH90PzdHiE0rXSkKT+yw3XUzH0iw5t0
42+
5dEwSC+srSP5Vm4cA6kXc94agVVaPW89tGcdP4fHptCruSrzQsDXELCPl5UUvMpA
43+
YUcGisdXYPN/EeOoqb9wKWxoW5mREsyyeWWS89fYN5qU/d0QpbSvEWghqLbL/ZS2
44+
hOlXT9LufOeA+vHiV1/T/h5xC7ecIH02YDQw1EnqxbPmkLPcWThztLS9FiufNDRM
45+
Rhcoaj2b9VDHvDwdbeA0T5v5qNdG34LaapYOelxzQMOtM0f9Dgqehodyxl2qm9mR
46+
lq432dlOEzDnVCPNHwECAwEAAaOCAQkwggEFMB0GA1UdDgQWBBTTPKfNMnKOykhv
47+
+vKS7vql5JsMyzCB1QYDVR0jBIHNMIHKgBTTPKfNMnKOykhv+vKS7vql5JsMy6GB
48+
pqSBozCBoDELMAkGA1UEBhMCVVMxETAPBgNVBAgTCElsbGlub2lzMRAwDgYDVQQH
49+
EwdDaGljYWdvMRgwFgYDVQQKEw9aYXBob3lkIFN0dWRpb3MxFDASBgNVBAsTC1dl
50+
YlNvY2tldCsrMRYwFAYDVQQDEw1QZXRlciBUaG9yc29uMSQwIgYJKoZIhvcNAQkB
51+
FhV3ZWJtYXN0ZXJAemFwaG95ZC5jb22CCQDOTLiiXs16tDAMBgNVHRMEBTADAQH/
52+
MA0GCSqGSIb3DQEBBQUAA4IBAQB+SH0s/hrv5VYqgX6SNLzxdSLvCVsUkCdTpxwY
53+
wOJ84XmYcXDMhKDtZqLtOtN6pfEwVusFlC9mkieuunztCnWNmsSG83RuljJPjFSi
54+
1d4Id4bKEQkQ4cfnjoHKivRrViWLnxuNnLzC6tpyGH/35kKWhhr6T58AXerFgVw3
55+
mHvLPTr1DuhdAZA0ZuvuseVAFFAjI3RetSySwHJE3ak8KswDVfLi6E3XxMVsIWTS
56+
/iFsC2WwoZQlljya2V/kRYIhu+uCdqJ01wunn2BvmURPSgr4GTBF0FQ9JGpNbXxM
57+
TAU7oQJgyFc5sCcuEgPTO0dWVQTvdZVgay4tkmduKDRkmJBF
58+
-----END CERTIFICATE-----

0 commit comments

Comments
 (0)