From 2b977f27703bb937e270308a87d02093693b1cae Mon Sep 17 00:00:00 2001 From: jarle Date: Sun, 2 Sep 2018 13:28:50 +0200 Subject: [PATCH] Fix timer on websocket upgrade in examples fix #1091, fix #1240, fix #1253 --- CHANGELOG.md | 1 + doc/qbk/09_releases.qbk | 2 ++ example/advanced/server-flex/advanced_server_flex.cpp | 8 ++++++++ example/advanced/server/advanced_server.cpp | 8 ++++++++ 4 files changed, 19 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 38b0f39a..a1dcfc70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ Version 184: * Remove extraneous function * Fix some typos * Add BOOST_BEAST_USE_STD_STRING_VIEW +* Fix timer on websocket upgrade in examples -------------------------------------------------------------------------------- diff --git a/doc/qbk/09_releases.qbk b/doc/qbk/09_releases.qbk index 96acbba4..98a1e77f 100644 --- a/doc/qbk/09_releases.qbk +++ b/doc/qbk/09_releases.qbk @@ -25,6 +25,8 @@ * ([issue 1233]) Use [@boost:/doc/html/core/empty_value.html `boost::empty_value`] +* ([issue 1091]) Fix timer on websocket upgrade in examples + * Workaround for http-server-fast and libstdc++ diff --git a/example/advanced/server-flex/advanced_server_flex.cpp b/example/advanced/server-flex/advanced_server_flex.cpp index 07f799f0..ab00247e 100644 --- a/example/advanced/server-flex/advanced_server_flex.cpp +++ b/example/advanced/server-flex/advanced_server_flex.cpp @@ -811,6 +811,10 @@ public: if(ec && ec != boost::asio::error::operation_aborted) return fail(ec, "timer"); + // Check if this has been upgraded to Websocket + if(timer_.expires_at() == (std::chrono::steady_clock::time_point::min)()) + return; + // Verify that the timer really expired since the deadline may have moved. if(timer_.expiry() <= std::chrono::steady_clock::now()) return derived().do_timeout(); @@ -842,6 +846,10 @@ public: // See if it is a WebSocket Upgrade if(websocket::is_upgrade(req_)) { + // Make timer expire immediately, by setting expiry to time_point::min we can detect + // the upgrade to websocket in the timer handler + timer_.expires_at((std::chrono::steady_clock::time_point::min)()); + // Transfer the stream to a new WebSocket session return make_websocket_session( derived().release_stream(), diff --git a/example/advanced/server/advanced_server.cpp b/example/advanced/server/advanced_server.cpp index cfcbed7d..829b2dc8 100644 --- a/example/advanced/server/advanced_server.cpp +++ b/example/advanced/server/advanced_server.cpp @@ -621,6 +621,10 @@ public: if(ec && ec != boost::asio::error::operation_aborted) return fail(ec, "timer"); + // Check if this has been upgraded to Websocket + if(timer_.expires_at() == (std::chrono::steady_clock::time_point::min)()) + return; + // Verify that the timer really expired since the deadline may have moved. if(timer_.expiry() <= std::chrono::steady_clock::now()) { @@ -658,6 +662,10 @@ public: // See if it is a WebSocket Upgrade if(websocket::is_upgrade(req_)) { + // Make timer expire immediately, by setting expiry to time_point::min we can detect + // the upgrade to websocket in the timer handler + timer_.expires_at((std::chrono::steady_clock::time_point::min)()); + // Create a WebSocket websocket_session by transferring the socket std::make_shared( std::move(socket_))->do_accept(std::move(req_));