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")

Reply via email to