Don't use async_write_msg in examples

fix #746
This commit is contained in:
Vinnie Falco
2017-08-18 07:53:41 -07:00
parent 830e651f99
commit 59d4b85e15
13 changed files with 88 additions and 49 deletions

View File

@ -1,6 +1,7 @@
Version 108:
* Fix argument parsing in HTTP examples
* Don't use async_write_msg in examples
--------------------------------------------------------------------------------

View File

@ -235,14 +235,6 @@ listed here along with a description of their use:
which supports construction from a moved-froms ocket and is also
itself move constructible.
]
][
[[repo_file example/common/write_msg.hpp]]
[
The function `async_write_msg` takes ownership of an HTTP message
using the move constructor, and sends it asynchronously. It is
used as a convenience for managing the lifetime of temporary
objects, as well as for implementing HTTP pipelining.
]
]]
[endsect]

View File

@ -16,7 +16,6 @@
#include "example/common/detect_ssl.hpp"
#include "example/common/server_certificate.hpp"
#include "example/common/ssl_stream.hpp"
#include "example/common/write_msg.hpp"
#include <boost/beast/core.hpp>
#include <boost/beast/http.hpp>

View File

@ -14,7 +14,6 @@ GroupSources(example/http/server/async-ssl "/")
add_executable (http-server-async-ssl
${BOOST_BEAST_INCLUDES}
${PROJECT_SOURCE_DIR}/example/common/server_certificate.hpp
${PROJECT_SOURCE_DIR}/example/common/write_msg.hpp
Jamfile
http_server_async_ssl.cpp
)

View File

