123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- //
- // 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_IMPL_MESSAGE_GENERATOR_HPP
- #define BOOST_BEAST_HTTP_IMPL_MESSAGE_GENERATOR_HPP
- #include <boost/beast/http/message_generator.hpp>
- #include <boost/smart_ptr/make_unique.hpp>
- #include <boost/beast/core/buffers_generator.hpp>
- namespace boost {
- namespace beast {
- namespace http {
- template <bool isRequest, class Body, class Fields>
- message_generator::message_generator(
- http::message<isRequest, Body, Fields>&& m)
- : impl_(boost::make_unique<
- generator_impl<isRequest, Body, Fields>>(
- std::move(m)))
- {
- }
- template <bool isRequest, class Body, class Fields>
- struct message_generator::generator_impl
- : message_generator::impl_base
- {
- explicit generator_impl(
- http::message<isRequest, Body, Fields>&& m)
- : m_(std::move(m))
- , sr_(m_)
- {
- }
- bool
- is_done() override
- {
- return sr_.is_done();
- }
- const_buffers_type
- prepare(error_code& ec) override
- {
- sr_.next(ec, visit{*this});
- return current_;
- }
- void
- consume(std::size_t n) override
- {
- sr_.consume((std::min)(n, beast::buffer_bytes(current_)));
- }
- bool
- keep_alive() const noexcept override
- {
- return m_.keep_alive();
- }
- private:
- static constexpr unsigned max_fixed_bufs = 12;
- http::message<isRequest, Body, Fields> m_;
- http::serializer<isRequest, Body, Fields> sr_;
- std::array<net::const_buffer, max_fixed_bufs> bs_;
- const_buffers_type current_ = bs_; // subspan
- struct visit
- {
- generator_impl& self_;
- template<class ConstBufferSequence>
- void
- operator()(error_code&, ConstBufferSequence const& buffers)
- {
- auto& s = self_.bs_;
- auto& cur = self_.current_;
- auto it = net::buffer_sequence_begin(buffers);
- std::size_t n =
- std::distance(it, net::buffer_sequence_end(buffers));
- n = (std::min)(s.size(), n);
- cur = { s.data(), n };
- std::copy_n(it, n, cur.begin());
- }
- };
- };
- } // namespace http
- } // namespace beast
- } // namespace boost
- #endif
|