From d613feae01b5f824193dad09e22bda48ac4ae63e Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Tue, 8 Aug 2017 17:38:48 -0700 Subject: [PATCH] Example HTTP server fixes --- CHANGELOG.md | 1 + example/advanced/server-flex/CMakeLists.txt | 1 - .../server-flex/advanced_server_flex.cpp | 50 +++++------------- example/advanced/server/CMakeLists.txt | 2 - example/advanced/server/advanced_server.cpp | 52 +++++-------------- .../async-ssl/http_server_async_ssl.cpp | 2 +- .../http/server/async/http_server_async.cpp | 2 +- .../server/coro-ssl/http_server_coro_ssl.cpp | 2 +- example/http/server/coro/http_server_coro.cpp | 2 +- example/http/server/flex/http_server_flex.cpp | 2 +- .../http_server_stackless_ssl.cpp | 2 +- .../stackless/http_server_stackless.cpp | 2 +- .../server/sync-ssl/http_server_sync_ssl.cpp | 2 +- example/http/server/sync/http_server_sync.cpp | 2 +- 14 files changed, 38 insertions(+), 86 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 36f17631..f7a6985a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ Version 103: * Boost test matrix fixes * Tidy up allocator usage +* Example HTTP server fixes -------------------------------------------------------------------------------- diff --git a/example/advanced/server-flex/CMakeLists.txt b/example/advanced/server-flex/CMakeLists.txt index fca97db8..3129be74 100644 --- a/example/advanced/server-flex/CMakeLists.txt +++ b/example/advanced/server-flex/CMakeLists.txt @@ -16,7 +16,6 @@ add_executable (advanced-server-flex ${PROJECT_SOURCE_DIR}/example/common/detect_ssl.hpp ${PROJECT_SOURCE_DIR}/example/common/server_certificate.hpp ${PROJECT_SOURCE_DIR}/example/common/ssl_stream.hpp - ${PROJECT_SOURCE_DIR}/example/common/write_msg.hpp Jamfile advanced_server_flex.cpp ) diff --git a/example/advanced/server-flex/advanced_server_flex.cpp b/example/advanced/server-flex/advanced_server_flex.cpp index fee47c78..bf180dff 100644 --- a/example/advanced/server-flex/advanced_server_flex.cpp +++ b/example/advanced/server-flex/advanced_server_flex.cpp @@ -196,7 +196,7 @@ handle_request( return send(std::move(res)); } - // Respond to HEAD request + // Respond to GET request http::response res{ std::piecewise_construct, std::make_tuple(std::move(body)), @@ -564,7 +564,6 @@ class http_session virtual void operator()() = 0; }; - bool busy_ = false; // true if a write is in progress http_session& self_; std::vector> items_; @@ -581,7 +580,7 @@ class http_session bool is_full() const { - return items_.size() + (busy_ ? 1 : 0) >= limit; + return items_.size() >= limit; } // Called when a message finishes sending @@ -589,18 +588,12 @@ class http_session bool on_write() { - BOOST_ASSERT(busy_); - auto const do_read = items_.size() + (busy_ ? 1 : 0) >= limit; + BOOST_ASSERT(! items_.empty()); + auto const was_full = is_full(); + items_.erase(items_.begin()); if(! items_.empty()) - { - (*items_.back())(); - items_.erase(items_.begin()); - } - else - { - busy_ = false; - } - return do_read; + (*items_.front())(); + return was_full; } // Called by the HTTP handler to send a response. @@ -608,24 +601,6 @@ class http_session void operator()(http::message&& msg) { - // See if a write is in progress - if(! busy_) - { - // No write in progress so start one - busy_ = true; - - // This function takes ownership of the message by moving - // it into a temporary buffer, otherwise we would have - // to manage the lifetime of the message and serializer. - return async_write_msg( - self_.derived().stream(), - std::move(msg), - self_.strand_.wrap(std::bind( - &http_session::on_write, - self_.derived().shared_from_this(), - std::placeholders::_1))); - } - // This holds a work item struct work_impl : work { @@ -643,9 +618,9 @@ class http_session void operator()() { - async_write_msg( + http::async_write( self_.derived().stream(), - std::move(msg_), + msg_, self_.strand_.wrap(std::bind( &http_session::on_write, self_.derived().shared_from_this(), @@ -653,9 +628,12 @@ class http_session } }; - // A write is in progress, so allocate storage to - // save this work item so we can invoke it later. + // Allocate and store the work items_.emplace_back(new work_impl(self_, std::move(msg))); + + // If there was no previous work, start this one + if(items_.size() == 1) + (*items_.front())(); } }; diff --git a/example/advanced/server/CMakeLists.txt b/example/advanced/server/CMakeLists.txt index 315d6d5e..93aa415b 100644 --- a/example/advanced/server/CMakeLists.txt +++ b/example/advanced/server/CMakeLists.txt @@ -8,12 +8,10 @@ # GroupSources(include/boost/beast beast) -GroupSources(example/common common) GroupSources(example/advanced/server "/") add_executable (advanced-server ${BOOST_BEAST_INCLUDES} - ${PROJECT_SOURCE_DIR}/example/common/write_msg.hpp Jamfile advanced_server.cpp ) diff --git a/example/advanced/server/advanced_server.cpp b/example/advanced/server/advanced_server.cpp index fd199d85..a5846a5a 100644 --- a/example/advanced/server/advanced_server.cpp +++ b/example/advanced/server/advanced_server.cpp @@ -13,8 +13,6 @@ // //------------------------------------------------------------------------------ -#include "example/common/write_msg.hpp" - #include #include #include @@ -191,7 +189,7 @@ handle_request( return send(std::move(res)); } - // Respond to HEAD request + // Respond to GET request http::response res{ std::piecewise_construct, std::make_tuple(std::move(body)), @@ -367,7 +365,6 @@ class http_session : public std::enable_shared_from_this virtual void operator()() = 0; }; - bool busy_ = false; // true if a write is in progress http_session& self_; std::vector> items_; @@ -384,7 +381,7 @@ class http_session : public std::enable_shared_from_this bool is_full() const { - return items_.size() + (busy_ ? 1 : 0) >= limit; + return items_.size() >= limit; } // Called when a message finishes sending @@ -392,18 +389,12 @@ class http_session : public std::enable_shared_from_this bool on_write() { - BOOST_ASSERT(busy_); - auto const do_read = items_.size() + (busy_ ? 1 : 0) >= limit; + BOOST_ASSERT(! items_.empty()); + auto const was_full = is_full(); + items_.erase(items_.begin()); if(! items_.empty()) - { - (*items_.back())(); - items_.erase(items_.begin()); - } - else - { - busy_ = false; - } - return do_read; + (*items_.front())(); + return was_full; } // Called by the HTTP handler to send a response. @@ -411,24 +402,6 @@ class http_session : public std::enable_shared_from_this void operator()(http::message&& msg) { - // See if a write is in progress - if(! busy_) - { - // No write in progress so start one - busy_ = true; - - // This function takes ownership of the message by moving - // it into a temporary buffer, otherwise we would have - // to manage the lifetime of the message and serializer. - return async_write_msg( - self_.socket_, - std::move(msg), - self_.strand_.wrap(std::bind( - &http_session::on_write, - self_.shared_from_this(), - std::placeholders::_1))); - } - // This holds a work item struct work_impl : work { @@ -446,9 +419,9 @@ class http_session : public std::enable_shared_from_this void operator()() { - async_write_msg( + http::async_write( self_.socket_, - std::move(msg_), + msg_, self_.strand_.wrap(std::bind( &http_session::on_write, self_.shared_from_this(), @@ -456,9 +429,12 @@ class http_session : public std::enable_shared_from_this } }; - // A write is in progress, so allocate storage to - // save this work item so we can invoke it later. + // Allocate and store the work items_.emplace_back(new work_impl(self_, std::move(msg))); + + // If there was no previous work, start this one + if(items_.size() == 1) + (*items_.front())(); } }; diff --git a/example/http/server/async-ssl/http_server_async_ssl.cpp b/example/http/server/async-ssl/http_server_async_ssl.cpp index af6583fd..ebb7ae0e 100644 --- a/example/http/server/async-ssl/http_server_async_ssl.cpp +++ b/example/http/server/async-ssl/http_server_async_ssl.cpp @@ -191,7 +191,7 @@ handle_request( return send(std::move(res)); } - // Respond to HEAD request + // Respond to GET request http::response res{ std::piecewise_construct, std::make_tuple(std::move(body)), diff --git a/example/http/server/async/http_server_async.cpp b/example/http/server/async/http_server_async.cpp index 9282573a..b0f8a83e 100644 --- a/example/http/server/async/http_server_async.cpp +++ b/example/http/server/async/http_server_async.cpp @@ -188,7 +188,7 @@ handle_request( return send(std::move(res)); } - // Respond to HEAD request + // Respond to GET request http::response res{ std::piecewise_construct, std::make_tuple(std::move(body)), diff --git a/example/http/server/coro-ssl/http_server_coro_ssl.cpp b/example/http/server/coro-ssl/http_server_coro_ssl.cpp index cbecea5b..e92b9770 100644 --- a/example/http/server/coro-ssl/http_server_coro_ssl.cpp +++ b/example/http/server/coro-ssl/http_server_coro_ssl.cpp @@ -189,7 +189,7 @@ handle_request( return send(std::move(res)); } - // Respond to HEAD request + // Respond to GET request http::response res{ std::piecewise_construct, std::make_tuple(std::move(body)), diff --git a/example/http/server/coro/http_server_coro.cpp b/example/http/server/coro/http_server_coro.cpp index 421f1f24..0a6777f9 100644 --- a/example/http/server/coro/http_server_coro.cpp +++ b/example/http/server/coro/http_server_coro.cpp @@ -185,7 +185,7 @@ handle_request( return send(std::move(res)); } - // Respond to HEAD request + // Respond to GET request http::response res{ std::piecewise_construct, std::make_tuple(std::move(body)), diff --git a/example/http/server/flex/http_server_flex.cpp b/example/http/server/flex/http_server_flex.cpp index 19cdc6ea..8e60d7cc 100644 --- a/example/http/server/flex/http_server_flex.cpp +++ b/example/http/server/flex/http_server_flex.cpp @@ -191,7 +191,7 @@ handle_request( return send(std::move(res)); } - // Respond to HEAD request + // Respond to GET request http::response res{ std::piecewise_construct, std::make_tuple(std::move(body)), diff --git a/example/http/server/stackless-ssl/http_server_stackless_ssl.cpp b/example/http/server/stackless-ssl/http_server_stackless_ssl.cpp index d27a3c0f..3cb7430f 100644 --- a/example/http/server/stackless-ssl/http_server_stackless_ssl.cpp +++ b/example/http/server/stackless-ssl/http_server_stackless_ssl.cpp @@ -192,7 +192,7 @@ handle_request( return send(std::move(res)); } - // Respond to HEAD request + // Respond to GET request http::response res{ std::piecewise_construct, std::make_tuple(std::move(body)), diff --git a/example/http/server/stackless/http_server_stackless.cpp b/example/http/server/stackless/http_server_stackless.cpp index 796f96c1..ecb36788 100644 --- a/example/http/server/stackless/http_server_stackless.cpp +++ b/example/http/server/stackless/http_server_stackless.cpp @@ -189,7 +189,7 @@ handle_request( return send(std::move(res)); } - // Respond to HEAD request + // Respond to GET request http::response res{ std::piecewise_construct, std::make_tuple(std::move(body)), diff --git a/example/http/server/sync-ssl/http_server_sync_ssl.cpp b/example/http/server/sync-ssl/http_server_sync_ssl.cpp index 15572b84..d6c7c34e 100644 --- a/example/http/server/sync-ssl/http_server_sync_ssl.cpp +++ b/example/http/server/sync-ssl/http_server_sync_ssl.cpp @@ -186,7 +186,7 @@ handle_request( return send(std::move(res)); } - // Respond to HEAD request + // Respond to GET request http::response res{ std::piecewise_construct, std::make_tuple(std::move(body)), diff --git a/example/http/server/sync/http_server_sync.cpp b/example/http/server/sync/http_server_sync.cpp index bee474d7..0a813448 100644 --- a/example/http/server/sync/http_server_sync.cpp +++ b/example/http/server/sync/http_server_sync.cpp @@ -184,7 +184,7 @@ handle_request( return send(std::move(res)); } - // Respond to HEAD request + // Respond to GET request http::response res{ std::piecewise_construct, std::make_tuple(std::move(body)),