100 lines
2.6 KiB
C++
100 lines
2.6 KiB
C++
//
|
|
// Copyright (c) 2022 Seth Heeren (sgheeren at gmail dot com)
|
|
//
|
|
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
//
|
|
// Official repository: https://github.com/boostorg/beast
|
|
//
|
|
#ifndef BOOST_BEAST_HTTP_MESSAGE_GENERATOR_HPP
|
|
#define BOOST_BEAST_HTTP_MESSAGE_GENERATOR_HPP
|
|
|
|
#include <boost/beast/core/span.hpp>
|
|
#include <boost/beast/http/message.hpp>
|
|
#include <boost/beast/http/serializer.hpp>
|
|
#include <memory>
|
|
|
|
namespace boost {
|
|
namespace beast {
|
|
namespace http {
|
|
|
|
/** Type-erased buffers generator for @ref http::message
|
|
|
|
Implements the BuffersGenerator concept for any concrete instance of the
|
|
@ref http::message template.
|
|
|
|
@ref http::message_generator takes ownership of a message on construction,
|
|
erasing the concrete type from the interface.
|
|
|
|
This makes it practical for use in server applications to implement request
|
|
handling:
|
|
|
|
@code
|
|
template <class Body, class Fields>
|
|
http::message_generator handle_request(
|
|
string_view doc_root,
|
|
http::request<Body, Fields>&& request);
|
|
@endcode
|
|
|
|
The @ref beast::write and @ref beast::async_write operations are provided
|
|
for BuffersGenerator. The @ref http::message::keep_alive property is made
|
|
available for use after writing the message.
|
|
*/
|
|
class message_generator
|
|
{
|
|
public:
|
|
using const_buffers_type = span<net::const_buffer>;
|
|
|
|
template <bool isRequest, class Body, class Fields>
|
|
message_generator(http::message<isRequest, Body, Fields>&&);
|
|
|
|
/// `BuffersGenerator`
|
|
bool is_done() const {
|
|
return impl_->is_done();
|
|
}
|
|
|
|
/// `BuffersGenerator`
|
|
const_buffers_type
|
|
prepare(error_code& ec)
|
|
{
|
|
return impl_->prepare(ec);
|
|
}
|
|
|
|
/// `BuffersGenerator`
|
|
void
|
|
consume(std::size_t n)
|
|
{
|
|
impl_->consume(n);
|
|
}
|
|
|
|
/// Returns the result of `m.keep_alive()` on the underlying message
|
|
bool
|
|
keep_alive() const noexcept
|
|
{
|
|
return impl_->keep_alive();
|
|
}
|
|
|
|
private:
|
|
struct impl_base
|
|
{
|
|
virtual ~impl_base() = default;
|
|
virtual bool is_done() = 0;
|
|
virtual const_buffers_type prepare(error_code& ec) = 0;
|
|
virtual void consume(std::size_t n) = 0;
|
|
virtual bool keep_alive() const noexcept = 0;
|
|
};
|
|
|
|
std::unique_ptr<impl_base> impl_;
|
|
|
|
template <bool isRequest, class Body, class Fields>
|
|
struct generator_impl;
|
|
};
|
|
|
|
} // namespace http
|
|
} // namespace beast
|
|
} // namespace boost
|
|
|
|
#include <boost/beast/http/impl/message_generator.hpp>
|
|
|
|
#endif
|