@ -14,7 +14,6 @@
//------------------------------------------------------------------------------
#include "example/common/server_certificate.hpp"
#include "example/common/write_msg.hpp"
#include <boost/beast/core.hpp>
#include <boost/beast/http.hpp>
@ -231,12 +230,20 @@ class session : public std::enable_shared_from_this<session>
void
operator()(http::message<isRequest, Body, Fields>&& msg) const
{
// 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.
async_write_msg(
// The lifetime of the message has to extend
// for the duration of the async operation so
// we use a shared_ptr to manage it.
auto sp = std::make_shared<
http::message<isRequest, Body, Fields>>(std::move(msg));
// Store a type-erased version of the shared
// pointer in the class to keep it alive.
self_.res_ = sp;
// Write the response
http::async_write(
self_.stream_,
std::move(msg),
*sp,
self_.strand_.wrap(std::bind(
&session::on_write,
self_.shared_from_this(),
@ -250,6 +257,7 @@ class session : public std::enable_shared_from_this<session>
boost::beast::flat_buffer buffer_;
std::string const& doc_root_;
http::request<http::string_body> req_;
std::shared_ptr<void> res_;
send_lambda lambda_;
public:
@ -327,6 +335,9 @@ public:
if(ec)
return fail(ec, "write");
// We're done with the response so delete it
res_ = nullptr;
// Read another request
do_read();
}

View File

@ -8,12 +8,10 @@
#
GroupSources(include/boost/beast beast)
GroupSources(example/common common)
GroupSources(example/http/server/async "/")
add_executable (http-server-async
${BOOST_BEAST_INCLUDES}
${PROJECT_SOURCE_DIR}/example/common/write_msg.hpp
Jamfile
http_server_async.cpp
)

View File

@ -13,8 +13,6 @@
//
//------------------------------------------------------------------------------
#include "example/common/write_msg.hpp"
#include <boost/beast/core.hpp>
#include <boost/beast/http.hpp>
#include <boost/beast/version.hpp>
@ -228,12 +226,20 @@ class session : public std::enable_shared_from_this<session>
void
operator()(http::message<isRequest, Body, Fields>&& msg) const
{
// 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.
async_write_msg(
// The lifetime of the message has to extend
// for the duration of the async operation so
// we use a shared_ptr to manage it.
auto sp = std::make_shared<
http::message<isRequest, Body, Fields>>(std::move(msg));
// Store a type-erased version of the shared
// pointer in the class to keep it alive.
self_.res_ = sp;
// Write the response
http::async_write(
self_.socket_,
std::move(msg),
*sp,
self_.strand_.wrap(std::bind(
&session::on_write,
self_.shared_from_this(),
@ -246,6 +252,7 @@ class session : public std::enable_shared_from_this<session>
boost::beast::flat_buffer buffer_;
std::string const& doc_root_;
http::request<http::string_body> req_;
std::shared_ptr<void> res_;
send_lambda lambda_;
public:
@ -306,6 +313,9 @@ public:
if(ec)
return fail(ec, "write");
// We're done with the response so delete it
res_ = nullptr;
// Read another request
do_read();
}

View File

@ -15,7 +15,6 @@ add_executable (http-server-flex
${BOOST_BEAST_INCLUDES}
${PROJECT_SOURCE_DIR}/example/common/detect_ssl.hpp
${PROJECT_SOURCE_DIR}/example/common/server_certificate.hpp
${PROJECT_SOURCE_DIR}/example/common/write_msg.hpp
Jamfile
http_server_flex.cpp
)

View File

@ -15,7 +15,6 @@
#include "example/common/detect_ssl.hpp"
#include "example/common/server_certificate.hpp"
#include "example/common/write_msg.hpp"
#include <boost/beast/core.hpp>
#include <boost/beast/http.hpp>
@ -242,12 +241,20 @@ class session
void
operator()(http::message<isRequest, Body, Fields>&& msg) const
{
// 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.
async_write_msg(
// The lifetime of the message has to extend
// for the duration of the async operation so
// we use a shared_ptr to manage it.
auto sp = std::make_shared<
http::message<isRequest, Body, Fields>>(std::move(msg));
// Store a type-erased version of the shared
// pointer in the class to keep it alive.
self_.res_ = sp;
// Write the response
http::async_write(
self_.derived().stream(),
std::move(msg),
*sp,
self_.strand_.wrap(std::bind(
&session::on_write,
self_.derived().shared_from_this(),
@ -257,6 +264,7 @@ class session
std::string const& doc_root_;
http::request<http::string_body> req_;
std::shared_ptr<void> res_;
send_lambda lambda_;
protected:
@ -318,6 +326,9 @@ public:
if(ec)
return fail(ec, "write");
// We're done with the response so delete it
res_ = nullptr;
// Read another request
do_read();
}

View File

@ -14,7 +14,6 @@ GroupSources(example/http/server/stackless-ssl "/")
add_executable (http-server-stackless-ssl
${BOOST_BEAST_INCLUDES}
${PROJECT_SOURCE_DIR}/example/common/server_certificate.hpp
${PROJECT_SOURCE_DIR}/example/common/write_msg.hpp
Jamfile
http_server_stackless_ssl.cpp
)

View File

@ -14,7 +14,6 @@
//------------------------------------------------------------------------------
#include "example/common/server_certificate.hpp"
#include "example/common/write_msg.hpp"
#include <boost/beast/core.hpp>
#include <boost/beast/http.hpp>
@ -234,12 +233,20 @@ class session
void
operator()(http::message<isRequest, Body, Fields>&& msg) const
{
// 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.
async_write_msg(
self_.stream_,
std::move(msg),
// The lifetime of the message has to extend
// for the duration of the async operation so
// we use a shared_ptr to manage it.
auto sp = std::make_shared<
http::message<isRequest, Body, Fields>>(std::move(msg));
// Store a type-erased version of the shared
// pointer in the class to keep it alive.
self_.res_ = sp;
// Write the response
http::async_write(
self_.socket_,
*sp,
self_.strand_.wrap(std::bind(
&session::loop,
self_.shared_from_this(),
@ -253,6 +260,7 @@ class session
boost::beast::flat_buffer buffer_;
std::string const& doc_root_;
http::request<http::string_body> req_;
std::shared_ptr<void> res_;
send_lambda lambda_;
public:
@ -319,6 +327,9 @@ public:
}
if(ec)
return fail(ec, "write");
// We're done with the response so delete it
res_ = nullptr;
}
// Perform the SSL shutdown

View File

@ -8,12 +8,10 @@
#
GroupSources(include/boost/beast beast)
GroupSources(example/common common)
GroupSources(example/http/server/stackless "/")
add_executable (http-server-stackless
${BOOST_BEAST_INCLUDES}
${PROJECT_SOURCE_DIR}/example/common/write_msg.hpp
Jamfile
http_server_stackless.cpp
)

View File

@ -13,8 +13,6 @@
//
//------------------------------------------------------------------------------
#include "example/common/write_msg.hpp"
#include <boost/beast/core.hpp>
#include <boost/beast/http.hpp>
#include <boost/beast/version.hpp>
@ -220,6 +218,7 @@ class session
struct send_lambda
{
session& self_;
std::shared_ptr<void> res_;
explicit
send_lambda(session& self)
@ -231,12 +230,20 @@ class session
void
operator()(http::message<isRequest, Body, Fields>&& msg) const
{
// 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.
async_write_msg(
// The lifetime of the message has to extend
// for the duration of the async operation so
// we use a shared_ptr to manage it.
auto sp = std::make_shared<
http::message<isRequest, Body, Fields>>(std::move(msg));
// Store a type-erased version of the shared
// pointer in the class to keep it alive.
self_.res_ = sp;
// Write the response
http::async_write(
self_.socket_,
std::move(msg),
*sp,
self_.strand_.wrap(std::bind(
&session::loop,
self_.shared_from_this(),
@ -249,6 +256,7 @@ class session
boost::beast::flat_buffer buffer_;
std::string const& doc_root_;
http::request<http::string_body> req_;
std::shared_ptr<void> res_;
send_lambda lambda_;
public:
@ -303,6 +311,9 @@ public:
}
if(ec)
return fail(ec, "write");
// We're done with the response so delete it
res_ = nullptr;
}
// Send a TCP shutdown