diff --git a/CHANGELOG.md b/CHANGELOG.md index 6924273f..215e0b31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ * rfc7230 section 3.3.2 compliance * Add HTTPS example +* Add Secure WebSocket example -------------------------------------------------------------------------------- diff --git a/doc/examples.qbk b/doc/examples.qbk index a78fbe3d..0afdd808 100644 --- a/doc/examples.qbk +++ b/doc/examples.qbk @@ -83,6 +83,13 @@ int main() } ``` +[heading Secure WebSocket] + +Establish a WebSocket connection over an encrypted TLS connection, +send a message and receive the reply. Requires OpenSSL to build. + +* [@examples/websocket_ssl_example.cpp] + [heading HTTPS GET] This example demonstrates sending and receiving HTTP messages diff --git a/examples/ssl/Jamfile.v2 b/examples/ssl/Jamfile.v2 index ecd6eda1..b35e16f2 100644 --- a/examples/ssl/Jamfile.v2 +++ b/examples/ssl/Jamfile.v2 @@ -47,3 +47,8 @@ exe http-ssl-example : http_ssl_example.cpp ; + +exe websocket-ssl-example + : + websocket_ssl_example.cpp + ; diff --git a/examples/ssl/websocket_ssl_example.cpp b/examples/ssl/websocket_ssl_example.cpp new file mode 100644 index 00000000..b83e045b --- /dev/null +++ b/examples/ssl/websocket_ssl_example.cpp @@ -0,0 +1,49 @@ +// +// Copyright (c) 2013-2016 Vinnie Falco (vinnie dot falco at gmail dot com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +#include +#include +#include +#include +#include +#include +#include + +int main() +{ + using boost::asio::connect; + using socket = boost::asio::ip::tcp::socket; + using resolver = boost::asio::ip::tcp::resolver; + using io_service = boost::asio::io_service; + namespace ssl = boost::asio::ssl; + + // Normal boost::asio setup + std::string const host = "echo.websocket.org"; + io_service ios; + resolver r{ios}; + socket sock{ios}; + connect(sock, r.resolve(resolver::query{host, "https"})); + + // Perform SSL handshaking + using stream_type = ssl::stream; + ssl::context ctx{ssl::context::sslv23}; + stream_type stream{sock, ctx}; + stream.set_verify_mode(ssl::verify_none); + stream.handshake(ssl::stream_base::client); + + // Secure WebSocket connect and send message using Beast + beast::websocket::stream ws{stream}; + ws.handshake(host, "/"); + ws.write(boost::asio::buffer("Hello, world!")); + + // Receive Secure WebSocket message, print and close using Beast + beast::streambuf sb; + beast::websocket::opcode op; + ws.read(op, sb); + ws.close(beast::websocket::close_code::normal); + std::cout << to_string(sb.data()) << "\n"; +}