Skip to content

Commit 02df0c3

Browse files
author
pfeatherstone
committed
fixed. Do i like the new http::stream<> wrapper? I was kind of hoping i wouldn't need it...
1 parent bab1c6a commit 02df0c3

File tree

8 files changed

+691
-635
lines changed

8 files changed

+691
-635
lines changed

examples/client_http.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ using boost::asio::detached;
2222
using boost::asio::ip::tcp;
2323
using boost::asio::make_strand;
2424
using tcp_socket = boost::asio::basic_stream_socket<tcp, boost::asio::strand<boost::asio::io_context::executor_type>>;
25+
using http_socket = http::stream<tcp_socket>;
2526
using awaitable = boost::asio::awaitable<void, boost::asio::io_context::executor_type>;
2627
using awaitable_strand = boost::asio::awaitable<void, boost::asio::strand<boost::asio::io_context::executor_type>>;
2728
using namespace std::chrono_literals;
@@ -55,11 +56,10 @@ awaitable_strand http_session(std::string_view host)
5556
try
5657
{
5758
// Connect
58-
tcp_socket sock(co_await boost::asio::this_coro::executor);
59+
http_socket sock(tcp_socket{co_await boost::asio::this_coro::executor}, false);
5960
tcp::resolver resolver(sock.get_executor());
6061
http::request req;
6162
http::response resp;
62-
std::string buf;
6363
size_t ret{};
6464

6565
// Prepare request
@@ -69,9 +69,9 @@ awaitable_strand http_session(std::string_view host)
6969
req.add_header(http::user_agent, "Boost::asio " + std::to_string(BOOST_ASIO_VERSION)); // optional header
7070

7171
// Async IO
72-
co_await boost::asio::async_connect(sock, co_await resolver.async_resolve(host, "80"), boost::asio::cancel_after(5s, deferred));
73-
ret = co_await http::async_http_write(sock, req, buf);
74-
ret = co_await http::async_http_read(sock, resp, buf);
72+
co_await boost::asio::async_connect(sock.next_layer(), co_await resolver.async_resolve(host, "80"), boost::asio::cancel_after(5s, deferred));
73+
ret = co_await http::async_http_write(sock, req);
74+
ret = co_await http::async_http_read(sock, resp);
7575

7676
// Print response
7777
print_header(resp);

examples/client_ws_awaitable.cpp

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ using boost::asio::ip::tcp;
2323
using boost::asio::make_strand;
2424
using tcp_socket = boost::asio::basic_stream_socket<tcp, boost::asio::strand<boost::asio::io_context::executor_type>>;
2525
using tls_socket = boost::asio::ssl::stream<tcp_socket>;
26+
using http_socket = http::stream<tcp_socket>;
27+
using https_socket = http::stream<tls_socket>;
2628
using awaitable_strand = boost::asio::awaitable<void, boost::asio::strand<boost::asio::io_context::executor_type>>;
2729
using namespace std::chrono_literals;
2830

@@ -32,27 +34,26 @@ using namespace std::chrono_literals;
3234
//----------------------------------------------------------------------------------------------------------------
3335
//----------------------------------------------------------------------------------------------------------------
3436

35-
awaitable_strand read_write_one(auto& sock, std::string_view host, std::vector<char>& buf)
37+
awaitable_strand read_write_one(auto& sock, std::string_view host, std::vector<char>& msg)
3638
{
37-
constexpr bool is_server{false};
3839
constexpr bool is_text{false};
3940
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);
41+
co_await http::async_ws_write(sock, msg, is_text);
42+
co_await http::async_ws_read(sock, msg);
43+
co_await http::async_ws_close(sock, http::ws_going_away);
4344
}
4445

