guix_mirror_bot pushed a commit to branch master
in repository guix.
commit f3fcd6687887d4b588aeb9c225e78801a7913cce
Author: Steve George <[email protected]>
AuthorDate: Fri Feb 13 22:46:40 2026 +0000
gnu: Add websocketpp-next to be compatible with Boost 1.87+.
* gnu/packages/web.scm (websocketpp-next): New variable.
[source]: Add patch for Boost compatibility. Remove old cmake
compatibility patch.
* gnu/packages/patches/websocketpp-boost-compat.patch: New file.
Change-Id: I333ff55e17ee9c490819fc9ee8fb5e81e57d54e4
Signed-off-by: Steve George <[email protected]>
---
.../patches/websocketpp-boost-compat.patch | 2612 ++++++++++++++++++++
gnu/packages/web.scm | 39 +
2 files changed, 2651 insertions(+)
diff --git a/gnu/packages/patches/websocketpp-boost-compat.patch
b/gnu/packages/patches/websocketpp-boost-compat.patch
new file mode 100644
index 0000000000..7f4d65fe87
--- /dev/null
+++ b/gnu/packages/patches/websocketpp-boost-compat.patch
@@ -0,0 +1,2612 @@
+# Taken from: https://github.com/zaphoyd/websocketpp/issues/1157
+# https://github.com/zaphoyd/websocketpp/pull/1164
+From 146925c2404655dbb61b9a18e57692bfc18eb6c6 Mon Sep 17 00:00:00 2001
+From: Amini Allight <[email protected]>
+Date: Wed, 12 Feb 2025 03:53:35 +0000
+Subject: [PATCH 1/8] fixed incompatibility with Boost 1.87 due to use of
+ previously-deprecated now-removed functionality
+
+---
+ SConstruct | 4 +-
+ docs/faq.dox | 12 +-
+ .../broadcast_server/broadcast_server.cpp | 2 +-
+ examples/debug_client/debug_client.cpp | 2 +-
+ examples/debug_server/debug_server.cpp | 2 +-
+ examples/echo_client/echo_client.cpp | 2 +-
+ examples/echo_server/echo_server.cpp | 2 +-
+ .../echo_server_both/echo_server_both.cpp | 8 +-
+ examples/echo_server_tls/echo_server_tls.cpp | 2 +-
+ .../CMakeLists.txt | 2 +-
+ .../SConscript | 4 +-
+ .../external_io_context.cpp} | 14 +-
+ .../tcp_echo_server.hpp | 12 +-
+ examples/print_client/print_client.cpp | 2 +-
+ .../print_client_tls/print_client_tls.cpp | 2 +-
+ examples/scratch_server/scratch_server.cpp | 2 +-
+ examples/sip_client/sip_client.cpp | 2 +-
+ .../telemetry_client/telemetry_client.cpp | 4 +-
+ .../telemetry_server/telemetry_server.cpp | 2 +-
+ examples/testee_client/testee_client.cpp | 2 +-
+ examples/testee_server/testee_server.cpp | 2 +-
+ test/endpoint/endpoint.cpp | 6 +-
+ test/transport/asio/timers.cpp | 8 +-
+ test/transport/integration.cpp | 27 ++-
+ tutorials/utility_server/step1.cpp | 2 +-
+ tutorials/utility_server/step2.cpp | 2 +-
+ tutorials/utility_server/utility_server.md | 8 +-
+ websocketpp/roles/server_endpoint.hpp | 4 +-
+ websocketpp/transport/asio/base.hpp | 2 +-
+ websocketpp/transport/asio/connection.hpp | 44 ++---
+ websocketpp/transport/asio/endpoint.hpp | 186 +++++++++---------
+ websocketpp/transport/asio/security/none.hpp | 16 +-
+ websocketpp/transport/asio/security/tls.hpp | 20 +-
+ websocketpp/transport/debug/endpoint.hpp | 2 +-
+ websocketpp/transport/iostream/endpoint.hpp | 2 +-
+ websocketpp/transport/stub/endpoint.hpp | 2 +-
+ 36 files changed, 207 insertions(+), 210 deletions(-)
+ rename examples/{external_io_service => external_io_context}/CMakeLists.txt
(87%)
+ rename examples/{external_io_service => external_io_context}/SConscript (72%)
+ rename examples/{external_io_service/external_io_service.cpp =>
external_io_context/external_io_context.cpp} (93%)
+ rename examples/{external_io_service =>
external_io_context}/tcp_echo_server.hpp (92%)
+
+diff --git a/SConstruct b/SConstruct
+index c5ae19369..f87e4e8b9 100644
+--- a/SConstruct
++++ b/SConstruct
+@@ -273,8 +273,8 @@ subprotocol_server =
SConscript('#/examples/subprotocol_server/SConscript',varia
+ # telemetry_server
+ telemetry_server =
SConscript('#/examples/telemetry_server/SConscript',variant_dir = builddir +
'telemetry_server',duplicate = 0)
+
+-# external_io_service
+-external_io_service =
SConscript('#/examples/external_io_service/SConscript',variant_dir = builddir +
'external_io_service',duplicate = 0)
++# external_io_context
++external_io_context =
SConscript('#/examples/external_io_context/SConscript',variant_dir = builddir +
'external_io_context',duplicate = 0)
+
+ if not env['PLATFORM'].startswith('win'):
+ # iostream_server
+diff --git a/docs/faq.dox b/docs/faq.dox
+index 9f417ec41..c89e85b61 100644
+--- a/docs/faq.dox
++++ b/docs/faq.dox
+@@ -29,19 +29,19 @@ Note: some browsers will allow the connection to continue
if they requested a su
+
+ ### How do I cleanly exit an Asio transport based program
+
+-The Asio transport based clients and servers use the Asio library's
underlying `io_service` to handle asyncronous networking operations. The
standard behavior of the io_service is to run until there are no async
operations left and then return. WebSocket++, when using the Asio transport,
behaves like a standard Asio application. If you want your WebSocket++/Asio
based program to stop network operations and cleanly close all sockets you will
want to do the following:
++The Asio transport based clients and servers use the Asio library's
underlying `io_context` to handle asyncronous networking operations. The
standard behavior of the io_context is to run until there are no async
operations left and then return. WebSocket++, when using the Asio transport,
behaves like a standard Asio application. If you want your WebSocket++/Asio
based program to stop network operations and cleanly close all sockets you will
want to do the following:
+
+ - For servers, call `websocketpp::transport::asio::endpoint::stop_listening`
to initiate the closing of the server listening socket.
+ - For clients, if you have engaged perpetual mode with
`websocketpp::transport::asio::endpoint::start_perpetual`, disable it with
`websocketpp::transport::asio::endpoint::stop_perpetual`.
+ - For both, run `websocketpp::endpoint::close` or
`websocketpp::connection::close` on all currently outstanding connections. This
will initiate the WebSocket closing handshake for these connections
+-- Wait. Asio is asyncronous. When the calls to the above methods
(stop_listening, close, etc) complete the server *will still be listening*, the
connections *will still be active* until the io_service gets around to
asyncronously processing the socket and WebSocket protocol closing handshakes.
The `io_service::run` method will exit cleanly and automatically when all
operations are complete.
++- Wait. Asio is asyncronous. When the calls to the above methods
(stop_listening, close, etc) complete the server *will still be listening*, the
connections *will still be active* until the io_context gets around to
asyncronously processing the socket and WebSocket protocol closing handshakes.
The `io_context::run` method will exit cleanly and automatically when all
operations are complete.
+
+-__WARNING__: Asio's `io_service` has a method called `stop`. WebSocket++
wraps this method as `websocketpp::transport::asio::endpoint::stop`. While this
operation has a benign sounding name, it is a powerful and destructive
operation that should only be used in special cases. If you are using
`io_service::stop` or `endpoint::stop` without a very good reason your program
is likely broken and may exhibit erratic behavior. Specifically,
`io_service::stop` stops the processing of events ent [...]
++__WARNING__: Asio's `io_context` has a method called `stop`. WebSocket++
wraps this method as `websocketpp::transport::asio::endpoint::stop`. While this
operation has a benign sounding name, it is a powerful and destructive
operation that should only be used in special cases. If you are using
`io_context::stop` or `endpoint::stop` without a very good reason your program
is likely broken and may exhibit erratic behavior. Specifically,
`io_context::stop` stops the processing of events ent [...]
+
+ __Special cases__:
+-- If your client uses the `start_perpetual` method it will prevent the
io_service from exiting even if it has nothing to do. This is useful if you
want a client endpoint to idle in the background to allow new connections to be
formed on demand rather than generating a new endpoint for each.
+-- If you are using an external io_service and/or are placing non-WebSocket++
operations on the `io_service` those operations may keep the `io_service` open
even after all WebSocket++ operations have completed.
+-- If you are using `poll`/`poll_one`/`run_one` or otherwise manually driving
the `io_service` event loop you may need to adjust usage to make sure you are
correctly recognizing the "done with work" and "not done but idling /
`io_service::work`" cases.
++- If your client uses the `start_perpetual` method it will prevent the
io_context from exiting even if it has nothing to do. This is useful if you
want a client endpoint to idle in the background to allow new connections to be
formed on demand rather than generating a new endpoint for each.
++- If you are using an external io_context and/or are placing non-WebSocket++
operations on the `io_context` those operations may keep the `io_context` open
even after all WebSocket++ operations have completed.
++- If you are using `poll`/`poll_one`/`run_one` or otherwise manually driving
the `io_context` event loop you may need to adjust usage to make sure you are
correctly recognizing the "done with work" and "not done but idling /
`io_context::work`" cases.
+
+ ### Is there a way to check the validity of a `connection_hdl`?
+
+diff --git a/examples/broadcast_server/broadcast_server.cpp
b/examples/broadcast_server/broadcast_server.cpp
+index 35976d35a..efdd4edd4 100644
+--- a/examples/broadcast_server/broadcast_server.cpp
++++ b/examples/broadcast_server/broadcast_server.cpp
+@@ -75,7 +75,7 @@ class broadcast_server {
+ return;
+ }
+
+- // Start the ASIO io_service run loop
++ // Start the ASIO io_context run loop
+ //try {
+ m_server.run();
+ //} catch (const std::exception & e) {
+diff --git a/examples/debug_client/debug_client.cpp
b/examples/debug_client/debug_client.cpp
+index 457c24934..81c595b99 100644
+--- a/examples/debug_client/debug_client.cpp
++++ b/examples/debug_client/debug_client.cpp
+@@ -82,7 +82,7 @@ class perftest {
+
+ m_endpoint.connect(con);
+
+- // Start the ASIO io_service run loop
++ // Start the ASIO io_context run loop
+ m_start = std::chrono::high_resolution_clock::now();
+ m_endpoint.run();
+ }
+diff --git a/examples/debug_server/debug_server.cpp
b/examples/debug_server/debug_server.cpp
+index 8d1ff0ee6..3748800b5 100644
+--- a/examples/debug_server/debug_server.cpp
++++ b/examples/debug_server/debug_server.cpp
+@@ -162,7 +162,7 @@ int main() {
+ // Start the server accept loop
+ echo_server.start_accept();
+
+- // Start the ASIO io_service run loop
++ // Start the ASIO io_context run loop
+ echo_server.run();
+ } catch (websocketpp::exception const & e) {
+ std::cout << e.what() << std::endl;
+diff --git a/examples/echo_client/echo_client.cpp
b/examples/echo_client/echo_client.cpp
+index 59af6614f..88171d9fc 100644
+--- a/examples/echo_client/echo_client.cpp
++++ b/examples/echo_client/echo_client.cpp
+@@ -87,7 +87,7 @@ int main(int argc, char* argv[]) {
+ // exchanged until the event loop starts running in the next line.
+ c.connect(con);
+
+- // Start the ASIO io_service run loop
++ // Start the ASIO io_context run loop
+ // this will cause a single connection to be made to the server.
c.run()
+ // will exit when this connection is closed.
+ c.run();
+diff --git a/examples/echo_server/echo_server.cpp
b/examples/echo_server/echo_server.cpp
+index aca3f6a9a..2eb3634d8 100644
+--- a/examples/echo_server/echo_server.cpp
++++ b/examples/echo_server/echo_server.cpp
+@@ -62,7 +62,7 @@ int main() {
+ // Start the server accept loop
+ echo_server.start_accept(&on_end_accept);
+
+- // Start the ASIO io_service run loop
++ // Start the ASIO io_context run loop
+ echo_server.run();
+ } catch (websocketpp::exception const & e) {
+ std::cout << e.what() << std::endl;
+diff --git a/examples/echo_server_both/echo_server_both.cpp
b/examples/echo_server_both/echo_server_both.cpp
+index 06b50514a..a7e020401 100644
+--- a/examples/echo_server_both/echo_server_both.cpp
++++ b/examples/echo_server_both/echo_server_both.cpp
+@@ -65,13 +65,13 @@ context_ptr on_tls_init(websocketpp::connection_hdl hdl) {
+ }
+
+ int main() {
+- // set up an external io_service to run both endpoints on. This is not
++ // set up an external io_context to run both endpoints on. This is not
+ // strictly necessary, but simplifies thread management a bit.
+- boost::asio::io_service ios;
++ boost::asio::io_context ios;
+
+ // set up plain endpoint
+ server_plain endpoint_plain;
+- // initialize asio with our external io_service rather than an internal
one
++ // initialize asio with our external io_context rather than an internal
one
+ endpoint_plain.init_asio(&ios);
+ endpoint_plain.set_message_handler(
+ bind(&on_message<server_plain>,&endpoint_plain,::_1,::_2));
+@@ -89,6 +89,6 @@ int main() {
+ endpoint_tls.listen(443);
+ endpoint_tls.start_accept(&on_end_accept);
+
+- // Start the ASIO io_service run loop running both endpoints
++ // Start the ASIO io_context run loop running both endpoints
+ ios.run();
+ }
+diff --git a/examples/echo_server_tls/echo_server_tls.cpp
b/examples/echo_server_tls/echo_server_tls.cpp
+index ef14a4a22..e05680505 100644
+--- a/examples/echo_server_tls/echo_server_tls.cpp
++++ b/examples/echo_server_tls/echo_server_tls.cpp
+@@ -155,7 +155,7 @@ int main() {
+ // Start the server accept loop
+ echo_server.start_accept(&on_end_accept);
+
+- // Start the ASIO io_service run loop
++ // Start the ASIO io_context run loop
+ echo_server.run();
+
+ }
+diff --git a/examples/external_io_service/CMakeLists.txt
b/examples/external_io_context/CMakeLists.txt
+similarity index 87%
+rename from examples/external_io_service/CMakeLists.txt
+rename to examples/external_io_context/CMakeLists.txt
+index 5223da1be..a0e89ec96 100644
+--- a/examples/external_io_service/CMakeLists.txt
++++ b/examples/external_io_context/CMakeLists.txt
+@@ -2,7 +2,7 @@
+ file (GLOB SOURCE_FILES *.cpp)
+ file (GLOB HEADER_FILES *.hpp)
+
+-init_target (external_io_service)
++init_target (external_io_context)
+
+ build_executable (${TARGET_NAME} ${SOURCE_FILES} ${HEADER_FILES})
+
+diff --git a/examples/external_io_service/SConscript
b/examples/external_io_context/SConscript
+similarity index 72%
+rename from examples/external_io_service/SConscript
+rename to examples/external_io_context/SConscript
+index 0abf3e175..c6cd9740d 100644
+--- a/examples/external_io_service/SConscript
++++ b/examples/external_io_context/SConscript
+@@ -15,9 +15,9 @@ prgs = []
+ # if a C++11 environment is available build using that, otherwise use boost
+ if 'WSPP_CPP11_ENABLED' in env_cpp11:
+ ALL_LIBS = boostlibs(['system'],env_cpp11) + [platform_libs] +
[polyfill_libs]
+- prgs += env_cpp11.Program('external_io_service',
["external_io_service.cpp"], LIBS = ALL_LIBS)
++ prgs += env_cpp11.Program('external_io_context',
["external_io_context.cpp"], LIBS = ALL_LIBS)
+ else:
+ ALL_LIBS = boostlibs(['system'],env) + [platform_libs] + [polyfill_libs]
+- prgs += env.Program('external_io_service', ["external_io_service.cpp"],
LIBS = ALL_LIBS)
++ prgs += env.Program('external_io_context', ["external_io_context.cpp"],
LIBS = ALL_LIBS)
+
+ Return('prgs')
+diff --git a/examples/external_io_service/external_io_service.cpp
b/examples/external_io_context/external_io_context.cpp
+similarity index 93%
+rename from examples/external_io_service/external_io_service.cpp
+rename to examples/external_io_context/external_io_context.cpp
+index 6aa23985e..08ca8e9f8 100644
+--- a/examples/external_io_service/external_io_service.cpp
++++ b/examples/external_io_context/external_io_context.cpp
+@@ -66,10 +66,10 @@ void on_end_accept(error_code lib_ec, error_code trans_ec)
{
+ }
+
+ int main() {
+- asio::io_service service;
++ asio::io_context context;
+
+ // Add a TCP echo server on port 9003
+- tcp_echo_server custom_http_server(service, 9003);
++ tcp_echo_server custom_http_server(context, 9003);
+
+ // Add a WebSocket echo server on port 9002
+ ws_echo_server ws_server;
+@@ -77,8 +77,8 @@ int main() {
+ ws_server.clear_access_channels(websocketpp::log::alevel::frame_payload);
+
+ // The only difference in this code between an internal and external
+- // io_service is the different constructor to init_asio
+- ws_server.init_asio(&service);
++ // io_context is the different constructor to init_asio
++ ws_server.init_asio(&context);
+
+ // Register our message handler
+ ws_server.set_message_handler(bind(&on_message,&ws_server,::_1,::_2));
+@@ -87,6 +87,6 @@ int main() {
+
+ // TODO: add a timer?
+
+- // Start the Asio io_service run loop for all
+- service.run();
+-}
+\ No newline at end of file
++ // Start the Asio io_context run loop for all
++ context.run();
++}
+diff --git a/examples/external_io_service/tcp_echo_server.hpp
b/examples/external_io_context/tcp_echo_server.hpp
+similarity index 92%
+rename from examples/external_io_service/tcp_echo_server.hpp
+rename to examples/external_io_context/tcp_echo_server.hpp
+index ef4ce1855..2e14703f5 100644
+--- a/examples/external_io_service/tcp_echo_server.hpp
++++ b/examples/external_io_context/tcp_echo_server.hpp
+@@ -44,7 +44,7 @@ namespace asio = websocketpp::lib::asio;
+ struct tcp_echo_session :
websocketpp::lib::enable_shared_from_this<tcp_echo_session> {
+ typedef websocketpp::lib::shared_ptr<tcp_echo_session> ptr;
+
+- tcp_echo_session(asio::io_service & service) : m_socket(service) {}
++ tcp_echo_session(asio::io_context & context) : m_socket(context) {}
+
+ void start() {
+ m_socket.async_read_some(asio::buffer(m_buffer, sizeof(m_buffer)),
+@@ -72,15 +72,15 @@ struct tcp_echo_session :
websocketpp::lib::enable_shared_from_this<tcp_echo_ses
+ };
+
+ struct tcp_echo_server {
+- tcp_echo_server(asio::io_service & service, short port)
+- : m_service(service)
+- , m_acceptor(service, asio::ip::tcp::endpoint(asio::ip::tcp::v6(),
port))
++ tcp_echo_server(asio::io_context & context, short port)
++ : m_context(context)
++ , m_acceptor(context, asio::ip::tcp::endpoint(asio::ip::tcp::v6(),
port))
+ {
+ this->start_accept();
+ }
+
+ void start_accept() {
+- tcp_echo_session::ptr new_session(new tcp_echo_session(m_service));
++ tcp_echo_session::ptr new_session(new tcp_echo_session(m_context));
+ m_acceptor.async_accept(new_session->m_socket,
+ bind(&tcp_echo_server::handle_accept, this, new_session, _1));
+ }
+@@ -92,6 +92,6 @@ struct tcp_echo_server {
+ start_accept();
+ }
+
+- asio::io_service & m_service;
++ asio::io_context & m_context;
+ asio::ip::tcp::acceptor m_acceptor;
+ };
+diff --git a/examples/print_client/print_client.cpp
b/examples/print_client/print_client.cpp
+index 7ba6e5fc9..20a2bd3e8 100644
+--- a/examples/print_client/print_client.cpp
++++ b/examples/print_client/print_client.cpp
+@@ -68,7 +68,7 @@ int main(int argc, char* argv[]) {
+ // exchanged until the event loop starts running in the next line.
+ c.connect(con);
+
+- // Start the ASIO io_service run loop
++ // Start the ASIO io_context run loop
+ // this will cause a single connection to be made to the server.
c.run()
+ // will exit when this connection is closed.
+ c.run();
+diff --git a/examples/print_client_tls/print_client_tls.cpp
b/examples/print_client_tls/print_client_tls.cpp
+index 469d9c61e..43164eaf7 100644
+--- a/examples/print_client_tls/print_client_tls.cpp
++++ b/examples/print_client_tls/print_client_tls.cpp
+@@ -239,7 +239,7 @@ int main(int argc, char* argv[]) {
+
+ c.get_alog().write(websocketpp::log::alevel::app, "Connecting to " +
uri);
+
+- // Start the ASIO io_service run loop
++ // Start the ASIO io_context run loop
+ // this will cause a single connection to be made to the server.
c.run()
+ // will exit when this connection is closed.
+ c.run();
+diff --git a/examples/scratch_server/scratch_server.cpp
b/examples/scratch_server/scratch_server.cpp
+index 901ae8e5d..dab20b90d 100644
+--- a/examples/scratch_server/scratch_server.cpp
++++ b/examples/scratch_server/scratch_server.cpp
+@@ -94,7 +94,7 @@ int main(int argc, char * argv[]) {
+ // Start the server accept loop
+ echo_server.start_accept();
+
+- // Start the ASIO io_service run loop
++ // Start the ASIO io_context run loop
+ echo_server.run();
+ } catch (websocketpp::exception const & e) {
+ std::cout << e.what() << std::endl;
+diff --git a/examples/sip_client/sip_client.cpp
b/examples/sip_client/sip_client.cpp
+index 66fa85784..c9f33e771 100644
+--- a/examples/sip_client/sip_client.cpp
++++ b/examples/sip_client/sip_client.cpp
+@@ -69,7 +69,7 @@ int main(int argc, char* argv[]) {
+
+ sip_client.connect(con);
+
+- // Start the ASIO io_service run loop
++ // Start the ASIO io_context run loop
+ sip_client.run();
+
+ while(!received) {
+diff --git a/examples/telemetry_client/telemetry_client.cpp
b/examples/telemetry_client/telemetry_client.cpp
+index f0f7fae72..12390b821 100644
+--- a/examples/telemetry_client/telemetry_client.cpp
++++ b/examples/telemetry_client/telemetry_client.cpp
+@@ -62,10 +62,10 @@ class telemetry_client {
+ m_hdl = con->get_handle();
+
+ // Queue the connection. No DNS queries or network connections will be
+- // made until the io_service event loop is run.
++ // made until the io_context event loop is run.
+ m_client.connect(con);
+
+- // Create a thread to run the ASIO io_service event loop
++ // Create a thread to run the ASIO io_context event loop
+ websocketpp::lib::thread asio_thread(&client::run, &m_client);
+
+ // Create a thread to run the telemetry loop
+diff --git a/examples/telemetry_server/telemetry_server.cpp
b/examples/telemetry_server/telemetry_server.cpp
+index 22c155edf..9c576421a 100644
+--- a/examples/telemetry_server/telemetry_server.cpp
++++ b/examples/telemetry_server/telemetry_server.cpp
+@@ -69,7 +69,7 @@ class telemetry_server {
+ // Set the initial timer to start telemetry
+ set_timer();
+
+- // Start the ASIO io_service run loop
++ // Start the ASIO io_context run loop
+ try {
+ m_endpoint.run();
+ } catch (websocketpp::exception const & e) {
+diff --git a/examples/testee_client/testee_client.cpp
b/examples/testee_client/testee_client.cpp
+index b66e63353..12583e559 100644
+--- a/examples/testee_client/testee_client.cpp
++++ b/examples/testee_client/testee_client.cpp
+@@ -117,7 +117,7 @@ int main(int argc, char* argv[]) {
+ client::connection_ptr con = c.get_connection(uri+"/getCaseCount",
ec);
+ c.connect(con);
+
+- // Start the ASIO io_service run loop
++ // Start the ASIO io_context run loop
+ c.run();
+
+ std::cout << "case count: " << case_count << std::endl;
+diff --git a/examples/testee_server/testee_server.cpp
b/examples/testee_server/testee_server.cpp
+index cf876f7e1..7ff1b050f 100644
+--- a/examples/testee_server/testee_server.cpp
++++ b/examples/testee_server/testee_server.cpp
+@@ -131,7 +131,7 @@ int main(int argc, char * argv[]) {
+ // Start the server accept loop
+ testee_server.start_accept(&on_end_accept);
+
+- // Start the ASIO io_service run loop
++ // Start the ASIO io_context run loop
+ if (num_threads == 1) {
+ testee_server.run();
+ } else {
+diff --git a/test/endpoint/endpoint.cpp b/test/endpoint/endpoint.cpp
+index b4c429ebc..fa58e6678 100644
+--- a/test/endpoint/endpoint.cpp
++++ b/test/endpoint/endpoint.cpp
+@@ -53,7 +53,7 @@ BOOST_AUTO_TEST_CASE( initialize_server_asio ) {
+
+ BOOST_AUTO_TEST_CASE( initialize_server_asio_external ) {
+ websocketpp::server<websocketpp::config::asio> s;
+- boost::asio::io_service ios;
++ boost::asio::io_context ios;
+ s.init_asio(&ios);
+ }
+
+@@ -141,8 +141,8 @@ BOOST_AUTO_TEST_CASE( listen_after_listen_failure ) {
+ server1.init_asio();
+ server2.init_asio();
+
+- boost::asio::ip::tcp::endpoint
ep1(boost::asio::ip::address::from_string("127.0.0.1"), 12345);
+- boost::asio::ip::tcp::endpoint
ep2(boost::asio::ip::address::from_string("127.0.0.1"), 23456);
++ boost::asio::ip::tcp::endpoint
ep1(boost::asio::ip::make_address("127.0.0.1"), 12345);
++ boost::asio::ip::tcp::endpoint
ep2(boost::asio::ip::make_address("127.0.0.1"), 23456);
+
+ server1.listen(ep1, ec);
+ BOOST_CHECK(!ec);
+diff --git a/test/transport/asio/timers.cpp b/test/transport/asio/timers.cpp
+index aa03d6189..391b755ff 100644
+--- a/test/transport/asio/timers.cpp
++++ b/test/transport/asio/timers.cpp
+@@ -54,9 +54,9 @@ void run_dummy_server(int port) {
+ using boost::asio::ip::tcp;
+
+ try {
+- boost::asio::io_service io_service;
+- tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v6(), port));
+- tcp::socket socket(io_service);
++ boost::asio::io_context io_context;
++ tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v6(), port));
++ tcp::socket socket(io_context);
+
+ acceptor.accept(socket);
+ for (;;) {
+@@ -79,7 +79,7 @@ void run_dummy_server(int port) {
+
+ // Wait for the specified time period then fail the test
+ void run_test_timer(long value) {
+- boost::asio::io_service ios;
++ boost::asio::io_context ios;
+ boost::asio::deadline_timer t(ios,boost::posix_time::milliseconds(value));
+ boost::system::error_code ec;
+ t.wait(ec);
+diff --git a/test/transport/integration.cpp b/test/transport/integration.cpp
+index c083cfd01..ab82b1ab6 100644
+--- a/test/transport/integration.cpp
++++ b/test/transport/integration.cpp
+@@ -221,9 +221,9 @@ void run_dummy_server(int port) {
+ using boost::asio::ip::tcp;
+
+ try {
+- boost::asio::io_service io_service;
+- tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v6(), port));
+- tcp::socket socket(io_service);
++ boost::asio::io_context io_context;
++ tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v6(), port));
++ tcp::socket socket(io_context);
+
+ acceptor.accept(socket);
+ for (;;) {
+@@ -248,13 +248,12 @@ void run_dummy_client(std::string port) {
+ using boost::asio::ip::tcp;
+
+ try {
+- boost::asio::io_service io_service;
+- tcp::resolver resolver(io_service);
+- tcp::resolver::query query("localhost", port);
+- tcp::resolver::iterator iterator = resolver.resolve(query);
+- tcp::socket socket(io_service);
++ boost::asio::io_context io_context;
++ tcp::resolver resolver(io_context);
++ tcp::resolver::results_type endpoints = resolver.resolve("localhost",
port);
++ tcp::socket socket(io_context);
+
+- boost::asio::connect(socket, iterator);
++ boost::asio::connect(socket, endpoints);
+ for (;;) {
+ char data[512];
+ boost::system::error_code ec;
+@@ -358,11 +357,11 @@ class test_deadline_timer
+ {
+ public:
+ test_deadline_timer(int seconds)
+- : m_timer(m_io_service, boost::posix_time::seconds(seconds))
++ : m_timer(m_io_context, boost::posix_time::seconds(seconds))
+ {
+ m_timer.async_wait(bind(&test_deadline_timer::expired, this, ::_1));
+- std::size_t (boost::asio::io_service::*run)() =
&boost::asio::io_service::run;
+- m_timer_thread = websocketpp::lib::thread(websocketpp::lib::bind(run,
&m_io_service));
++ std::size_t (boost::asio::io_context::*run)() =
&boost::asio::io_context::run;
++ m_timer_thread = websocketpp::lib::thread(websocketpp::lib::bind(run,
&m_io_context));
+ }
+ ~test_deadline_timer()
+ {
+@@ -379,7 +378,7 @@ class test_deadline_timer
+ BOOST_FAIL("Test timed out");
+ }
+
+- boost::asio::io_service m_io_service;
++ boost::asio::io_context m_io_context;
+ boost::asio::deadline_timer m_timer;
+ websocketpp::lib::thread m_timer_thread;
+ };
+@@ -541,7 +540,7 @@ BOOST_AUTO_TEST_CASE( client_runs_out_of_work ) {
+
+ c.run();
+
+- // This test checks that an io_service with no work ends immediately.
++ // This test checks that an io_context with no work ends immediately.
+ BOOST_CHECK(true);
+ }
+
+diff --git a/tutorials/utility_server/step1.cpp
b/tutorials/utility_server/step1.cpp
+index c0e464382..dae4a2ab9 100644
+--- a/tutorials/utility_server/step1.cpp
++++ b/tutorials/utility_server/step1.cpp
+@@ -57,7 +57,7 @@ class utility_server {
+ // Queues a connection accept operation
+ m_endpoint.start_accept();
+
+- // Start the Asio io_service run loop
++ // Start the Asio io_context run loop
+ m_endpoint.run();
+ }
+ private:
+diff --git a/tutorials/utility_server/step2.cpp
b/tutorials/utility_server/step2.cpp
+index a2815bbb9..c4fe486c1 100644
+--- a/tutorials/utility_server/step2.cpp
++++ b/tutorials/utility_server/step2.cpp
+@@ -68,7 +68,7 @@ class utility_server {
+ // Queues a connection accept operation
+ m_endpoint.start_accept();
+
+- // Start the Asio io_service run loop
++ // Start the Asio io_context run loop
+ m_endpoint.run();
+ }
+ private:
+diff --git a/tutorials/utility_server/utility_server.md
b/tutorials/utility_server/utility_server.md
+index 1c7ee3fc1..461eed071 100644
+--- a/tutorials/utility_server/utility_server.md
++++ b/tutorials/utility_server/utility_server.md
+@@ -56,7 +56,7 @@ m_endpoint.set_access_channels(websocketpp::log::alevel::all
^ websocketpp::log:
+
+ Next, we initialize the transport system underlying the endpoint. This method
is specific to the Asio transport not WebSocket++ core. It will not be
necessary or present in endpoints that use a non-asio config.
+
+-> **Note:** This example uses an internal Asio `io_service` that is managed
by the endpoint itself. This is a simple arrangement suitable for programs
where WebSocket++ is the only code using Asio. If you have an existing program
that already manages an `io_service` object or want to build a new program
where WebSocket++ handlers share an io_service with other handlers you can pass
the `io_service` you want WebSocket++ to register its handlers on to the
`init_asio()` method and it will [...]
++> **Note:** This example uses an internal Asio `io_context` that is managed
by the endpoint itself. This is a simple arrangement suitable for programs
where WebSocket++ is the only code using Asio. If you have an existing program
that already manages an `io_context` object or want to build a new program
where WebSocket++ handlers share an io_context with other handlers you can pass
the `io_context` you want WebSocket++ to register its handlers on to the
`init_asio()` method and it will [...]
+
+ ~~~{.cpp}
+ m_endpoint.init_asio();
+@@ -64,7 +64,7 @@ m_endpoint.init_asio();
+
+ #### `utility_server::run` method
+
+-In addition to the constructor, we also add a run method that sets up the
listening socket, begins accepting connections, starts the Asio io_service
event loop.
++In addition to the constructor, we also add a run method that sets up the
listening socket, begins accepting connections, starts the Asio io_context
event loop.
+
+ ~~~{.cpp}
+ // Listen on port 9002
+@@ -73,7 +73,7 @@ m_endpoint.listen(9002);
+ // Queues a connection accept operation
+ m_endpoint.start_accept();
+
+-// Start the Asio io_service run loop
++// Start the Asio io_context run loop
+ m_endpoint.run();
+ ~~~
+
+@@ -123,7 +123,7 @@ public:
+ // Queues a connection accept operation
+ m_endpoint.start_accept();
+
+- // Start the Asio io_service run loop
++ // Start the Asio io_context run loop
+ m_endpoint.run();
+ }
+ private:
+diff --git a/websocketpp/roles/server_endpoint.hpp
b/websocketpp/roles/server_endpoint.hpp
+index 04fee18f9..b69281fdb 100644
+--- a/websocketpp/roles/server_endpoint.hpp
++++ b/websocketpp/roles/server_endpoint.hpp
+@@ -137,8 +137,8 @@ class server : public endpoint<connection<config>,config> {
+ /// Starts the server's async connection acceptance loop (exception free)
+ /**
+ * Initiates the server connection acceptance loop. Must be called after
+- * listen. This method will have no effect until the underlying io_service
+- * starts running. It may be called after the io_service is already
running.
++ * listen. This method will have no effect until the underlying io_context
++ * starts running. It may be called after the io_context is already
running.
+ *
+ * Refer to documentation for the transport policy you are using for
+ * instructions on how to stop this acceptance loop.
+diff --git a/websocketpp/transport/asio/base.hpp
b/websocketpp/transport/asio/base.hpp
+index b945fe11f..8d980ad7c 100644
+--- a/websocketpp/transport/asio/base.hpp
++++ b/websocketpp/transport/asio/base.hpp
+@@ -40,7 +40,7 @@ namespace websocketpp {
+ namespace transport {
+ /// Transport policy that uses asio
+ /**
+- * This policy uses a single asio io_service to provide transport
++ * This policy uses a single asio io_context to provide transport
+ * services to a WebSocket++ endpoint.
+ */
+ namespace asio {
+diff --git a/websocketpp/transport/asio/connection.hpp
b/websocketpp/transport/asio/connection.hpp
+index ea18e3e6d..af8eec5e1 100644
+--- a/websocketpp/transport/asio/connection.hpp
++++ b/websocketpp/transport/asio/connection.hpp
+@@ -85,10 +85,10 @@ class connection : public
config::socket_type::socket_con_type {
+ typedef typename config::response_type response_type;
+ typedef typename response_type::ptr response_ptr;
+
+- /// Type of a pointer to the Asio io_service being used
+- typedef lib::asio::io_service * io_service_ptr;
+- /// Type of a pointer to the Asio io_service::strand being used
+- typedef lib::shared_ptr<lib::asio::io_service::strand> strand_ptr;
++ /// Type of a pointer to the Asio io_context being used
++ typedef lib::asio::io_context * io_context_ptr;
++ /// Type of a pointer to the Asio io_context::strand being used
++ typedef lib::shared_ptr<lib::asio::io_context::strand> strand_ptr;
+ /// Type of a pointer to the Asio timer class
+ typedef lib::shared_ptr<lib::asio::steady_timer> timer_ptr;
+
+@@ -97,7 +97,7 @@ class connection : public
config::socket_type::socket_con_type {
+ // to the public api.
+ friend class endpoint<config>;
+
+- // generate and manage our own io_service
++ // generate and manage our own io_context
+ explicit connection(bool is_server, const lib::shared_ptr<alog_type> &
alog, const lib::shared_ptr<elog_type> & elog)
+ : m_is_server(is_server)
+ , m_alog(alog)
+@@ -319,7 +319,7 @@ class connection : public
config::socket_type::socket_con_type {
+ timer_ptr set_timer(long duration, timer_handler callback) {
+ timer_ptr new_timer(
+ new lib::asio::steady_timer(
+- *m_io_service,
++ *m_io_context,
+ lib::asio::milliseconds(duration))
+ );
+
+@@ -399,7 +399,7 @@ class connection : public
config::socket_type::socket_con_type {
+ /// Initialize transport for reading
+ /**
+ * init_asio is called once immediately after construction to initialize
+- * Asio components to the io_service
++ * Asio components to the io_context
+ *
+ * The transport initialization sequence consists of the following steps:
+ * - Pre-init: the underlying socket is initialized to the point where
+@@ -457,21 +457,21 @@ class connection : public
config::socket_type::socket_con_type {
+ /// Finish constructing the transport
+ /**
+ * init_asio is called once immediately after construction to initialize
+- * Asio components to the io_service.
++ * Asio components to the io_context.
+ *
+- * @param io_service A pointer to the io_service to register with this
++ * @param io_context A pointer to the io_context to register with this
+ * connection
+ *
+ * @return Status code for the success or failure of the initialization
+ */
+- lib::error_code init_asio (io_service_ptr io_service) {
+- m_io_service = io_service;
++ lib::error_code init_asio (io_context_ptr io_context) {
++ m_io_context = io_context;
+
+ if (config::enable_multithreading) {
+- m_strand.reset(new lib::asio::io_service::strand(*io_service));
++ m_strand.reset(new lib::asio::io_context::strand(*io_context));
+ }
+
+- lib::error_code ec = socket_con_type::init_asio(io_service, m_strand,
++ lib::error_code ec = socket_con_type::init_asio(io_context, m_strand,
+ m_is_server);
+
+ return ec;
+@@ -579,7 +579,7 @@ class connection : public
config::socket_type::socket_con_type {
+ lib::error_code const & ec)
+ {
+ if (ec == transport::error::operation_aborted ||
+- (post_timer && lib::asio::is_neg(post_timer->expires_from_now())))
++ (post_timer && lib::asio::is_neg(post_timer->expiry() -
std::chrono::steady_clock::now())))
+ {
+ m_alog->write(log::alevel::devel,"post_init cancelled");
+ return;
+@@ -685,7 +685,7 @@ class connection : public
config::socket_type::socket_con_type {
+ // Whatever aborted it will be issuing the callback so we are safe to
+ // return
+ if (ec == lib::asio::error::operation_aborted ||
+- lib::asio::is_neg(m_proxy_data->timer->expires_from_now()))
++ lib::asio::is_neg(m_proxy_data->timer->expiry() -
std::chrono::steady_clock::now()))
+ {
+ m_elog->write(log::elevel::devel,"write operation aborted");
+ return;
+@@ -756,7 +756,7 @@ class connection : public
config::socket_type::socket_con_type {
+ // Whatever aborted it will be issuing the callback so we are safe to
+ // return
+ if (ec == lib::asio::error::operation_aborted ||
+- lib::asio::is_neg(m_proxy_data->timer->expires_from_now()))
++ lib::asio::is_neg(m_proxy_data->timer->expiry() -
std::chrono::steady_clock::now()))
+ {
+ m_elog->write(log::elevel::devel,"read operation aborted");
+ return;
+@@ -1030,18 +1030,18 @@ class connection : public
config::socket_type::socket_con_type {
+ */
+ lib::error_code interrupt(interrupt_handler handler) {
+ if (config::enable_multithreading) {
+- m_io_service->post(m_strand->wrap(handler));
++ boost::asio::post(m_io_context->get_executor(),
m_strand->wrap(handler));
+ } else {
+- m_io_service->post(handler);
++ boost::asio::post(m_io_context->get_executor(), handler);
+ }
+ return lib::error_code();
+ }
+
+ lib::error_code dispatch(dispatch_handler handler) {
+ if (config::enable_multithreading) {
+- m_io_service->post(m_strand->wrap(handler));
++ boost::asio::post(m_io_context->get_executor(),
m_strand->wrap(handler));
+ } else {
+- m_io_service->post(handler);
++ boost::asio::post(m_io_context->get_executor(), handler);
+ }
+ return lib::error_code();
+ }
+@@ -1113,7 +1113,7 @@ class connection : public
config::socket_type::socket_con_type {
+ callback, lib::asio::error_code const & ec)
+ {
+ if (ec == lib::asio::error::operation_aborted ||
+- lib::asio::is_neg(shutdown_timer->expires_from_now()))
++ lib::asio::is_neg(shutdown_timer->expiry() -
std::chrono::steady_clock::now()))
+ {
+ m_alog->write(log::alevel::devel,"async_shutdown cancelled");
+ return;
+@@ -1190,7 +1190,7 @@ class connection : public
config::socket_type::socket_con_type {
+ lib::shared_ptr<proxy_data> m_proxy_data;
+
+ // transport resources
+- io_service_ptr m_io_service;
++ io_context_ptr m_io_context;
+ strand_ptr m_strand;
+ connection_hdl m_connection_hdl;
+
+diff --git a/websocketpp/transport/asio/endpoint.hpp
b/websocketpp/transport/asio/endpoint.hpp
+index 125b87642..05453437b 100644
+--- a/websocketpp/transport/asio/endpoint.hpp
++++ b/websocketpp/transport/asio/endpoint.hpp
+@@ -77,25 +77,25 @@ class endpoint : public config::socket_type {
+ /// associated with this endpoint transport component
+ typedef typename transport_con_type::ptr transport_con_ptr;
+
+- /// Type of a pointer to the ASIO io_service being used
+- typedef lib::asio::io_service * io_service_ptr;
++ /// Type of a pointer to the ASIO io_context being used
++ typedef lib::asio::io_context * io_context_ptr;
+ /// Type of a shared pointer to the acceptor being used
+ typedef lib::shared_ptr<lib::asio::ip::tcp::acceptor> acceptor_ptr;
+ /// Type of a shared pointer to the resolver being used
+ typedef lib::shared_ptr<lib::asio::ip::tcp::resolver> resolver_ptr;
+ /// Type of timer handle
+ typedef lib::shared_ptr<lib::asio::steady_timer> timer_ptr;
+- /// Type of a shared pointer to an io_service work object
+- typedef lib::shared_ptr<lib::asio::io_service::work> work_ptr;
++ /// Type of a shared pointer to an io_context work object
++ typedef
lib::shared_ptr<lib::asio::executor_work_guard<lib::asio::io_context::executor_type>>
work_ptr;
+
+ /// Type of socket pre-bind handler
+ typedef lib::function<lib::error_code(acceptor_ptr)> tcp_pre_bind_handler;
+
+- // generate and manage our own io_service
++ // generate and manage our own io_context
+ explicit endpoint()
+- : m_io_service(NULL)
+- , m_external_io_service(false)
+- , m_listen_backlog(lib::asio::socket_base::max_connections)
++ : m_io_context(NULL)
++ , m_external_io_context(false)
++ , m_listen_backlog(lib::asio::socket_base::max_listen_connections)
+ , m_reuse_addr(false)
+ , m_state(UNINITIALIZED)
+ {
+@@ -103,14 +103,14 @@ class endpoint : public config::socket_type {
+ }
+
+ ~endpoint() {
+- // clean up our io_service if we were initialized with an internal
one.
++ // clean up our io_context if we were initialized with an internal
one.
+
+ // Explicitly destroy local objects
+ m_acceptor.reset();
+ m_resolver.reset();
+ m_work.reset();
+- if (m_state != UNINITIALIZED && !m_external_io_service) {
+- delete m_io_service;
++ if (m_state != UNINITIALIZED && !m_external_io_context) {
++ delete m_io_context;
+ }
+ }
+
+@@ -132,34 +132,34 @@ class endpoint : public config::socket_type {
+ : config::socket_type(std::move(src))
+ , m_tcp_pre_init_handler(src.m_tcp_pre_init_handler)
+ , m_tcp_post_init_handler(src.m_tcp_post_init_handler)
+- , m_io_service(src.m_io_service)
+- , m_external_io_service(src.m_external_io_service)
++ , m_io_context(src.m_io_context)
++ , m_external_io_context(src.m_external_io_context)
+ , m_acceptor(src.m_acceptor)
+- , m_listen_backlog(lib::asio::socket_base::max_connections)
++ , m_listen_backlog(lib::asio::socket_base::max_listen_connections)
+ , m_reuse_addr(src.m_reuse_addr)
+ , m_elog(src.m_elog)
+ , m_alog(src.m_alog)
+ , m_state(src.m_state)
+ {
+- src.m_io_service = NULL;
+- src.m_external_io_service = false;
++ src.m_io_context = NULL;
++ src.m_external_io_context = false;
+ src.m_acceptor = NULL;
+ src.m_state = UNINITIALIZED;
+ }
+
+ /*endpoint & operator= (const endpoint && rhs) {
+ if (this != &rhs) {
+- m_io_service = rhs.m_io_service;
+- m_external_io_service = rhs.m_external_io_service;
++ m_io_context = rhs.m_io_context;
++ m_external_io_context = rhs.m_external_io_context;
+ m_acceptor = rhs.m_acceptor;
+ m_listen_backlog = rhs.m_listen_backlog;
+ m_reuse_addr = rhs.m_reuse_addr;
+ m_state = rhs.m_state;
+
+- rhs.m_io_service = NULL;
+- rhs.m_external_io_service = false;
++ rhs.m_io_context = NULL;
++ rhs.m_external_io_context = false;
+ rhs.m_acceptor = NULL;
+- rhs.m_listen_backlog = lib::asio::socket_base::max_connections;
++ rhs.m_listen_backlog =
lib::asio::socket_base::max_listen_connections;
+ rhs.m_state = UNINITIALIZED;
+
+ // TODO: this needs to be updated
+@@ -173,16 +173,16 @@ class endpoint : public config::socket_type {
+ return socket_type::is_secure();
+ }
+
+- /// initialize asio transport with external io_service (exception free)
++ /// initialize asio transport with external io_context (exception free)
+ /**
+ * Initialize the ASIO transport policy for this endpoint using the
provided
+- * io_service object. asio_init must be called exactly once on any
endpoint
++ * io_context object. asio_init must be called exactly once on any
endpoint
+ * that uses transport::asio before it can be used.
+ *
+- * @param ptr A pointer to the io_service to use for asio events
++ * @param ptr A pointer to the io_context to use for asio events
+ * @param ec Set to indicate what error occurred, if any.
+ */
+- void init_asio(io_service_ptr ptr, lib::error_code & ec) {
++ void init_asio(io_context_ptr ptr, lib::error_code & ec) {
+ if (m_state != UNINITIALIZED) {
+ m_elog->write(log::elevel::library,
+ "asio::init_asio called from the wrong state");
+@@ -193,36 +193,36 @@ class endpoint : public config::socket_type {
+
+ m_alog->write(log::alevel::devel,"asio::init_asio");
+
+- m_io_service = ptr;
+- m_external_io_service = true;
+- m_acceptor.reset(new lib::asio::ip::tcp::acceptor(*m_io_service));
++ m_io_context = ptr;
++ m_external_io_context = true;
++ m_acceptor.reset(new lib::asio::ip::tcp::acceptor(*m_io_context));
+
+ m_state = READY;
+ ec = lib::error_code();
+ }
+
+ #ifndef _WEBSOCKETPP_NO_EXCEPTIONS_
+- /// initialize asio transport with external io_service
++ /// initialize asio transport with external io_context
+ /**
+ * Initialize the ASIO transport policy for this endpoint using the
provided
+- * io_service object. asio_init must be called exactly once on any
endpoint
++ * io_context object. asio_init must be called exactly once on any
endpoint
+ * that uses transport::asio before it can be used.
+ *
+- * @param ptr A pointer to the io_service to use for asio events
++ * @param ptr A pointer to the io_context to use for asio events
+ */
+- void init_asio(io_service_ptr ptr) {
++ void init_asio(io_context_ptr ptr) {
+ lib::error_code ec;
+ init_asio(ptr,ec);
+ if (ec) { throw exception(ec); }
+ }
+ #endif // _WEBSOCKETPP_NO_EXCEPTIONS_
+
+- /// Initialize asio transport with internal io_service (exception free)
++ /// Initialize asio transport with internal io_context (exception free)
+ /**
+ * This method of initialization will allocate and use an internally
managed
+- * io_service.
++ * io_context.
+ *
+- * @see init_asio(io_service_ptr ptr)
++ * @see init_asio(io_context_ptr ptr)
+ *
+ * @param ec Set to indicate what error occurred, if any.
+ */
+@@ -232,22 +232,22 @@ class endpoint : public config::socket_type {
+ // TODO: remove the use of auto_ptr when C++98/03 support is no longer
+ // necessary.
+ #ifdef _WEBSOCKETPP_CPP11_MEMORY_
+- lib::unique_ptr<lib::asio::io_service> service(new
lib::asio::io_service());
++ lib::unique_ptr<lib::asio::io_context> context(new
lib::asio::io_context());
+ #else
+- lib::auto_ptr<lib::asio::io_service> service(new
lib::asio::io_service());
++ lib::auto_ptr<lib::asio::io_context> context(new
lib::asio::io_context());
+ #endif
+- init_asio(service.get(), ec);
+- if( !ec ) service.release(); // Call was successful, transfer
ownership
+- m_external_io_service = false;
++ init_asio(context.get(), ec);
++ if( !ec ) context.release(); // Call was successful, transfer
ownership
++ m_external_io_context = false;
+ }
+
+ #ifndef _WEBSOCKETPP_NO_EXCEPTIONS_
+- /// Initialize asio transport with internal io_service
++ /// Initialize asio transport with internal io_context
+ /**
+ * This method of initialization will allocate and use an internally
managed
+- * io_service.
++ * io_context.
+ *
+- * @see init_asio(io_service_ptr ptr)
++ * @see init_asio(io_context_ptr ptr)
+ */
+ void init_asio() {
+ // Use a smart pointer until the call is successful and ownership has
+@@ -255,14 +255,14 @@ class endpoint : public config::socket_type {
+ // TODO: remove the use of auto_ptr when C++98/03 support is no longer
+ // necessary.
+ #ifdef _WEBSOCKETPP_CPP11_MEMORY_
+- lib::unique_ptr<lib::asio::io_service> service(new
lib::asio::io_service());
++ lib::unique_ptr<lib::asio::io_context> context(new
lib::asio::io_context());
+ #else
+- lib::auto_ptr<lib::asio::io_service> service(new
lib::asio::io_service());
++ lib::auto_ptr<lib::asio::io_context> context(new
lib::asio::io_context());
+ #endif
+- init_asio( service.get() );
++ init_asio( context.get() );
+ // If control got this far without an exception, then ownership has
successfully been taken
+- service.release();
+- m_external_io_service = false;
++ context.release();
++ m_external_io_context = false;
+ }
+ #endif // _WEBSOCKETPP_NO_EXCEPTIONS_
+
+@@ -334,7 +334,7 @@ class endpoint : public config::socket_type {
+ *
+ * New values affect future calls to listen only.
+ *
+- * The default value is specified as *::asio::socket_base::max_connections
++ * The default value is specified as
*::asio::socket_base::max_listen_connections
+ * which uses the operating system defined maximum queue length. Your OS
+ * may restrict or silently lower this value. A value of zero may cause
+ * all connections to be rejected.
+@@ -368,19 +368,19 @@ class endpoint : public config::socket_type {
+ m_reuse_addr = value;
+ }
+
+- /// Retrieve a reference to the endpoint's io_service
++ /// Retrieve a reference to the endpoint's io_context
+ /**
+- * The io_service may be an internal or external one. This may be used to
+- * call methods of the io_service that are not explicitly wrapped by the
++ * The io_context may be an internal or external one. This may be used to
++ * call methods of the io_context that are not explicitly wrapped by the
+ * endpoint.
+ *
+ * This method is only valid after the endpoint has been initialized with
+ * `init_asio`. No error will be returned if it isn't.
+ *
+- * @return A reference to the endpoint's io_service
++ * @return A reference to the endpoint's io_context
+ */
+- lib::asio::io_service & get_io_service() {
+- return *m_io_service;
++ lib::asio::io_context & get_io_context() {
++ return *m_io_context;
+ }
+
+ /// Get local TCP endpoint
+@@ -501,7 +501,7 @@ class endpoint : public config::socket_type {
+ * The endpoint must have been initialized by calling init_asio before
+ * listening.
+ *
+- * Once listening the underlying io_service will be kept open
indefinitely.
++ * Once listening the underlying io_context will be kept open
indefinitely.
+ * Calling endpoint::stop_listening will stop the endpoint from accepting
+ * new connections. See the documentation for stop listening for more
details
+ * about shutting down Asio Transport based endpoints.
+@@ -518,17 +518,15 @@ class endpoint : public config::socket_type {
+ lib::error_code & ec)
+ {
+ using lib::asio::ip::tcp;
+- tcp::resolver r(*m_io_service);
+- tcp::resolver::query query(host, service);
+- tcp::resolver::iterator endpoint_iterator = r.resolve(query);
+- tcp::resolver::iterator end;
+- if (endpoint_iterator == end) {
++ tcp::resolver r(*m_io_context);
++ tcp::resolver::results_type endpoints = r.resolve(host, service);
++ if (endpoints.empty()) {
+ m_elog->write(log::elevel::library,
+ "asio::listen could not resolve the supplied host or
service");
+ ec = make_error_code(error::invalid_host_service);
+ return;
+ }
+- listen(*endpoint_iterator,ec);
++ listen(*endpoints.begin(),ec);
+ }
+
+ /// Stop listening (exception free)
+@@ -621,7 +619,7 @@ class endpoint : public config::socket_type {
+ * The endpoint must have been initialized by calling init_asio before
+ * listening.
+ *
+- * Once listening the underlying io_service will be kept open
indefinitely.
++ * Once listening the underlying io_context will be kept open
indefinitely.
+ * Calling endpoint::stop_listening will stop the endpoint from accepting
+ * new connections. See the documentation for stop listening for more
+ * details about shutting down Asio Transport based endpoints.
+@@ -663,42 +661,42 @@ class endpoint : public config::socket_type {
+ return (m_state == LISTENING);
+ }
+
+- /// wraps the run method of the internal io_service object
++ /// wraps the run method of the internal io_context object
+ std::size_t run() {
+- return m_io_service->run();
++ return m_io_context->run();
+ }
+
+- /// wraps the run_one method of the internal io_service object
++ /// wraps the run_one method of the internal io_context object
+ /**
+ * @since 0.3.0-alpha4
+ */
+ std::size_t run_one() {
+- return m_io_service->run_one();
++ return m_io_context->run_one();
+ }
+
+- /// wraps the stop method of the internal io_service object
++ /// wraps the stop method of the internal io_context object
+ void stop() {
+- m_io_service->stop();
++ m_io_context->stop();
+ }
+
+- /// wraps the poll method of the internal io_service object
++ /// wraps the poll method of the internal io_context object
+ std::size_t poll() {
+- return m_io_service->poll();
++ return m_io_context->poll();
+ }
+
+- /// wraps the poll_one method of the internal io_service object
++ /// wraps the poll_one method of the internal io_context object
+ std::size_t poll_one() {
+- return m_io_service->poll_one();
++ return m_io_context->poll_one();
+ }
+
+- /// wraps the reset method of the internal io_service object
++ /// wraps the restart method of the internal io_context object
+ void reset() {
+- m_io_service->reset();
++ m_io_context->restart();
+ }
+
+- /// wraps the stopped method of the internal io_service object
++ /// wraps the stopped method of the internal io_context object
+ bool stopped() const {
+- return m_io_service->stopped();
++ return m_io_context->stopped();
+ }
+
+ /// Marks the endpoint as perpetual, stopping it from exiting when empty
+@@ -714,7 +712,7 @@ class endpoint : public config::socket_type {
+ * @since 0.3.0
+ */
+ void start_perpetual() {
+- m_work.reset(new lib::asio::io_service::work(*m_io_service));
++ m_work.reset(new
lib::asio::executor_work_guard<lib::asio::io_context::executor_type>(m_io_context->get_executor()));
+ }
+
+ /// Clears the endpoint's perpetual flag, allowing it to exit when empty
+@@ -743,7 +741,7 @@ class endpoint : public config::socket_type {
+ */
+ timer_ptr set_timer(long duration, timer_handler callback) {
+ timer_ptr new_timer = lib::make_shared<lib::asio::steady_timer>(
+- *m_io_service,
++ *m_io_context,
+ lib::asio::milliseconds(duration)
+ );
+
+@@ -880,7 +878,7 @@ class endpoint : public config::socket_type {
+
+ // Create a resolver
+ if (!m_resolver) {
+- m_resolver.reset(new lib::asio::ip::tcp::resolver(*m_io_service));
++ m_resolver.reset(new lib::asio::ip::tcp::resolver(*m_io_context));
+ }
+
+ tcon->set_uri(u);
+@@ -912,8 +910,6 @@ class endpoint : public config::socket_type {
+ port = pu->get_port_str();
+ }
+
+- tcp::resolver::query query(host,port);
+-
+ if (m_alog->static_test(log::alevel::devel)) {
+ m_alog->write(log::alevel::devel,
+ "starting async DNS resolve for "+host+":"+port);
+@@ -934,7 +930,8 @@ class endpoint : public config::socket_type {
+
+ if (config::enable_multithreading) {
+ m_resolver->async_resolve(
+- query,
++ host,
++ port,
+ tcon->get_strand()->wrap(lib::bind(
+ &type::handle_resolve,
+ this,
+@@ -947,7 +944,8 @@ class endpoint : public config::socket_type {
+ );
+ } else {
+ m_resolver->async_resolve(
+- query,
++ host,
++ port,
+ lib::bind(
+ &type::handle_resolve,
+ this,
+@@ -995,10 +993,10 @@ class endpoint : public config::socket_type {
+
+ void handle_resolve(transport_con_ptr tcon, timer_ptr dns_timer,
+ connect_handler callback, lib::asio::error_code const & ec,
+- lib::asio::ip::tcp::resolver::iterator iterator)
++ lib::asio::ip::tcp::resolver::results_type endpoints)
+ {
+ if (ec == lib::asio::error::operation_aborted ||
+- lib::asio::is_neg(dns_timer->expires_from_now()))
++ lib::asio::is_neg(dns_timer->expiry() -
std::chrono::steady_clock::now()))
+ {
+ m_alog->write(log::alevel::devel,"async_resolve cancelled");
+ return;
+@@ -1016,8 +1014,8 @@ class endpoint : public config::socket_type {
+ std::stringstream s;
+ s << "Async DNS resolve successful. Results: ";
+
+- lib::asio::ip::tcp::resolver::iterator it, end;
+- for (it = iterator; it != end; ++it) {
++ lib::asio::ip::tcp::resolver::results_type::iterator it;
++ for (it = endpoints.begin(); it != endpoints.end(); ++it) {
+ s << (*it).endpoint() << " ";
+ }
+
+@@ -1043,7 +1041,7 @@ class endpoint : public config::socket_type {
+ if (config::enable_multithreading) {
+ lib::asio::async_connect(
+ tcon->get_raw_socket(),
+- iterator,
++ endpoints,
+ tcon->get_strand()->wrap(lib::bind(
+ &type::handle_connect,
+ this,
+@@ -1056,7 +1054,7 @@ class endpoint : public config::socket_type {
+ } else {
+ lib::asio::async_connect(
+ tcon->get_raw_socket(),
+- iterator,
++ endpoints,
+ lib::bind(
+ &type::handle_connect,
+ this,
+@@ -1106,7 +1104,7 @@ class endpoint : public config::socket_type {
+ connect_handler callback, lib::asio::error_code const & ec)
+ {
+ if (ec == lib::asio::error::operation_aborted ||
+- lib::asio::is_neg(con_timer->expires_from_now()))
++ lib::asio::is_neg(con_timer->expiry() -
std::chrono::steady_clock::now()))
+ {
+ m_alog->write(log::alevel::devel,"async_connect cancelled");
+ return;
+@@ -1148,7 +1146,7 @@ class endpoint : public config::socket_type {
+
+ lib::error_code ec;
+
+- ec = tcon->init_asio(m_io_service);
++ ec = tcon->init_asio(m_io_context);
+ if (ec) {return ec;}
+
+ tcon->set_tcp_pre_init_handler(m_tcp_pre_init_handler);
+@@ -1187,8 +1185,8 @@ class endpoint : public config::socket_type {
+ tcp_init_handler m_tcp_post_init_handler;
+
+ // Network Resources
+- io_service_ptr m_io_service;
+- bool m_external_io_service;
++ io_context_ptr m_io_context;
++ bool m_external_io_context;
+ acceptor_ptr m_acceptor;
+ resolver_ptr m_resolver;
+ work_ptr m_work;
+diff --git a/websocketpp/transport/asio/security/none.hpp
b/websocketpp/transport/asio/security/none.hpp
+index c679378ed..c667b91fe 100644
+--- a/websocketpp/transport/asio/security/none.hpp
++++ b/websocketpp/transport/asio/security/none.hpp
+@@ -62,10 +62,10 @@ class connection : public
lib::enable_shared_from_this<connection> {
+ /// Type of a shared pointer to this connection socket component
+ typedef lib::shared_ptr<type> ptr;
+
+- /// Type of a pointer to the Asio io_service being used
+- typedef lib::asio::io_service* io_service_ptr;
+- /// Type of a pointer to the Asio io_service strand being used
+- typedef lib::shared_ptr<lib::asio::io_service::strand> strand_ptr;
++ /// Type of a pointer to the Asio io_context being used
++ typedef lib::asio::io_context* io_context_ptr;
++ /// Type of a pointer to the Asio io_context strand being used
++ typedef lib::shared_ptr<lib::asio::io_context::strand> strand_ptr;
+ /// Type of the ASIO socket being used
+ typedef lib::asio::ip::tcp::socket socket_type;
+ /// Type of a shared pointer to the socket being used.
+@@ -156,20 +156,20 @@ class connection : public
lib::enable_shared_from_this<connection> {
+ /// Perform one time initializations
+ /**
+ * init_asio is called once immediately after construction to initialize
+- * Asio components to the io_service. At this stage the connection is
++ * Asio components to the io_context. At this stage the connection is
+ * speculative, the server may not have actually received a new
connection.
+ *
+- * @param service A pointer to the endpoint's io_service
++ * @param service A pointer to the endpoint's io_context
+ * @param strand A shared pointer to the connection's asio strand
+ * @param is_server Whether or not the endpoint is a server or not.
+ */
+- lib::error_code init_asio (io_service_ptr service, strand_ptr, bool)
++ lib::error_code init_asio (io_context_ptr context, strand_ptr, bool)
+ {
+ if (m_state != UNINITIALIZED) {
+ return socket::make_error_code(socket::error::invalid_state);
+ }
+
+- m_socket.reset(new lib::asio::ip::tcp::socket(*service));
++ m_socket.reset(new lib::asio::ip::tcp::socket(*context));
+
+ m_state = READY;
+
+diff --git a/websocketpp/transport/asio/security/tls.hpp
b/websocketpp/transport/asio/security/tls.hpp
+index 25b0d29d0..6e747dfb0 100644
+--- a/websocketpp/transport/asio/security/tls.hpp
++++ b/websocketpp/transport/asio/security/tls.hpp
+@@ -71,10 +71,10 @@ class connection : public
lib::enable_shared_from_this<connection> {
+ typedef lib::asio::ssl::stream<lib::asio::ip::tcp::socket> socket_type;
+ /// Type of a shared pointer to the ASIO socket being used
+ typedef lib::shared_ptr<socket_type> socket_ptr;
+- /// Type of a pointer to the ASIO io_service being used
+- typedef lib::asio::io_service * io_service_ptr;
+- /// Type of a pointer to the ASIO io_service strand being used
+- typedef lib::shared_ptr<lib::asio::io_service::strand> strand_ptr;
++ /// Type of a pointer to the ASIO io_context being used
++ typedef lib::asio::io_context * io_context_ptr;
++ /// Type of a pointer to the ASIO io_context strand being used
++ typedef lib::shared_ptr<lib::asio::io_context::strand> strand_ptr;
+ /// Type of a shared pointer to the ASIO TLS context being used
+ typedef lib::shared_ptr<lib::asio::ssl::context> context_ptr;
+
+@@ -176,13 +176,13 @@ class connection : public
lib::enable_shared_from_this<connection> {
+ /// Perform one time initializations
+ /**
+ * init_asio is called once immediately after construction to initialize
+- * Asio components to the io_service
++ * Asio components to the io_context
+ *
+- * @param service A pointer to the endpoint's io_service
++ * @param service A pointer to the endpoint's io_context
+ * @param strand A pointer to the connection's strand
+ * @param is_server Whether or not the endpoint is a server or not.
+ */
+- lib::error_code init_asio (io_service_ptr service, strand_ptr strand,
++ lib::error_code init_asio (io_context_ptr context, strand_ptr strand,
+ bool is_server)
+ {
+ if (!m_tls_init_handler) {
+@@ -193,9 +193,9 @@ class connection : public
lib::enable_shared_from_this<connection> {
+ if (!m_context) {
+ return
socket::make_error_code(socket::error::invalid_tls_context);
+ }
+- m_socket.reset(new socket_type(*service, *m_context));
++ m_socket.reset(new socket_type(*context, *m_context));
+
+- m_io_service = service;
++ m_io_context = context;
+ m_strand = strand;
+ m_is_server = is_server;
+
+@@ -391,7 +391,7 @@ class connection : public
lib::enable_shared_from_this<connection> {
+ }
+ }
+
+- io_service_ptr m_io_service;
++ io_context_ptr m_io_context;
+ strand_ptr m_strand;
+ context_ptr m_context;
+ socket_ptr m_socket;
+diff --git a/websocketpp/transport/debug/endpoint.hpp
b/websocketpp/transport/debug/endpoint.hpp
+index adc89b382..360644165 100644
+--- a/websocketpp/transport/debug/endpoint.hpp
++++ b/websocketpp/transport/debug/endpoint.hpp
+@@ -60,7 +60,7 @@ class endpoint {
+ /// associated connection transport component
+ typedef typename transport_con_type::ptr transport_con_ptr;
+
+- // generate and manage our own io_service
++ // generate and manage our own io_context
+ explicit endpoint()
+ {
+ //std::cout << "transport::iostream::endpoint constructor" <<
std::endl;
+diff --git a/websocketpp/transport/iostream/endpoint.hpp
b/websocketpp/transport/iostream/endpoint.hpp
+index 14cba7255..257472db8 100644
+--- a/websocketpp/transport/iostream/endpoint.hpp
++++ b/websocketpp/transport/iostream/endpoint.hpp
+@@ -64,7 +64,7 @@ class endpoint {
+ /// associated connection transport component
+ typedef typename transport_con_type::ptr transport_con_ptr;
+
+- // generate and manage our own io_service
++ // generate and manage our own io_context
+ explicit endpoint() : m_output_stream(NULL), m_is_secure(false)
+ {
+ //std::cout << "transport::iostream::endpoint constructor" <<
std::endl;
+diff --git a/websocketpp/transport/stub/endpoint.hpp
b/websocketpp/transport/stub/endpoint.hpp
+index eb6570a4c..e0d5f2d3a 100644
+--- a/websocketpp/transport/stub/endpoint.hpp
++++ b/websocketpp/transport/stub/endpoint.hpp
+@@ -60,7 +60,7 @@ class endpoint {
+ /// associated connection transport component
+ typedef typename transport_con_type::ptr transport_con_ptr;
+
+- // generate and manage our own io_service
++ // generate and manage our own io_context
+ explicit endpoint()
+ {
+ //std::cout << "transport::iostream::endpoint constructor" <<
std::endl;
+
+From 30e77468e093e8384fa07819b345f81a0431eb37 Mon Sep 17 00:00:00 2001
+From: Amini Allight <[email protected]>
+Date: Wed, 12 Feb 2025 04:46:30 +0000
+Subject: [PATCH 2/8] updated docstrings
+
+---
+ websocketpp/transport/asio/endpoint.hpp | 4 ++--
+ websocketpp/transport/asio/security/none.hpp | 2 +-
+ websocketpp/transport/asio/security/tls.hpp | 2 +-
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/websocketpp/transport/asio/endpoint.hpp
b/websocketpp/transport/asio/endpoint.hpp
+index 05453437b..13dda058e 100644
+--- a/websocketpp/transport/asio/endpoint.hpp
++++ b/websocketpp/transport/asio/endpoint.hpp
+@@ -510,7 +510,7 @@ class endpoint : public config::socket_type {
+ *
+ * @param host A string identifying a location. May be a descriptive name
or
+ * a numeric address string.
+- * @param service A string identifying the requested service. This may be
a
++ * @param context A string identifying the requested service. This may be
a
+ * descriptive name or a numeric string corresponding to a port number.
+ * @param ec Set to indicate what error occurred, if any.
+ */
+@@ -628,7 +628,7 @@ class endpoint : public config::socket_type {
+ *
+ * @param host A string identifying a location. May be a descriptive name
+ * or a numeric address string.
+- * @param service A string identifying the requested service. This may be
a
++ * @param context A string identifying the requested service. This may be
a
+ * descriptive name or a numeric string corresponding to a port number.
+ * @param ec Set to indicate what error occurred, if any.
+ */
+diff --git a/websocketpp/transport/asio/security/none.hpp
b/websocketpp/transport/asio/security/none.hpp
+index c667b91fe..3033b7648 100644
+--- a/websocketpp/transport/asio/security/none.hpp
++++ b/websocketpp/transport/asio/security/none.hpp
+@@ -159,7 +159,7 @@ class connection : public
lib::enable_shared_from_this<connection> {
+ * Asio components to the io_context. At this stage the connection is
+ * speculative, the server may not have actually received a new
connection.
+ *
+- * @param service A pointer to the endpoint's io_context
++ * @param context A pointer to the endpoint's io_context
+ * @param strand A shared pointer to the connection's asio strand
+ * @param is_server Whether or not the endpoint is a server or not.
+ */
+diff --git a/websocketpp/transport/asio/security/tls.hpp
b/websocketpp/transport/asio/security/tls.hpp
+index 6e747dfb0..d65c48cc9 100644
+--- a/websocketpp/transport/asio/security/tls.hpp
++++ b/websocketpp/transport/asio/security/tls.hpp
+@@ -178,7 +178,7 @@ class connection : public
lib::enable_shared_from_this<connection> {
+ * init_asio is called once immediately after construction to initialize
+ * Asio components to the io_context
+ *
+- * @param service A pointer to the endpoint's io_context
++ * @param context A pointer to the endpoint's io_context
+ * @param strand A pointer to the connection's strand
+ * @param is_server Whether or not the endpoint is a server or not.
+ */
+
+From 3d13472f7489bda718ded20d885dbaf98e36442c Mon Sep 17 00:00:00 2001
+From: Amini Allight <[email protected]>
+Date: Wed, 12 Feb 2025 04:48:13 +0000
+Subject: [PATCH 3/8] updated docstrings
+
+---
+ websocketpp/transport/asio/endpoint.hpp | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/websocketpp/transport/asio/endpoint.hpp
b/websocketpp/transport/asio/endpoint.hpp
+index 13dda058e..05453437b 100644
+--- a/websocketpp/transport/asio/endpoint.hpp
++++ b/websocketpp/transport/asio/endpoint.hpp
+@@ -510,7 +510,7 @@ class endpoint : public config::socket_type {
+ *
+ * @param host A string identifying a location. May be a descriptive name
or
+ * a numeric address string.
+- * @param context A string identifying the requested service. This may be
a
++ * @param service A string identifying the requested service. This may be
a
+ * descriptive name or a numeric string corresponding to a port number.
+ * @param ec Set to indicate what error occurred, if any.
+ */
+@@ -628,7 +628,7 @@ class endpoint : public config::socket_type {
+ *
+ * @param host A string identifying a location. May be a descriptive name
+ * or a numeric address string.
+- * @param context A string identifying the requested service. This may be
a
++ * @param service A string identifying the requested service. This may be
a
+ * descriptive name or a numeric string corresponding to a port number.
+ * @param ec Set to indicate what error occurred, if any.
+ */
+
+From 6867ad089932fc2a786c39dae5ed152991e4ee46 Mon Sep 17 00:00:00 2001
+From: Amini Allight <[email protected]>
+Date: Fri, 14 Feb 2025 07:48:42 +0000
+Subject: [PATCH 4/8] silenced warning about unused variable in TLS IP address
+ validation, improved time-to-expiry calculation (credit toonetown), added
+ CMake flag to compile tests and examples with ASIO standalone, fixed example
+ and test compilation with ASIO standalone
+
+---
+ CMakeLists.txt | 5 +++
+ examples/debug_client/debug_client.cpp | 12 +++---
+ .../echo_server_both/echo_server_both.cpp | 16 ++++----
+ .../external_io_context.cpp | 2 +-
+ .../external_io_context/tcp_echo_server.hpp | 28 +++++++-------
+ .../print_client_tls/print_client_tls.cpp | 14 +++----
+ examples/testee_server/testee_server.cpp | 4 +-
+ test/endpoint/endpoint.cpp | 6 +--
+ test/http/parser_perf.cpp | 4 +-
+ test/transport/asio/timers.cpp | 4 +-
+ test/transport/integration.cpp | 38 ++++++++++---------
+ websocketpp/common/asio.hpp | 2 +-
+ websocketpp/transport/asio/connection.hpp | 18 ++++-----
+ websocketpp/transport/asio/endpoint.hpp | 4 +-
+ websocketpp/transport/asio/security/tls.hpp | 1 +
+ 15 files changed, 82 insertions(+), 76 deletions(-)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 9043db327..badb66409 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -77,6 +77,7 @@ include (CMakeHelpers)
+ option (ENABLE_CPP11 "Build websocketpp with CPP11 features enabled." TRUE)
+ option (BUILD_EXAMPLES "Build websocketpp examples." FALSE)
+ option (BUILD_TESTS "Build websocketpp tests." FALSE)
++option (USE_ASIO_STANDALONE "Build websocketpp examples and tests using the
standalone ASIO library." FALSE)
+
+ if (BUILD_TESTS OR BUILD_EXAMPLES)
+
+@@ -254,6 +255,10 @@ endif()
+
+ ############ Add projects
+
++if (USE_ASIO_STANDALONE)
++ add_definitions("-DASIO_STANDALONE -DASIO_HAS_BOOST_DATE_TIME")
++endif ()
++
+ # Add main library
+ add_subdirectory (websocketpp)
+
+diff --git a/examples/debug_client/debug_client.cpp
b/examples/debug_client/debug_client.cpp
+index 81c595b99..34644583a 100644
+--- a/examples/debug_client/debug_client.cpp
++++ b/examples/debug_client/debug_client.cpp
+@@ -43,7 +43,7 @@ using websocketpp::lib::bind;
+
+ // pull out the type of messages sent by our config
+ typedef websocketpp::config::asio_tls_client::message_type::ptr message_ptr;
+-typedef websocketpp::lib::shared_ptr<boost::asio::ssl::context> context_ptr;
++typedef websocketpp::lib::shared_ptr<websocketpp::lib::asio::ssl::context>
context_ptr;
+ typedef client::connection_ptr connection_ptr;
+
+
+@@ -93,13 +93,13 @@ class perftest {
+
+ context_ptr on_tls_init(websocketpp::connection_hdl) {
+ m_tls_init = std::chrono::high_resolution_clock::now();
+- context_ptr ctx =
websocketpp::lib::make_shared<boost::asio::ssl::context>(boost::asio::ssl::context::tlsv1);
++ context_ptr ctx =
websocketpp::lib::make_shared<websocketpp::lib::asio::ssl::context>(websocketpp::lib::asio::ssl::context::tlsv1);
+
+ try {
+- ctx->set_options(boost::asio::ssl::context::default_workarounds |
+- boost::asio::ssl::context::no_sslv2 |
+- boost::asio::ssl::context::no_sslv3 |
+- boost::asio::ssl::context::single_dh_use);
++
ctx->set_options(websocketpp::lib::asio::ssl::context::default_workarounds |
++ websocketpp::lib::asio::ssl::context::no_sslv2 |
++ websocketpp::lib::asio::ssl::context::no_sslv3 |
++
websocketpp::lib::asio::ssl::context::single_dh_use);
+ } catch (std::exception& e) {
+ std::cout << e.what() << std::endl;
+ }
+diff --git a/examples/echo_server_both/echo_server_both.cpp
b/examples/echo_server_both/echo_server_both.cpp
+index a7e020401..c71b9a04c 100644
+--- a/examples/echo_server_both/echo_server_both.cpp
++++ b/examples/echo_server_both/echo_server_both.cpp
+@@ -15,7 +15,7 @@ using websocketpp::lib::bind;
+ using websocketpp::lib::error_code;
+
+ // type of the ssl context pointer is long so alias it
+-typedef websocketpp::lib::shared_ptr<boost::asio::ssl::context> context_ptr;
++typedef websocketpp::lib::shared_ptr<websocketpp::lib::asio::ssl::context>
context_ptr;
+
+ // The shared on_message handler takes a template parameter so the function
can
+ // resolve any endpoint dependent types like message_ptr or connection_ptr
+@@ -48,16 +48,16 @@ std::string get_password() {
+
+ context_ptr on_tls_init(websocketpp::connection_hdl hdl) {
+ std::cout << "on_tls_init called with hdl: " << hdl.lock().get() <<
std::endl;
+- context_ptr ctx(new
boost::asio::ssl::context(boost::asio::ssl::context::tlsv1));
++ context_ptr ctx(new
websocketpp::lib::asio::ssl::context(websocketpp::lib::asio::ssl::context::tlsv1));
+
+ try {
+- ctx->set_options(boost::asio::ssl::context::default_workarounds |
+- boost::asio::ssl::context::no_sslv2 |
+- boost::asio::ssl::context::no_sslv3 |
+- boost::asio::ssl::context::single_dh_use);
++
ctx->set_options(websocketpp::lib::asio::ssl::context::default_workarounds |
++ websocketpp::lib::asio::ssl::context::no_sslv2 |
++ websocketpp::lib::asio::ssl::context::no_sslv3 |
++ websocketpp::lib::asio::ssl::context::single_dh_use);
+ ctx->set_password_callback(bind(&get_password));
+ ctx->use_certificate_chain_file("server.pem");
+- ctx->use_private_key_file("server.pem",
boost::asio::ssl::context::pem);
++ ctx->use_private_key_file("server.pem",
websocketpp::lib::asio::ssl::context::pem);
+ } catch (std::exception& e) {
+ std::cout << e.what() << std::endl;
+ }
+@@ -67,7 +67,7 @@ context_ptr on_tls_init(websocketpp::connection_hdl hdl) {
+ int main() {
+ // set up an external io_context to run both endpoints on. This is not
+ // strictly necessary, but simplifies thread management a bit.
+- boost::asio::io_context ios;
++ websocketpp::lib::asio::io_context ios;
+
+ // set up plain endpoint
+ server_plain endpoint_plain;
+diff --git a/examples/external_io_context/external_io_context.cpp
b/examples/external_io_context/external_io_context.cpp
+index 08ca8e9f8..18ae2d12d 100644
+--- a/examples/external_io_context/external_io_context.cpp
++++ b/examples/external_io_context/external_io_context.cpp
+@@ -66,7 +66,7 @@ void on_end_accept(error_code lib_ec, error_code trans_ec) {
+ }
+
+ int main() {
+- asio::io_context context;
++ websocketpp::lib::asio::io_context context;
+
+ // Add a TCP echo server on port 9003
+ tcp_echo_server custom_http_server(context, 9003);
+diff --git a/examples/external_io_context/tcp_echo_server.hpp
b/examples/external_io_context/tcp_echo_server.hpp
+index 2e14703f5..f132c062e 100644
+--- a/examples/external_io_context/tcp_echo_server.hpp
++++ b/examples/external_io_context/tcp_echo_server.hpp
+@@ -39,42 +39,40 @@ using websocketpp::lib::placeholders::_1;
+ using websocketpp::lib::placeholders::_2;
+ using websocketpp::lib::bind;
+
+-namespace asio = websocketpp::lib::asio;
+-
+ struct tcp_echo_session :
websocketpp::lib::enable_shared_from_this<tcp_echo_session> {
+ typedef websocketpp::lib::shared_ptr<tcp_echo_session> ptr;
+
+- tcp_echo_session(asio::io_context & context) : m_socket(context) {}
++ tcp_echo_session(websocketpp::lib::asio::io_context & context) :
m_socket(context) {}
+
+ void start() {
+- m_socket.async_read_some(asio::buffer(m_buffer, sizeof(m_buffer)),
++ m_socket.async_read_some(websocketpp::lib::asio::buffer(m_buffer,
sizeof(m_buffer)),
+ websocketpp::lib::bind(
+ &tcp_echo_session::handle_read, shared_from_this(), _1, _2));
+ }
+
+- void handle_read(const asio::error_code & ec, size_t transferred) {
++ void handle_read(const websocketpp::lib::asio::error_code & ec, size_t
transferred) {
+ if (!ec) {
+- asio::async_write(m_socket,
+- asio::buffer(m_buffer, transferred),
++ websocketpp::lib::asio::async_write(m_socket,
++ websocketpp::lib::asio::buffer(m_buffer, transferred),
+ bind(&tcp_echo_session::handle_write, shared_from_this(),
_1));
+ }
+ }
+
+- void handle_write(const asio::error_code & ec) {
++ void handle_write(const websocketpp::lib::asio::error_code & ec) {
+ if (!ec) {
+- m_socket.async_read_some(asio::buffer(m_buffer, sizeof(m_buffer)),
++ m_socket.async_read_some(websocketpp::lib::asio::buffer(m_buffer,
sizeof(m_buffer)),
+ bind(&tcp_echo_session::handle_read, shared_from_this(), _1,
_2));
+ }
+ }
+
+- asio::ip::tcp::socket m_socket;
++ websocketpp::lib::asio::ip::tcp::socket m_socket;
+ char m_buffer[1024];
+ };
+
+ struct tcp_echo_server {
+- tcp_echo_server(asio::io_context & context, short port)
++ tcp_echo_server(websocketpp::lib::asio::io_context & context, short port)
+ : m_context(context)
+- , m_acceptor(context, asio::ip::tcp::endpoint(asio::ip::tcp::v6(),
port))
++ , m_acceptor(context,
websocketpp::lib::asio::ip::tcp::endpoint(websocketpp::lib::asio::ip::tcp::v6(),
port))
+ {
+ this->start_accept();
+ }
+@@ -85,13 +83,13 @@ struct tcp_echo_server {
+ bind(&tcp_echo_server::handle_accept, this, new_session, _1));
+ }
+
+- void handle_accept(tcp_echo_session::ptr new_session, const
asio::error_code & ec) {
++ void handle_accept(tcp_echo_session::ptr new_session, const
websocketpp::lib::asio::error_code & ec) {
+ if (!ec) {
+ new_session->start();
+ }
+ start_accept();
+ }
+
+- asio::io_context & m_context;
+- asio::ip::tcp::acceptor m_acceptor;
++ websocketpp::lib::asio::io_context & m_context;
++ websocketpp::lib::asio::ip::tcp::acceptor m_acceptor;
+ };
+diff --git a/examples/print_client_tls/print_client_tls.cpp
b/examples/print_client_tls/print_client_tls.cpp
+index 43164eaf7..cf616e165 100644
+--- a/examples/print_client_tls/print_client_tls.cpp
++++ b/examples/print_client_tls/print_client_tls.cpp
+@@ -112,7 +112,7 @@ bool verify_common_name(char const * hostname, X509 *
cert) {
+ * and
+ * https://github.com/iSECPartners/ssl-conservatory
+ */
+-bool verify_certificate(const char * hostname, bool preverified,
boost::asio::ssl::verify_context& ctx) {
++bool verify_certificate(const char * hostname, bool preverified,
websocketpp::lib::asio::ssl::verify_context& ctx) {
+ // The verify callback can be used to check whether the certificate that
is
+ // being presented is valid for the peer. For example, RFC 2818 describes
+ // the steps involved in doing this for HTTPS. Consult the OpenSSL
+@@ -176,16 +176,16 @@ bool verify_certificate(const char * hostname, bool
preverified, boost::asio::ss
+ * (websocketpp.org, for example).
+ */
+ context_ptr on_tls_init(const char * hostname, websocketpp::connection_hdl) {
+- context_ptr ctx =
websocketpp::lib::make_shared<boost::asio::ssl::context>(boost::asio::ssl::context::sslv23);
++ context_ptr ctx =
websocketpp::lib::make_shared<websocketpp::lib::asio::ssl::context>(websocketpp::lib::asio::ssl::context::sslv23);
+
+ try {
+- ctx->set_options(boost::asio::ssl::context::default_workarounds |
+- boost::asio::ssl::context::no_sslv2 |
+- boost::asio::ssl::context::no_sslv3 |
+- boost::asio::ssl::context::single_dh_use);
++
ctx->set_options(websocketpp::lib::asio::ssl::context::default_workarounds |
++ websocketpp::lib::asio::ssl::context::no_sslv2 |
++ websocketpp::lib::asio::ssl::context::no_sslv3 |
++ websocketpp::lib::asio::ssl::context::single_dh_use);
+
+
+- ctx->set_verify_mode(boost::asio::ssl::verify_peer);
++ ctx->set_verify_mode(websocketpp::lib::asio::ssl::verify_peer);
+ ctx->set_verify_callback(bind(&verify_certificate, hostname, ::_1,
::_2));
+
+ // Here we load the CA certificates of all CA's that this client
trusts.
+diff --git a/examples/testee_server/testee_server.cpp
b/examples/testee_server/testee_server.cpp
+index 7ff1b050f..7689644c9 100644
+--- a/examples/testee_server/testee_server.cpp
++++ b/examples/testee_server/testee_server.cpp
+@@ -88,8 +88,8 @@ void on_message(server* s, websocketpp::connection_hdl hdl,
message_ptr msg) {
+ s->send(hdl, msg->get_payload(), msg->get_opcode());
+ }
+
+-void on_socket_init(websocketpp::connection_hdl, boost::asio::ip::tcp::socket
& s) {
+- boost::asio::ip::tcp::no_delay option(true);
++void on_socket_init(websocketpp::connection_hdl,
websocketpp::lib::asio::ip::tcp::socket & s) {
++ websocketpp::lib::asio::ip::tcp::no_delay option(true);
+ s.set_option(option);
+ }
+
+diff --git a/test/endpoint/endpoint.cpp b/test/endpoint/endpoint.cpp
+index fa58e6678..c5f5a82d4 100644
+--- a/test/endpoint/endpoint.cpp
++++ b/test/endpoint/endpoint.cpp
+@@ -53,7 +53,7 @@ BOOST_AUTO_TEST_CASE( initialize_server_asio ) {
+
+ BOOST_AUTO_TEST_CASE( initialize_server_asio_external ) {
+ websocketpp::server<websocketpp::config::asio> s;
+- boost::asio::io_context ios;
++ websocketpp::lib::asio::io_context ios;
+ s.init_asio(&ios);
+ }
+
+@@ -141,8 +141,8 @@ BOOST_AUTO_TEST_CASE( listen_after_listen_failure ) {
+ server1.init_asio();
+ server2.init_asio();
+
+- boost::asio::ip::tcp::endpoint
ep1(boost::asio::ip::make_address("127.0.0.1"), 12345);
+- boost::asio::ip::tcp::endpoint
ep2(boost::asio::ip::make_address("127.0.0.1"), 23456);
++ websocketpp::lib::asio::ip::tcp::endpoint
ep1(websocketpp::lib::asio::ip::make_address("127.0.0.1"), 12345);
++ websocketpp::lib::asio::ip::tcp::endpoint
ep2(websocketpp::lib::asio::ip::make_address("127.0.0.1"), 23456);
+
+ server1.listen(ep1, ec);
+ BOOST_CHECK(!ec);
+diff --git a/test/http/parser_perf.cpp b/test/http/parser_perf.cpp
+index 0c76bc77a..0a9cc0bf2 100644
+--- a/test/http/parser_perf.cpp
++++ b/test/http/parser_perf.cpp
+@@ -31,11 +31,11 @@
+
+ class scoped_timer {
+ public:
+- scoped_timer(std::string i) :
m_id(i),m_start(std::chrono::steady_clock::now()) {
++ scoped_timer(std::string i) :
m_id(i),m_start(timer_ptr::element_type::clock_type::now()) {
+ std::cout << "Clock " << i << ": ";
+ }
+ ~scoped_timer() {
+- std::chrono::nanoseconds time_taken =
std::chrono::steady_clock::now()-m_start;
++ std::chrono::nanoseconds time_taken =
timer_ptr::element_type::clock_type::now()-m_start;
+
+ //nanoseconds_per_test
+
+diff --git a/test/transport/asio/timers.cpp b/test/transport/asio/timers.cpp
+index 391b755ff..d59654d19 100644
+--- a/test/transport/asio/timers.cpp
++++ b/test/transport/asio/timers.cpp
+@@ -106,9 +106,9 @@ struct config {
+ };
+
+ // Mock context that does no validation
+-typedef websocketpp::lib::shared_ptr<boost::asio::ssl::context> context_ptr;
++typedef websocketpp::lib::shared_ptr<websocketpp::lib::asio::ssl::context>
context_ptr;
+ context_ptr on_tls_init(websocketpp::connection_hdl) {
+- return context_ptr(new
boost::asio::ssl::context(boost::asio::ssl::context::sslv23));
++ return context_ptr(new
websocketpp::lib::asio::ssl::context(websocketpp::lib::asio::ssl::context::sslv23));
+ }
+
+ // Mock connection
+diff --git a/test/transport/integration.cpp b/test/transport/integration.cpp
+index ab82b1ab6..526b24302 100644
+--- a/test/transport/integration.cpp
++++ b/test/transport/integration.cpp
+@@ -38,6 +38,8 @@
+ #include <websocketpp/server.hpp>
+ #include <websocketpp/client.hpp>
+
++#include "boost/date_time/posix_time/posix_time.hpp"
++
+ struct config : public websocketpp::config::asio_client {
+ typedef config type;
+ typedef websocketpp::config::asio base;
+@@ -218,19 +220,19 @@ void run_time_limited_client(client & c, std::string
uri, long timeout,
+ }
+
+ void run_dummy_server(int port) {
+- using boost::asio::ip::tcp;
++ using websocketpp::lib::asio::ip::tcp;
+
+ try {
+- boost::asio::io_context io_context;
++ websocketpp::lib::asio::io_context io_context;
+ tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v6(), port));
+ tcp::socket socket(io_context);
+
+ acceptor.accept(socket);
+ for (;;) {
+ char data[512];
+- boost::system::error_code ec;
+- socket.read_some(boost::asio::buffer(data), ec);
+- if (ec == boost::asio::error::eof) {
++ websocketpp::lib::asio::error_code ec;
++ socket.read_some(websocketpp::lib::asio::buffer(data), ec);
++ if (ec == websocketpp::lib::asio::error::eof) {
+ break;
+ } else if (ec) {
+ // other error
+@@ -239,26 +241,26 @@ void run_dummy_server(int port) {
+ }
+ } catch (std::exception & e) {
+ std::cout << e.what() << std::endl;
+- } catch (boost::system::error_code & ec) {
++ } catch (websocketpp::lib::asio::error_code & ec) {
+ std::cout << ec.message() << std::endl;
+ }
+ }
+
+ void run_dummy_client(std::string port) {
+- using boost::asio::ip::tcp;
++ using websocketpp::lib::asio::ip::tcp;
+
+ try {
+- boost::asio::io_context io_context;
++ websocketpp::lib::asio::io_context io_context;
+ tcp::resolver resolver(io_context);
+ tcp::resolver::results_type endpoints = resolver.resolve("localhost",
port);
+ tcp::socket socket(io_context);
+
+- boost::asio::connect(socket, endpoints);
++ websocketpp::lib::asio::connect(socket, endpoints);
+ for (;;) {
+ char data[512];
+- boost::system::error_code ec;
+- socket.read_some(boost::asio::buffer(data), ec);
+- if (ec == boost::asio::error::eof) {
++ websocketpp::lib::asio::error_code ec;
++ socket.read_some(websocketpp::lib::asio::buffer(data), ec);
++ if (ec == websocketpp::lib::asio::error::eof) {
+ break;
+ } else if (ec) {
+ // other error
+@@ -267,7 +269,7 @@ void run_dummy_client(std::string port) {
+ }
+ } catch (std::exception & e) {
+ std::cout << e.what() << std::endl;
+- } catch (boost::system::error_code & ec) {
++ } catch (websocketpp::lib::asio::error_code & ec) {
+ std::cout << ec.message() << std::endl;
+ }
+ }
+@@ -360,7 +362,7 @@ class test_deadline_timer
+ : m_timer(m_io_context, boost::posix_time::seconds(seconds))
+ {
+ m_timer.async_wait(bind(&test_deadline_timer::expired, this, ::_1));
+- std::size_t (boost::asio::io_context::*run)() =
&boost::asio::io_context::run;
++ std::size_t (websocketpp::lib::asio::io_context::*run)() =
&websocketpp::lib::asio::io_context::run;
+ m_timer_thread = websocketpp::lib::thread(websocketpp::lib::bind(run,
&m_io_context));
+ }
+ ~test_deadline_timer()
+@@ -370,16 +372,16 @@ class test_deadline_timer
+ }
+
+ private:
+- void expired(const boost::system::error_code & ec)
++ void expired(const websocketpp::lib::asio::error_code & ec)
+ {
+- if (ec == boost::asio::error::operation_aborted)
++ if (ec == websocketpp::lib::asio::error::operation_aborted)
+ return;
+ BOOST_CHECK(!ec);
+ BOOST_FAIL("Test timed out");
+ }
+
+- boost::asio::io_context m_io_context;
+- boost::asio::deadline_timer m_timer;
++ websocketpp::lib::asio::io_context m_io_context;
++ websocketpp::lib::asio::deadline_timer m_timer;
+ websocketpp::lib::thread m_timer_thread;
+ };
+
+diff --git a/websocketpp/common/asio.hpp b/websocketpp/common/asio.hpp
+index 3c8fa13e9..7322c25ae 100644
+--- a/websocketpp/common/asio.hpp
++++ b/websocketpp/common/asio.hpp
+@@ -51,7 +51,7 @@
+
+ #include <asio.hpp>
+ #include <asio/steady_timer.hpp>
+- #include <websocketpp/common/chrono.hpp>
++ #include <websocketpp/common/chrono.hpp>
+ #else
+ #include <boost/version.hpp>
+
+diff --git a/websocketpp/transport/asio/connection.hpp
b/websocketpp/transport/asio/connection.hpp
+index af8eec5e1..389f72768 100644
+--- a/websocketpp/transport/asio/connection.hpp
++++ b/websocketpp/transport/asio/connection.hpp
+@@ -380,7 +380,7 @@ class connection : public
config::socket_type::socket_con_type {
+ * fail handler is called.
+ *
+ * Primarily used if you are using mismatched asio / system_error
+- * implementations such as `boost::asio` with `std::system_error`. In
these
++ * implementations such as `lib::asio` with `std::system_error`. In these
+ * cases the transport error type is different than the library error type
+ * and some WebSocket++ functions that return transport errors via the
+ * library error code type will be coerced into a catch all `pass_through`
+@@ -579,7 +579,7 @@ class connection : public
config::socket_type::socket_con_type {
+ lib::error_code const & ec)
+ {
+ if (ec == transport::error::operation_aborted ||
+- (post_timer && lib::asio::is_neg(post_timer->expiry() -
std::chrono::steady_clock::now())))
++ (post_timer && lib::asio::is_neg(post_timer->expiry() -
timer_ptr::element_type::clock_type::now())))
+ {
+ m_alog->write(log::alevel::devel,"post_init cancelled");
+ return;
+@@ -685,7 +685,7 @@ class connection : public
config::socket_type::socket_con_type {
+ // Whatever aborted it will be issuing the callback so we are safe to
+ // return
+ if (ec == lib::asio::error::operation_aborted ||
+- lib::asio::is_neg(m_proxy_data->timer->expiry() -
std::chrono::steady_clock::now()))
++ lib::asio::is_neg(m_proxy_data->timer->expiry() -
timer_ptr::element_type::clock_type::now()))
+ {
+ m_elog->write(log::elevel::devel,"write operation aborted");
+ return;
+@@ -756,7 +756,7 @@ class connection : public
config::socket_type::socket_con_type {
+ // Whatever aborted it will be issuing the callback so we are safe to
+ // return
+ if (ec == lib::asio::error::operation_aborted ||
+- lib::asio::is_neg(m_proxy_data->timer->expiry() -
std::chrono::steady_clock::now()))
++ lib::asio::is_neg(m_proxy_data->timer->expiry() -
timer_ptr::element_type::clock_type::now()))
+ {
+ m_elog->write(log::elevel::devel,"read operation aborted");
+ return;
+@@ -1030,18 +1030,18 @@ class connection : public
config::socket_type::socket_con_type {
+ */
+ lib::error_code interrupt(interrupt_handler handler) {
+ if (config::enable_multithreading) {
+- boost::asio::post(m_io_context->get_executor(),
m_strand->wrap(handler));
++ lib::asio::post(m_io_context->get_executor(),
m_strand->wrap(handler));
+ } else {
+- boost::asio::post(m_io_context->get_executor(), handler);
++ lib::asio::post(m_io_context->get_executor(), handler);
+ }
+ return lib::error_code();
+ }
+
+ lib::error_code dispatch(dispatch_handler handler) {
+ if (config::enable_multithreading) {
+- boost::asio::post(m_io_context->get_executor(),
m_strand->wrap(handler));
++ lib::asio::post(m_io_context->get_executor(),
m_strand->wrap(handler));
+ } else {
+- boost::asio::post(m_io_context->get_executor(), handler);
++ lib::asio::post(m_io_context->get_executor(), handler);
+ }
+ return lib::error_code();
+ }
+@@ -1113,7 +1113,7 @@ class connection : public
config::socket_type::socket_con_type {
+ callback, lib::asio::error_code const & ec)
+ {
+ if (ec == lib::asio::error::operation_aborted ||
+- lib::asio::is_neg(shutdown_timer->expiry() -
std::chrono::steady_clock::now()))
++ lib::asio::is_neg(shutdown_timer->expiry() -
timer_ptr::element_type::clock_type::now()))
+ {
+ m_alog->write(log::alevel::devel,"async_shutdown cancelled");
+ return;
+diff --git a/websocketpp/transport/asio/endpoint.hpp
b/websocketpp/transport/asio/endpoint.hpp
+index 05453437b..2871ff678 100644
+--- a/websocketpp/transport/asio/endpoint.hpp
++++ b/websocketpp/transport/asio/endpoint.hpp
+@@ -996,7 +996,7 @@ class endpoint : public config::socket_type {
+ lib::asio::ip::tcp::resolver::results_type endpoints)
+ {
+ if (ec == lib::asio::error::operation_aborted ||
+- lib::asio::is_neg(dns_timer->expiry() -
std::chrono::steady_clock::now()))
++ lib::asio::is_neg(dns_timer->expiry() -
timer_ptr::element_type::clock_type::now()))
+ {
+ m_alog->write(log::alevel::devel,"async_resolve cancelled");
+ return;
+@@ -1104,7 +1104,7 @@ class endpoint : public config::socket_type {
+ connect_handler callback, lib::asio::error_code const & ec)
+ {
+ if (ec == lib::asio::error::operation_aborted ||
+- lib::asio::is_neg(con_timer->expiry() -
std::chrono::steady_clock::now()))
++ lib::asio::is_neg(con_timer->expiry() -
timer_ptr::element_type::clock_type::now()))
+ {
+ m_alog->write(log::alevel::devel,"async_connect cancelled");
+ return;
+diff --git a/websocketpp/transport/asio/security/tls.hpp
b/websocketpp/transport/asio/security/tls.hpp
+index d65c48cc9..1db1a1074 100644
+--- a/websocketpp/transport/asio/security/tls.hpp
++++ b/websocketpp/transport/asio/security/tls.hpp
+@@ -240,6 +240,7 @@ class connection : public
lib::enable_shared_from_this<connection> {
+
+ // run the hostname through make_address to check if it is a
valid IP literal
+ lib::asio::ip::address addr = lib::asio::ip::make_address(host,
ec_addr);
++ (void)addr;
+
+ // If the parsing as an IP literal fails, proceed to register the
hostname
+ // with the TLS handshake via SNI.
+
+From dbdde20a9b4ffd49f480fd9e6e29ea212a73253b Mon Sep 17 00:00:00 2001
+From: Amini Allight <[email protected]>
+Date: Fri, 14 Feb 2025 23:13:38 +0000
+Subject: [PATCH 5/8] improved variable names and fixed comments
+
+---
+ .../echo_server_both/echo_server_both.cpp | 8 ++---
+ test/endpoint/endpoint.cpp | 4 +--
+ test/transport/asio/timers.cpp | 4 +--
+ test/transport/integration.cpp | 4 +--
+ websocketpp/transport/asio/connection.hpp | 2 +-
+ websocketpp/transport/asio/endpoint.hpp | 30 +++++++++----------
+ 6 files changed, 25 insertions(+), 27 deletions(-)
+
+diff --git a/examples/echo_server_both/echo_server_both.cpp
b/examples/echo_server_both/echo_server_both.cpp
+index c71b9a04c..af33cd23e 100644
+--- a/examples/echo_server_both/echo_server_both.cpp
++++ b/examples/echo_server_both/echo_server_both.cpp
+@@ -67,12 +67,12 @@ context_ptr on_tls_init(websocketpp::connection_hdl hdl) {
+ int main() {
+ // set up an external io_context to run both endpoints on. This is not
+ // strictly necessary, but simplifies thread management a bit.
+- websocketpp::lib::asio::io_context ios;
++ websocketpp::lib::asio::io_context ctx;
+
+ // set up plain endpoint
+ server_plain endpoint_plain;
+ // initialize asio with our external io_context rather than an internal
one
+- endpoint_plain.init_asio(&ios);
++ endpoint_plain.init_asio(&ctx);
+ endpoint_plain.set_message_handler(
+ bind(&on_message<server_plain>,&endpoint_plain,::_1,::_2));
+ endpoint_plain.listen(80);
+@@ -80,7 +80,7 @@ int main() {
+
+ // set up tls endpoint
+ server_tls endpoint_tls;
+- endpoint_tls.init_asio(&ios);
++ endpoint_tls.init_asio(&ctx);
+ endpoint_tls.set_message_handler(
+ bind(&on_message<server_tls>,&endpoint_tls,::_1,::_2));
+ // TLS endpoint has an extra handler for the tls init
+@@ -90,5 +90,5 @@ int main() {
+ endpoint_tls.start_accept(&on_end_accept);
+
+ // Start the ASIO io_context run loop running both endpoints
+- ios.run();
++ ctx.run();
+ }
+diff --git a/test/endpoint/endpoint.cpp b/test/endpoint/endpoint.cpp
+index c5f5a82d4..184027848 100644
+--- a/test/endpoint/endpoint.cpp
++++ b/test/endpoint/endpoint.cpp
+@@ -53,8 +53,8 @@ BOOST_AUTO_TEST_CASE( initialize_server_asio ) {
+
+ BOOST_AUTO_TEST_CASE( initialize_server_asio_external ) {
+ websocketpp::server<websocketpp::config::asio> s;
+- websocketpp::lib::asio::io_context ios;
+- s.init_asio(&ios);
++ websocketpp::lib::asio::io_context ctx;
++ s.init_asio(&ctx);
+ }
+
+ #ifdef _WEBSOCKETPP_MOVE_SEMANTICS_
+diff --git a/test/transport/asio/timers.cpp b/test/transport/asio/timers.cpp
+index d59654d19..84938cbf0 100644
+--- a/test/transport/asio/timers.cpp
++++ b/test/transport/asio/timers.cpp
+@@ -79,8 +79,8 @@ void run_dummy_server(int port) {
+
+ // Wait for the specified time period then fail the test
+ void run_test_timer(long value) {
+- boost::asio::io_context ios;
+- boost::asio::deadline_timer t(ios,boost::posix_time::milliseconds(value));
++ boost::asio::io_context ctx;
++ boost::asio::deadline_timer t(ctx,boost::posix_time::milliseconds(value));
+ boost::system::error_code ec;
+ t.wait(ec);
+ BOOST_FAIL( "Test timed out" );
+diff --git a/test/transport/integration.cpp b/test/transport/integration.cpp
+index 526b24302..371c5540f 100644
+--- a/test/transport/integration.cpp
++++ b/test/transport/integration.cpp
+@@ -252,10 +252,10 @@ void run_dummy_client(std::string port) {
+ try {
+ websocketpp::lib::asio::io_context io_context;
+ tcp::resolver resolver(io_context);
+- tcp::resolver::results_type endpoints = resolver.resolve("localhost",
port);
++ tcp::resolver::results_type results = resolver.resolve("localhost",
port);
+ tcp::socket socket(io_context);
+
+- websocketpp::lib::asio::connect(socket, endpoints);
++ websocketpp::lib::asio::connect(socket, results);
+ for (;;) {
+ char data[512];
+ websocketpp::lib::asio::error_code ec;
+diff --git a/websocketpp/transport/asio/connection.hpp
b/websocketpp/transport/asio/connection.hpp
+index 389f72768..3c14261fa 100644
+--- a/websocketpp/transport/asio/connection.hpp
++++ b/websocketpp/transport/asio/connection.hpp
+@@ -380,7 +380,7 @@ class connection : public
config::socket_type::socket_con_type {
+ * fail handler is called.
+ *
+ * Primarily used if you are using mismatched asio / system_error
+- * implementations such as `lib::asio` with `std::system_error`. In these
++ * implementations such as `boost::asio` with `std::system_error`. In
these
+ * cases the transport error type is different than the library error type
+ * and some WebSocket++ functions that return transport errors via the
+ * library error code type will be coerced into a catch all `pass_through`
+diff --git a/websocketpp/transport/asio/endpoint.hpp
b/websocketpp/transport/asio/endpoint.hpp
+index 2871ff678..60b457610 100644
+--- a/websocketpp/transport/asio/endpoint.hpp
++++ b/websocketpp/transport/asio/endpoint.hpp
+@@ -86,7 +86,7 @@ class endpoint : public config::socket_type {
+ /// Type of timer handle
+ typedef lib::shared_ptr<lib::asio::steady_timer> timer_ptr;
+ /// Type of a shared pointer to an io_context work object
+- typedef
lib::shared_ptr<lib::asio::executor_work_guard<lib::asio::io_context::executor_type>>
work_ptr;
++ typedef
lib::shared_ptr<lib::asio::executor_work_guard<lib::asio::io_context::executor_type>>
work_guard_ptr;
+
+ /// Type of socket pre-bind handler
+ typedef lib::function<lib::error_code(acceptor_ptr)> tcp_pre_bind_handler;
+@@ -108,7 +108,7 @@ class endpoint : public config::socket_type {
+ // Explicitly destroy local objects
+ m_acceptor.reset();
+ m_resolver.reset();
+- m_work.reset();
++ m_work_guard.reset();
+ if (m_state != UNINITIALIZED && !m_external_io_context) {
+ delete m_io_context;
+ }
+@@ -495,8 +495,7 @@ class endpoint : public config::socket_type {
+ /**
+ * Bind the internal acceptor using the given host and service. More
details
+ * about what host and service can be are available in the Asio
+- * documentation for ip::basic_resolver_query::basic_resolver_query's
+- * constructors.
++ * documentation for the ip::basic_resolver::resolve function.
+ *
+ * The endpoint must have been initialized by calling init_asio before
+ * listening.
+@@ -519,14 +518,14 @@ class endpoint : public config::socket_type {
+ {
+ using lib::asio::ip::tcp;
+ tcp::resolver r(*m_io_context);
+- tcp::resolver::results_type endpoints = r.resolve(host, service);
+- if (endpoints.empty()) {
++ tcp::resolver::results_type results = r.resolve(host, service);
++ if (results.empty()) {
+ m_elog->write(log::elevel::library,
+ "asio::listen could not resolve the supplied host or
service");
+ ec = make_error_code(error::invalid_host_service);
+ return;
+ }
+- listen(*endpoints.begin(),ec);
++ listen(*(results.begin()),ec);
+ }
+
+ /// Stop listening (exception free)
+@@ -613,8 +612,7 @@ class endpoint : public config::socket_type {
+ /**
+ * Bind the internal acceptor using the given host and service. More
+ * details about what host and service can be are available in the Asio
+- * documentation for ip::basic_resolver_query::basic_resolver_query's
+- * constructors.
++ * documentation for the ip::basic_resolver::resolve function.
+ *
+ * The endpoint must have been initialized by calling init_asio before
+ * listening.
+@@ -712,7 +710,7 @@ class endpoint : public config::socket_type {
+ * @since 0.3.0
+ */
+ void start_perpetual() {
+- m_work.reset(new
lib::asio::executor_work_guard<lib::asio::io_context::executor_type>(m_io_context->get_executor()));
++ m_work_guard.reset(new
lib::asio::executor_work_guard<lib::asio::io_context::executor_type>(m_io_context->get_executor()));
+ }
+
+ /// Clears the endpoint's perpetual flag, allowing it to exit when empty
+@@ -724,7 +722,7 @@ class endpoint : public config::socket_type {
+ * @since 0.3.0
+ */
+ void stop_perpetual() {
+- m_work.reset();
++ m_work_guard.reset();
+ }
+
+ /// Call back a function after a period of time.
+@@ -993,7 +991,7 @@ class endpoint : public config::socket_type {
+
+ void handle_resolve(transport_con_ptr tcon, timer_ptr dns_timer,
+ connect_handler callback, lib::asio::error_code const & ec,
+- lib::asio::ip::tcp::resolver::results_type endpoints)
++ lib::asio::ip::tcp::resolver::results_type results)
+ {
+ if (ec == lib::asio::error::operation_aborted ||
+ lib::asio::is_neg(dns_timer->expiry() -
timer_ptr::element_type::clock_type::now()))
+@@ -1015,7 +1013,7 @@ class endpoint : public config::socket_type {
+ s << "Async DNS resolve successful. Results: ";
+
+ lib::asio::ip::tcp::resolver::results_type::iterator it;
+- for (it = endpoints.begin(); it != endpoints.end(); ++it) {
++ for (it = results.begin(); it != results.end(); ++it) {
+ s << (*it).endpoint() << " ";
+ }
+
+@@ -1041,7 +1039,7 @@ class endpoint : public config::socket_type {
+ if (config::enable_multithreading) {
+ lib::asio::async_connect(
+ tcon->get_raw_socket(),
+- endpoints,
++ results,
+ tcon->get_strand()->wrap(lib::bind(
+ &type::handle_connect,
+ this,
+@@ -1054,7 +1052,7 @@ class endpoint : public config::socket_type {
+ } else {
+ lib::asio::async_connect(
+ tcon->get_raw_socket(),
+- endpoints,
++ results,
+ lib::bind(
+ &type::handle_connect,
+ this,
+@@ -1189,7 +1187,7 @@ class endpoint : public config::socket_type {
+ bool m_external_io_context;
+ acceptor_ptr m_acceptor;
+ resolver_ptr m_resolver;
+- work_ptr m_work;
++ work_guard_ptr m_work_guard;
+
+ // Network constants
+ int m_listen_backlog;
+
+From 096487461fe834c30fb322ac0b9088ad82e5a2d5 Mon Sep 17 00:00:00 2001
+From: Amini Allight <[email protected]>
+Date: Thu, 20 Feb 2025 06:19:46 +0000
+Subject: [PATCH 6/8] fixed use of deprecated boost::asio::deadline_timer in
+ tests
+
+---
+ test/transport/asio/timers.cpp | 3 ++-
+ test/transport/integration.cpp | 27 ++++++++++++++-------------
+ 2 files changed, 16 insertions(+), 14 deletions(-)
+
+diff --git a/test/transport/asio/timers.cpp b/test/transport/asio/timers.cpp
+index 84938cbf0..22a4bba82 100644
+--- a/test/transport/asio/timers.cpp
++++ b/test/transport/asio/timers.cpp
+@@ -80,7 +80,8 @@ void run_dummy_server(int port) {
+ // Wait for the specified time period then fail the test
+ void run_test_timer(long value) {
+ boost::asio::io_context ctx;
+- boost::asio::deadline_timer t(ctx,boost::posix_time::milliseconds(value));
++ boost::asio::system_timer t(ctx);
++ t.expires_after(std::chrono::milliseconds(value));
+ boost::system::error_code ec;
+ t.wait(ec);
+ BOOST_FAIL( "Test timed out" );
+diff --git a/test/transport/integration.cpp b/test/transport/integration.cpp
+index 371c5540f..70f444292 100644
+--- a/test/transport/integration.cpp
++++ b/test/transport/integration.cpp
+@@ -355,17 +355,18 @@ void close(T * e, websocketpp::connection_hdl hdl) {
+ e->get_con_from_hdl(hdl)->close(websocketpp::close::status::normal,"");
+ }
+
+-class test_deadline_timer
++class test_system_timer
+ {
+ public:
+- test_deadline_timer(int seconds)
+- : m_timer(m_io_context, boost::posix_time::seconds(seconds))
++ test_system_timer(int seconds)
++ : m_timer(m_io_context)
+ {
+- m_timer.async_wait(bind(&test_deadline_timer::expired, this, ::_1));
++ m_timer.expires_after(std::chrono::seconds(seconds));
++ m_timer.async_wait(bind(&test_system_timer::expired, this, ::_1));
+ std::size_t (websocketpp::lib::asio::io_context::*run)() =
&websocketpp::lib::asio::io_context::run;
+ m_timer_thread = websocketpp::lib::thread(websocketpp::lib::bind(run,
&m_io_context));
+ }
+- ~test_deadline_timer()
++ ~test_system_timer()
+ {
+ m_timer.cancel();
+ m_timer_thread.join();
+@@ -381,7 +382,7 @@ class test_deadline_timer
+ }
+
+ websocketpp::lib::asio::io_context m_io_context;
+- websocketpp::lib::asio::deadline_timer m_timer;
++ websocketpp::lib::asio::system_timer m_timer;
+ websocketpp::lib::thread m_timer_thread;
+ };
+
+@@ -427,7 +428,7 @@ BOOST_AUTO_TEST_CASE( pong_timeout ) {
+ websocketpp::lib::thread
sthread(websocketpp::lib::bind(&run_server,&s,9005,false));
+ sleep(1); // give the server thread some time to start
+
+- test_deadline_timer deadline(10);
++ test_system_timer deadline(10);
+
+ run_client(c, "http://localhost:9005",false);
+
+@@ -448,7 +449,7 @@ BOOST_AUTO_TEST_CASE( client_open_handshake_timeout ) {
+
+ sleep(1); // give the server thread some time to start
+
+- test_deadline_timer deadline(10);
++ test_system_timer deadline(10);
+
+ run_client(c, "http://localhost:9005");
+ }
+@@ -464,7 +465,7 @@ BOOST_AUTO_TEST_CASE( server_open_handshake_timeout ) {
+
+ websocketpp::lib::thread
sthread(websocketpp::lib::bind(&run_server,&s,9005,false));
+
+- test_deadline_timer deadline(10);
++ test_system_timer deadline(10);
+
+ sleep(1); // give the server thread some time to start
+
+@@ -489,7 +490,7 @@ BOOST_AUTO_TEST_CASE(
client_self_initiated_close_handshake_timeout ) {
+
+ websocketpp::lib::thread
sthread(websocketpp::lib::bind(&run_server,&s,9005,false));
+
+- test_deadline_timer deadline(10);
++ test_system_timer deadline(10);
+
+ sleep(1); // give the server thread some time to start
+
+@@ -522,7 +523,7 @@ BOOST_AUTO_TEST_CASE(
server_self_initiated_close_handshake_timeout ) {
+ c.set_open_handler(bind(&delay,::_1,1));
+
+ websocketpp::lib::thread
sthread(websocketpp::lib::bind(&run_server,&s,9005,false));
+- test_deadline_timer deadline(10);
++ test_system_timer deadline(10);
+
+ sleep(1); // give the server thread some time to start
+
+@@ -534,7 +535,7 @@ BOOST_AUTO_TEST_CASE(
server_self_initiated_close_handshake_timeout ) {
+ BOOST_AUTO_TEST_CASE( client_runs_out_of_work ) {
+ client c;
+
+- test_deadline_timer deadline(3);
++ test_system_timer deadline(3);
+
+ websocketpp::lib::error_code ec;
+ c.init_asio(ec);
+@@ -600,7 +601,7 @@ BOOST_AUTO_TEST_CASE( stop_listening ) {
+ c.set_open_handler(bind(&close<client>,&c,::_1));
+
+ websocketpp::lib::thread
sthread(websocketpp::lib::bind(&run_server,&s,9005,false));
+- test_deadline_timer deadline(5);
++ test_system_timer deadline(5);
+
+ sleep(1); // give the server thread some time to start
+
+
+From a11fa6fe4937ca251753e90b1836a68bf57768a9 Mon Sep 17 00:00:00 2001
+From: Amini Allight <[email protected]>
+Date: Thu, 20 Feb 2025 17:25:03 +0000
+Subject: [PATCH 7/8] replaced uses of boost::asio::io_context::strand::wrap
+ with boost::asio::bind_executor to avoid future deprecation issues
+
+---
+ websocketpp/transport/asio/connection.hpp | 16 ++++++++--------
+ websocketpp/transport/asio/endpoint.hpp | 6 +++---
+ websocketpp/transport/asio/security/tls.hpp | 4 ++--
+ 3 files changed, 13 insertions(+), 13 deletions(-)
+
+diff --git a/websocketpp/transport/asio/connection.hpp
b/websocketpp/transport/asio/connection.hpp
+index 3c14261fa..5f47466e7 100644
+--- a/websocketpp/transport/asio/connection.hpp
++++ b/websocketpp/transport/asio/connection.hpp
+@@ -324,7 +324,7 @@ class connection : public
config::socket_type::socket_con_type {
+ );
+
+ if (config::enable_multithreading) {
+- new_timer->async_wait(m_strand->wrap(lib::bind(
++ new_timer->async_wait(lib::asio::bind_executor(*m_strand,
lib::bind(
+ &type::handle_timer, get_shared(),
+ new_timer,
+ callback,
+@@ -635,7 +635,7 @@ class connection : public
config::socket_type::socket_con_type {
+ lib::asio::async_write(
+ socket_con_type::get_next_layer(),
+ m_bufs,
+- m_strand->wrap(lib::bind(
++ lib::asio::bind_executor(*m_strand, lib::bind(
+ &type::handle_proxy_write, get_shared(),
+ callback,
+ lib::placeholders::_1
+@@ -718,7 +718,7 @@ class connection : public
config::socket_type::socket_con_type {
+ socket_con_type::get_next_layer(),
+ m_proxy_data->read_buf,
+ "\r\n\r\n",
+- m_strand->wrap(lib::bind(
++ lib::asio::bind_executor(*m_strand, lib::bind(
+ &type::handle_proxy_read, get_shared(),
+ callback,
+ lib::placeholders::_1, lib::placeholders::_2
+@@ -856,7 +856,7 @@ class connection : public
config::socket_type::socket_con_type {
+ socket_con_type::get_socket(),
+ lib::asio::buffer(buf,len),
+ lib::asio::transfer_at_least(num_bytes),
+- m_strand->wrap(make_custom_alloc_handler(
++ lib::asio::bind_executor(*m_strand, make_custom_alloc_handler(
+ m_read_handler_allocator,
+ lib::bind(
+ &type::handle_async_read, get_shared(),
+@@ -925,7 +925,7 @@ class connection : public
config::socket_type::socket_con_type {
+ lib::asio::async_write(
+ socket_con_type::get_socket(),
+ m_bufs,
+- m_strand->wrap(make_custom_alloc_handler(
++ lib::asio::bind_executor(*m_strand, make_custom_alloc_handler(
+ m_write_handler_allocator,
+ lib::bind(
+ &type::handle_async_write, get_shared(),
+@@ -965,7 +965,7 @@ class connection : public
config::socket_type::socket_con_type {
+ lib::asio::async_write(
+ socket_con_type::get_socket(),
+ m_bufs,
+- m_strand->wrap(make_custom_alloc_handler(
++ lib::asio::bind_executor(*m_strand, make_custom_alloc_handler(
+ m_write_handler_allocator,
+ lib::bind(
+ &type::handle_async_write, get_shared(),
+@@ -1030,7 +1030,7 @@ class connection : public
config::socket_type::socket_con_type {
+ */
+ lib::error_code interrupt(interrupt_handler handler) {
+ if (config::enable_multithreading) {
+- lib::asio::post(m_io_context->get_executor(),
m_strand->wrap(handler));
++ lib::asio::post(m_io_context->get_executor(),
lib::asio::bind_executor(*m_strand, handler));
+ } else {
+ lib::asio::post(m_io_context->get_executor(), handler);
+ }
+@@ -1039,7 +1039,7 @@ class connection : public
config::socket_type::socket_con_type {
+
+ lib::error_code dispatch(dispatch_handler handler) {
+ if (config::enable_multithreading) {
+- lib::asio::post(m_io_context->get_executor(),
m_strand->wrap(handler));
++ lib::asio::post(m_io_context->get_executor(),
lib::asio::bind_executor(*m_strand, handler));
+ } else {
+ lib::asio::post(m_io_context->get_executor(), handler);
+ }
+diff --git a/websocketpp/transport/asio/endpoint.hpp
b/websocketpp/transport/asio/endpoint.hpp
+index 60b457610..4d03ba51f 100644
+--- a/websocketpp/transport/asio/endpoint.hpp
++++ b/websocketpp/transport/asio/endpoint.hpp
+@@ -802,7 +802,7 @@ class endpoint : public config::socket_type {
+ if (config::enable_multithreading) {
+ m_acceptor->async_accept(
+ tcon->get_raw_socket(),
+- tcon->get_strand()->wrap(lib::bind(
++ lib::asio::bind_executor(*tcon->get_strand(), lib::bind(
+ &type::handle_accept,
+ this,
+ callback,
+@@ -930,7 +930,7 @@ class endpoint : public config::socket_type {
+ m_resolver->async_resolve(
+ host,
+ port,
+- tcon->get_strand()->wrap(lib::bind(
++ lib::asio::bind_executor(*tcon->get_strand(), lib::bind(
+ &type::handle_resolve,
+ this,
+ tcon,
+@@ -1040,7 +1040,7 @@ class endpoint : public config::socket_type {
+ lib::asio::async_connect(
+ tcon->get_raw_socket(),
+ results,
+- tcon->get_strand()->wrap(lib::bind(
++ lib::asio::bind_executor(*tcon->get_strand(), lib::bind(
+ &type::handle_connect,
+ this,
+ tcon,
+diff --git a/websocketpp/transport/asio/security/tls.hpp
b/websocketpp/transport/asio/security/tls.hpp
+index 1db1a1074..f894f0e89 100644
+--- a/websocketpp/transport/asio/security/tls.hpp
++++ b/websocketpp/transport/asio/security/tls.hpp
+@@ -277,7 +277,7 @@ class connection : public
lib::enable_shared_from_this<connection> {
+ if (m_strand) {
+ m_socket->async_handshake(
+ get_handshake_type(),
+- m_strand->wrap(lib::bind(
++ lib::asio::bind_executor(*m_strand, lib::bind(
+ &type::handle_init, get_shared(),
+ callback,
+ lib::placeholders::_1
+@@ -337,7 +337,7 @@ class connection : public
lib::enable_shared_from_this<connection> {
+
+ void async_shutdown(socket::shutdown_handler callback) {
+ if (m_strand) {
+- m_socket->async_shutdown(m_strand->wrap(callback));
++ m_socket->async_shutdown(lib::asio::bind_executor(*m_strand,
callback));
+ } else {
+ m_socket->async_shutdown(callback);
+ }
+
+From ee8cf4257e001d939839cff5b1766a835b749cd6 Mon Sep 17 00:00:00 2001
+From: Amini Allight <[email protected]>
+Date: Wed, 9 Apr 2025 05:45:40 +0000
+Subject: [PATCH 8/8] increased minimum Boost version in CMakeLists, fixed use
+ of FindBoost in CMakeLists, bumped CMakeLists version, removed unnecessary
+ boost compatibility macros
+
+---
+ CMakeLists.txt | 5 ++---
+ websocketpp/common/random.hpp | 12 ++----------
+ 2 files changed, 4 insertions(+), 13 deletions(-)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index badb66409..43f7f3255 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -2,7 +2,7 @@
+ ############ Setup project and cmake
+ # Minimum cmake requirement. We should require a quite recent
+ # cmake for the dependency find macros etc. to be up to date.
+-cmake_minimum_required (VERSION 2.8.8)
++cmake_minimum_required (VERSION 3.10)
+
+ ############ Paths
+
+@@ -222,9 +222,8 @@ if (BUILD_TESTS OR BUILD_EXAMPLES)
+ set (Boost_FIND_QUIETLY TRUE)
+ set (Boost_DEBUG FALSE)
+ set (Boost_USE_MULTITHREADED TRUE)
+- set (Boost_ADDITIONAL_VERSIONS "1.39.0" "1.40.0" "1.41.0" "1.42.0"
"1.43.0" "1.44.0" "1.46.1") # todo: someone who knows better spesify these!
+
+- find_package (Boost 1.39.0 COMPONENTS ${WEBSOCKETPP_BOOST_LIBS})
++ find_package (Boost 1.66.0 NO_MODULE COMPONENTS ${WEBSOCKETPP_BOOST_LIBS})
+
+ if (Boost_FOUND)
+ # Boost is a project wide global dependency.
+diff --git a/websocketpp/common/random.hpp b/websocketpp/common/random.hpp
+index ddf996941..7ac974563 100644
+--- a/websocketpp/common/random.hpp
++++ b/websocketpp/common/random.hpp
+@@ -53,16 +53,8 @@
+ #ifdef _WEBSOCKETPP_CPP11_RANDOM_DEVICE_
+ #include <random>
+ #else
+- #include <boost/version.hpp>
+-
+- #if (BOOST_VERSION/100000) == 1 && ((BOOST_VERSION/100)%1000) > 46
+- #include <boost/random/uniform_int_distribution.hpp>
+- #include <boost/random/random_device.hpp>
+- #elif (BOOST_VERSION/100000) == 1 && ((BOOST_VERSION/100)%1000) >= 43
+- #include <boost/nondet_random.hpp>
+- #else
+- // TODO: static_assert(false, "Could not find a suitable
random_device")
+- #endif
++ #include <boost/random/uniform_int_distribution.hpp>
++ #include <boost/random/random_device.hpp>
+ #endif
+
+ namespace websocketpp {
diff --git a/gnu/packages/web.scm b/gnu/packages/web.scm
index 3a4c557267..65d80a58f3 100644
--- a/gnu/packages/web.scm
+++ b/gnu/packages/web.scm
@@ -2177,6 +2177,45 @@ implementation that is simple, portable, flexible,
lightweight, low level, and
high performance.")
(license license:bsd-3)))
+;; websocketpp main is not moving very fast, this version is required for later
+;; versions of Boost. https://github.com/zaphoyd/websocketpp/pull/1164
+(define-public websocketpp-next
+ (let ((commit "b9aeec6eaf3d5610503439b4fae3581d9aff08e8"))
+ (package
+ (name "websocketpp-next")
+ (version "0.8.2-next")
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/zaphoyd/websocketpp")
+ (commit commit)))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "1z4wm5ipchmxg709n4066fl6yq5gzg7qjx2ap18bhbsx85p403mb"))
+ (patches (search-patches
+ "websocketpp-boost-compat.patch"))))
+ (build-system cmake-build-system)
+ (inputs (list boost-1.83 openssl))
+ (arguments '(#:parallel-tests? #f
+ #:configure-flags '("-DBUILD_TESTS=ON")
+ #:phases
+ (modify-phases %standard-phases
+ (add-after 'install 'remove-tests
+ (lambda* (#:key outputs #:allow-other-keys)
+ (let* ((install-dir (assoc-ref outputs "out"))
+ (bin-dir (string-append install-dir "/bin")))
+ (delete-file-recursively bin-dir)
+ #t))))))
+ (home-page "https://www.zaphoyd.com/websocketpp/")
+ (synopsis "C++ library implementing the WebSocket protocol")
+ (description "WebSocket++ is a C++ library that can be used to implement
+WebSocket functionality. The goals of the project are to provide a WebSocket
+implementation that is simple, portable, flexible, lightweight, low level, and
+high performance.")
+ (license license:bsd-3))))
+
(define-public wslay
(package
(name "wslay")