Skip to content

Commit 4f3bb4b

Browse files
author
pfeatherstone
committed
- async_ws_handshake() takes string_view objects
- some refactoring in client_ws examples
1 parent 4d28ca4 commit 4f3bb4b

File tree

3 files changed

+60
-57
lines changed

3 files changed

+60
-57
lines changed

examples/client_ws_awaitable.cpp

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -32,22 +32,28 @@ using namespace std::chrono_literals;
3232
//----------------------------------------------------------------------------------------------------------------
3333
//----------------------------------------------------------------------------------------------------------------
3434

35-
awaitable_strand ws_session(std::string host, uint16_t port, std::string msg)
35+
awaitable_strand read_write_one(auto& sock, std::string_view host, std::vector<char>& buf)
36+
{
37+
constexpr bool is_server{false};
38+
constexpr bool is_text{false};
39+
co_await http::async_ws_handshake(sock, host, "/ws");
40+
co_await http::async_ws_write(sock, buf, is_text, is_server);
41+
co_await http::async_ws_read(sock, buf, is_server);
42+
co_await http::async_ws_close(sock, http::ws_going_away, is_server);
43+
}
44+
45+
awaitable_strand ws_session(std::string_view host, uint16_t port, std::string_view msg)
3646
{
3747
try
3848
{
39-
// Connect
40-
tcp_socket sock(co_await boost::asio::this_coro::executor);
41-
tcp::resolver resolver(sock.get_executor());
42-
std::vector<char> buf(begin(msg), end(msg));
43-
size_t ret{};
49+
// Objects
50+
tcp_socket sock(co_await boost::asio::this_coro::executor);
51+
tcp::resolver resolver(sock.get_executor());
52+
std::vector<char> buf(begin(msg), end(msg));
4453

4554
// Async IO
4655
co_await boost::asio::async_connect(sock, co_await resolver.async_resolve(host, std::to_string(port)), boost::asio::cancel_after(5s));
47-
co_await http::async_ws_handshake(sock, host, "/ws");
48-
ret = co_await http::async_ws_write(sock, buf, true, false);
49-
ret = co_await http::async_ws_read(sock, buf, false);
50-
co_await http::async_ws_close(sock, http::ws_going_away, false);
56+
co_await read_write_one(sock, host, buf);
5157

5258
// Print echo
5359
printf("Server echoed back\n\"%.*s\"\n", (int)buf.size(), buf.data());
@@ -59,32 +65,27 @@ awaitable_strand ws_session(std::string host, uint16_t port, std::string msg)
5965
}
6066
}
6167

