// // 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