4546
awaitable_strand ws_session(std::string_view host, uint16_t port, std::string_view msg)
4647
{
4748
try
4849
{
4950
// Objects
50-
tcp_socket sock(co_await boost::asio::this_coro::executor);
51+
http_socket sock(tcp_socket(co_await boost::asio::this_coro::executor), false);
5152
tcp::resolver resolver(sock.get_executor());
5253
std::vector<char> buf(begin(msg), end(msg));
5354

5455
// Async IO
55-
co_await boost::asio::async_connect(sock, co_await resolver.async_resolve(host, std::to_string(port)), boost::asio::cancel_after(5s));
56+
co_await boost::asio::async_connect(sock.lowest_layer(), co_await resolver.async_resolve(host, std::to_string(port)), boost::asio::cancel_after(5s));
5657
co_await read_write_one(sock, host, buf);
5758

5859
// Print echo
@@ -74,15 +75,15 @@ awaitable_strand ws_ssl_session(std::string_view host, uint16_t port, std::strin
7475
ssl.set_verify_callback([](bool preverified, boost::asio::ssl::verify_context& ctx) {return true;});
7576
ssl.set_verify_mode(boost::asio::ssl::verify_peer);
7677

77-
tls_socket sock(tcp_socket(co_await boost::asio::this_coro::executor), ssl);
78+
https_socket sock(tls_socket(co_await boost::asio::this_coro::executor, ssl), false);
7879
tcp::resolver resolver(sock.get_executor());
7980
std::vector<char> buf(begin(msg), end(msg));
8081

8182
// Async IO
82-
co_await boost::asio::async_connect(sock.next_layer(), co_await resolver.async_resolve(host, std::to_string(port)), boost::asio::cancel_after(5s));
83-
co_await sock.async_handshake(boost::asio::ssl::stream_base::client);
83+
co_await boost::asio::async_connect(sock.lowest_layer(), co_await resolver.async_resolve(host, std::to_string(port)), boost::asio::cancel_after(5s));
84+
co_await sock.next_layer().async_handshake(boost::asio::ssl::stream_base::client);
8485
co_await read_write_one(sock, host, buf);
85-
co_await sock.async_shutdown();
86+
co_await sock.next_layer().async_shutdown();
8687

8788
// Print echo
8889
printf("TLS server echoed back\n\"%.*s\"\n", (int)buf.size(), buf.data());

examples/client_ws_coro.cpp

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ using boost::asio::ip::tcp;
2525
using boost::asio::make_strand;
2626
using tcp_socket = boost::asio::basic_stream_socket<tcp, boost::asio::strand<boost::asio::io_context::executor_type>>;
2727
using tls_socket = boost::asio::ssl::stream<tcp_socket>;
28+
using http_socket = http::stream<tcp_socket>;
29+
using https_socket = http::stream<tls_socket>;
2830
using yield_context_strand = boost::asio::basic_yield_context<boost::asio::strand<boost::asio::io_context::executor_type>>;
2931
using namespace std::chrono_literals;
3032

@@ -35,27 +37,26 @@ using namespace std::chrono_literals;
3537
//----------------------------------------------------------------------------------------------------------------
3638

3739
template<class Sock>
38-
void read_write_one(Sock& sock, std::string_view host, std::vector<char>& buf, yield_context_strand yield)
40+
void read_write_one(Sock& sock, std::string_view host, std::vector<char>& msg, yield_context_strand yield)
3941
{
40-
constexpr bool is_server{false};
4142
constexpr bool is_text{false};
4243
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);
44+
http::async_ws_write(sock, msg, is_text, yield);
45+
http::async_ws_read(sock, msg, yield);
46+
http::async_ws_close(sock, http::ws_going_away, yield);
4647
}
4748

4849
void ws_session(std::string_view host, uint16_t port, std::string_view msg, yield_context_strand yield)
4950
{
5051
try
5152
{
5253
// Objects
53-
tcp_socket sock(yield.get_executor());
54+
http_socket sock(tcp_socket(yield.get_executor()), false);
5455
tcp::resolver resolver(sock.get_executor());
5556
std::vector<char> buf(begin(msg), end(msg));
5657

5758
// Async IO
58-
boost::asio::async_connect(sock, resolver.async_resolve(host, std::to_string(port), yield), boost::asio::cancel_after(5s, yield));
59+
boost::asio::async_connect(sock.lowest_layer(), resolver.async_resolve(host, std::to_string(port), yield), boost::asio::cancel_after(5s, yield));
5960
read_write_one(sock, host, buf, yield);
6061

6162
// Print echo
@@ -77,15 +78,15 @@ void ws_ssl_session(std::string_view host, uint16_t port, std::string_view msg,
7778
ssl.set_verify_callback([](bool preverified, boost::asio::ssl::verify_context& ctx) {return true;});
7879
ssl.set_verify_mode(boost::asio::ssl::verify_peer);
7980

80-
tls_socket sock(tcp_socket(yield.get_executor()), ssl);
81+
https_socket sock(tls_socket(yield.get_executor(), ssl), false);
8182
tcp::resolver resolver(sock.get_executor());
8283
std::vector<char> buf(begin(msg), end(msg));
8384

8485
// Async IO
85-
boost::asio::async_connect(sock.next_layer(), resolver.async_resolve(host, std::to_string(port), yield), boost::asio::cancel_after(5s, yield));
86-
sock.async_handshake(boost::asio::ssl::stream_base::client, yield);
86+
boost::asio::async_connect(sock.lowest_layer(), resolver.async_resolve(host, std::to_string(port), yield), boost::asio::cancel_after(5s, yield));
87+
sock.next_layer().async_handshake(boost::asio::ssl::stream_base::client, yield);
8788
read_write_one(sock, host, buf, yield);
88-
sock.async_shutdown(yield);
89+
sock.next_layer().async_shutdown(yield);
8990

9091
// Print echo
9192
printf("TLS server echoed back\n\"%.*s\"\n", (int)buf.size(), buf.data());

examples/server.cpp

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ using boost::asio::make_strand;
2727
using tcp_acceptor = boost::asio::basic_socket_acceptor<tcp, boost::asio::io_context::executor_type>;
2828
using tcp_socket = boost::asio::basic_stream_socket<tcp, boost::asio::strand<boost::asio::io_context::executor_type>>;
2929
using tls_socket = boost::asio::ssl::stream<tcp_socket>;
30+
using http_socket = http::stream<tcp_socket>;
31+
using https_socket = http::stream<tls_socket>;
3032
using awaitable = boost::asio::awaitable<void, boost::asio::io_context::executor_type>;
3133
using awaitable_strand = boost::asio::awaitable<void, boost::asio::strand<boost::asio::io_context::executor_type>>;
3234
namespace fs = std::filesystem;
@@ -273,7 +275,7 @@ awaitable_strand websocket_write_loop(std::shared_ptr<websocket_impl<Socket>> ws
273275
{
274276
auto buf = std::move(ws->buf_write_queue.front());
275277
ws->buf_write_queue.erase(begin(ws->buf_write_queue));
276-
co_await http::async_ws_write(ws->sock, buf.data, buf.is_text, true);
278+
co_await http::async_ws_write(ws->sock, buf.data, buf.is_text);
277279
}
278280
}
279281
catch(const std::exception& e)
@@ -285,15 +287,15 @@ awaitable_strand websocket_write_loop(std::shared_ptr<websocket_impl<Socket>> ws
285287

286288
template<class Socket>
287289
awaitable_strand websocket_session (
288-
Socket sock,
290+
http::stream<Socket> sock,
289291
http::request req,
290292
const ws_handlers_t& handlers,
291293
std::shared_ptr<void> ctx
292294
)
293295
{
294296
// Move into shared state
295-
auto state = std::make_shared<websocket_impl<Socket>>(std::move(sock), ctx);
296-
std::vector<char> buf;
297+
auto state = std::make_shared<websocket_impl<http::stream<Socket>>>(std::move(sock), ctx);
298+
std::vector<char> msg;
297299

298300
try
299301
{
@@ -304,8 +306,8 @@ awaitable_strand websocket_session (
304306
for(;;)
305307
{
306308
// Read
307-
const bool is_text = co_await http::async_ws_read(state->sock, buf, true);
308-
handlers.on_data(state, buf.data(), buf.size(), is_text);
309+
const bool is_text = co_await http::async_ws_read(state->sock, msg);
310+
handlers.on_data(state, msg.data(), msg.size(), is_text);
309311
}
310312
}
311313
catch(const std::exception& e)
@@ -325,7 +327,7 @@ awaitable_strand websocket_session (
325327

326328
template<class Socket>
327329
awaitable_strand http_session (
328-
Socket sock,
330+
http::stream<Socket> sock,
329331
const api_options& options,
330332
std::shared_ptr<void> ctx
331333
)
@@ -334,16 +336,15 @@ awaitable_strand http_session (
334336
{
335337
http::request req;
336338
http::response resp;
337-
std::string buf;
338339

339340
// Complete TLS handshake if SSL
340341
if constexpr(std::is_same_v<Socket, tls_socket>)
341-
co_await sock.async_handshake(boost::asio::ssl::stream_base::server);
342+
co_await sock.next_layer().async_handshake(boost::asio::ssl::stream_base::server);
342343

343344
for (;;)
344345
{
345346
// Read request
346-
size_t res = co_await http::async_http_read(sock, req, buf);
347+
size_t res = co_await http::async_http_read(sock, req);
347348

348349
// Manage websocket
349350
if (req.is_websocket_req())
@@ -362,13 +363,13 @@ awaitable_strand http_session (
362363
handle_request(options.docroot, options.username, options.password, options.http_handlers, req, resp);
363364

364365
// Write response
365-
res = co_await async_http_write(sock, resp, buf);
366+
res = co_await async_http_write(sock, resp);
366367

367368
// Shutdown if necessary
368369
if(!keep_alive)
369370
{
370371
if constexpr(std::is_same_v<Socket, tls_socket>)
371-
co_await sock.async_shutdown();
372+
co_await sock.next_layer().async_shutdown();
372373
sock.lowest_layer().shutdown(tcp_socket::shutdown_both);
373374
break;
374375
}
@@ -418,14 +419,9 @@ awaitable listen (
418419
tcp_socket sock = co_await acceptor.async_accept(make_strand(ioc));
419420

420421
if (options.use_tls)
421-
{
422-
tls_socket tls_sock{std::move(sock), *ssl};
423-
co_spawn(sock.get_executor(), http_session(std::move(tls_sock), options, ssl), detached);
424-
}
422+
co_spawn(sock.get_executor(), http_session(https_socket(tls_socket(std::move(sock), *ssl), true), options, ssl), detached);
425423
else
426-
{
427-
co_spawn(sock.get_executor(), http_session(std::move(sock), options, nullptr), detached);
428-
}
424+
co_spawn(sock.get_executor(), http_session(http_socket(std::move(sock), true), options, nullptr), detached);
429425
}
430426
}
431427

0 commit comments

Comments
 (0)