62-
awaitable_strand ws_ssl_session(std::string host, uint16_t port, std::string msg)
68+
awaitable_strand ws_ssl_session(std::string_view host, uint16_t port, std::string_view msg)
6369
{
6470
try
6571
{
66-
// SSL
72+
// Objects
6773
boost::asio::ssl::context ssl(boost::asio::ssl::context::tlsv12_client);
6874
ssl.set_verify_callback([](bool preverified, boost::asio::ssl::verify_context& ctx) {return true;});
6975
ssl.set_verify_mode(boost::asio::ssl::verify_peer);
7076

71-
// Connect
72-
tls_socket sock(tcp_socket(co_await boost::asio::this_coro::executor), ssl);
73-
tcp::resolver resolver(sock.get_executor());
74-
std::vector<char> buf(begin(msg), end(msg));
75-
size_t ret{};
77+
tls_socket sock(tcp_socket(co_await boost::asio::this_coro::executor), ssl);
78+
tcp::resolver resolver(sock.get_executor());
79+
std::vector<char> buf(begin(msg), end(msg));
7680

7781
// Async IO
7882
co_await boost::asio::async_connect(sock.next_layer(), co_await resolver.async_resolve(host, std::to_string(port)), boost::asio::cancel_after(5s));
7983
co_await sock.async_handshake(boost::asio::ssl::stream_base::client);
80-
co_await http::async_ws_handshake(sock, host, "/ws");
81-
ret = co_await http::async_ws_write(sock, buf, true, false);
82-
ret = co_await http::async_ws_read(sock, buf, false);
83-
co_await http::async_ws_close(sock, http::ws_going_away, false);
84+
co_await read_write_one(sock, host, buf);
8485
co_await sock.async_shutdown();
8586

8687
// Print echo
87-
printf("Server echoed back\n\"%.*s\"\n", (int)buf.size(), buf.data());
88+
printf("TLS server echoed back\n\"%.*s\"\n", (int)buf.size(), buf.data());
8889
}
8990
catch(const boost::system::system_error& e)
9091
{
@@ -98,7 +99,7 @@ int main(int argc, char* argv[])
9899
std::string host;
99100
uint16_t port;
100101
std::string msg;
101-
bool use_tls;
102+
bool use_tls{};
102103
CLI::App app{"WebSocket echo client"};
103104
try{
104105
app.add_option("--host", host, "Host or IP address of WebSocket server")->required();

examples/client_ws_coro.cpp

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44
#include <boost/asio/connect.hpp>
55
#include <boost/asio/detached.hpp>
66
#include <boost/asio/io_context.hpp>
7+
#include <boost/asio/ip/tcp.hpp>
78
#include <boost/asio/spawn.hpp>
89
#include <boost/asio/ssl/context.hpp>
910
#include <boost/asio/ssl/stream.hpp>
1011
#include <boost/asio/strand.hpp>
11-
#include <boost/asio/ip/tcp.hpp>
1212
#include <boost/asio/version.hpp>
1313
#include <http_async.h>
1414
#include "extra/CLI11.hpp"
@@ -34,22 +34,29 @@ using namespace std::chrono_literals;
3434
//----------------------------------------------------------------------------------------------------------------
3535
//----------------------------------------------------------------------------------------------------------------
3636

37-
void ws_session(std::string host, uint16_t port, std::string msg, yield_context_strand yield)
37+
template<class Sock>
38+
void read_write_one(Sock& sock, std::string_view host, std::vector<char>& buf, yield_context_strand yield)
39+
{
40+
constexpr bool is_server{false};
41+
constexpr bool is_text{false};
42+
http::async_ws_handshake(sock, host, "/ws", yield);
43+
http::async_ws_write(sock, buf, is_text, is_server, yield);
44+
http::async_ws_read(sock, buf, is_server, yield);
45+
http::async_ws_close(sock, http::ws_going_away, is_server, yield);
46+
}
47+
48+
void ws_session(std::string_view host, uint16_t port, std::string_view msg, yield_context_strand yield)
3849
{
3950
try
4051
{
41-
// Connect
42-
tcp_socket sock(yield.get_executor());
43-
tcp::resolver resolver(sock.get_executor());
44-
std::vector<char> buf(begin(msg), end(msg));
45-
size_t ret{};
52+
// Objects
53+
tcp_socket sock(yield.get_executor());
54+
tcp::resolver resolver(sock.get_executor());
55+
std::vector<char> buf(begin(msg), end(msg));
4656

4757
// Async IO
4858
boost::asio::async_connect(sock, resolver.async_resolve(host, std::to_string(port), yield), boost::asio::cancel_after(5s, yield));
49-
http::async_ws_handshake(sock, host, "/ws", yield);
50-
ret = http::async_ws_write(sock, buf, true, false, yield);
51-
ret = http::async_ws_read(sock, buf, false, yield);
52-
http::async_ws_close(sock, http::ws_going_away, false, yield);
59+
read_write_one(sock, host, buf, yield);
5360

5461
// Print echo
5562
printf("Server echoed back\n\"%.*s\"\n", (int)buf.size(), buf.data());
@@ -61,32 +68,27 @@ void ws_session(std::string host, uint16_t port, std::string msg, yield_context_
6168
}
6269
}
6370

64-
void ws_ssl_session(std::string host, uint16_t port, std::string msg, yield_context_strand yield)
71+
void ws_ssl_session(std::string_view host, uint16_t port, std::string_view msg, yield_context_strand yield)
6572
{
6673
try
6774
{
68-
// SSL
75+
// Objects
6976
boost::asio::ssl::context ssl(boost::asio::ssl::context::tlsv12_client);
7077
ssl.set_verify_callback([](bool preverified, boost::asio::ssl::verify_context& ctx) {return true;});
7178
ssl.set_verify_mode(boost::asio::ssl::verify_peer);
7279

73-
// Connect
74-
tls_socket sock(tcp_socket(yield.get_executor()), ssl);
75-
tcp::resolver resolver(sock.get_executor());
76-
std::vector<char> buf(begin(msg), end(msg));
77-
size_t ret{};
80+
tls_socket sock(tcp_socket(yield.get_executor()), ssl);
81+
tcp::resolver resolver(sock.get_executor());
82+
std::vector<char> buf(begin(msg), end(msg));
7883

7984
// Async IO
8085
boost::asio::async_connect(sock.next_layer(), resolver.async_resolve(host, std::to_string(port), yield), boost::asio::cancel_after(5s, yield));
8186
sock.async_handshake(boost::asio::ssl::stream_base::client, yield);
82-
http::async_ws_handshake(sock, host, "/ws", yield);
83-
ret = http::async_ws_write(sock, buf, true, false, yield);
84-
ret = http::async_ws_read(sock, buf, false, yield);
85-
http::async_ws_close(sock, http::ws_going_away, false, yield);
87+
read_write_one(sock, host, buf, yield);
8688
sock.async_shutdown(yield);
8789

8890
// Print echo
89-
printf("Server echoed back\n\"%.*s\"\n", (int)buf.size(), buf.data());
91+
printf("TLS server echoed back\n\"%.*s\"\n", (int)buf.size(), buf.data());
9092
}
9193
catch(const boost::system::system_error& e)
9294
{
@@ -100,7 +102,7 @@ int main(int argc, char* argv[])
100102
std::string host;
101103
uint16_t port;
102104
std::string msg;
103-
bool use_tls;
105+
bool use_tls{};
104106
CLI::App app{"WebSocket echo client"};
105107
try{
106108
app.add_option("--host", host, "Host or IP address of WebSocket server")->required();

src/http_async.h

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,8 @@ namespace http
8585
>
8686
auto async_ws_handshake (
8787
AsyncStream& sock,
88-
std::string host,
89-
std::string uri,
88+
std::string_view host,
89+
std::string_view uri,
9090
CompletionToken&& token = boost::asio::default_completion_token_t<typename AsyncStream::executor_type>()
9191
);
9292

@@ -486,12 +486,12 @@ namespace http
486486
enum {send_request, read_response, parse_response} state{send_request};
487487

488488
async_ws_handshake_impl (
489-
AsyncStream& sock_,
490-
std::string uri_,
491-
std::string host_
489+
AsyncStream& sock_,
490+
std::string_view uri_,
491+
std::string_view host_
492492
) : sock{sock_},
493-
uri{std::move(uri_)},
494-
host{std::move(host_)}
493+
uri{uri_},
494+
host{host_}
495495
{
496496
}
497497

@@ -564,13 +564,13 @@ namespace http
564564
>
565565
inline auto async_ws_handshake (
566566
AsyncStream& sock,
567-
std::string host,
568-
std::string uri,
567+
std::string_view host,
568+
std::string_view uri,
569569
CompletionToken&& token
570570
)
571571
{
572572
return boost::asio::async_compose<CompletionToken, void(boost::system::error_code)> (
573-
details::async_ws_handshake_impl{sock, std::move(host), std::move(uri)},
573+
details::async_ws_handshake_impl{sock, host, uri},
574574
token, sock
575575
);
576576
}

0 commit comments

Comments
 (0)