123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370 |
- #ifndef BOOST_BEAST_HTTP_SERIALIZER_HPP
- #define BOOST_BEAST_HTTP_SERIALIZER_HPP
- #include <boost/beast/core/detail/config.hpp>
- #include <boost/beast/core/buffers_cat.hpp>
- #include <boost/beast/core/buffers_prefix.hpp>
- #include <boost/beast/core/buffers_suffix.hpp>
- #include <boost/beast/core/string.hpp>
- #include <boost/beast/core/detail/variant.hpp>
- #include <boost/beast/http/message.hpp>
- #include <boost/beast/http/chunk_encode.hpp>
- #include <boost/asio/buffer.hpp>
- #include <boost/optional.hpp>
- namespace boost {
- namespace beast {
- namespace http {
- template<
- bool isRequest,
- class Body,
- class Fields = fields>
- class serializer
- {
- public:
- static_assert(is_body<Body>::value,
- "Body type requirements not met");
- static_assert(is_body_writer<Body>::value,
- "BodyWriter type requirements not met");
-
- #if BOOST_BEAST_DOXYGEN
- using value_type = __implementation_defined__;
- #else
- using value_type = typename std::conditional<
- std::is_constructible<typename Body::writer,
- header<isRequest, Fields>&,
- typename Body::value_type&>::value &&
- ! std::is_constructible<typename Body::writer,
- header<isRequest, Fields> const&,
- typename Body::value_type const&>::value,
- message<isRequest, Body, Fields>,
- message<isRequest, Body, Fields> const>::type;
- #endif
- private:
- enum
- {
- do_construct = 0,
- do_init = 10,
- do_header_only = 20,
- do_header = 30,
- do_body = 40,
-
- do_init_c = 50,
- do_header_only_c = 60,
- do_header_c = 70,
- do_body_c = 80,
- do_final_c = 90,
- #ifndef BOOST_BEAST_NO_BIG_VARIANTS
- do_body_final_c = 100,
- do_all_c = 110,
- #endif
- do_complete = 120
- };
- void fwrinit(std::true_type);
- void fwrinit(std::false_type);
- template<std::size_t, class Visit>
- void
- do_visit(error_code& ec, Visit& visit);
- using writer = typename Body::writer;
- using cb1_t = buffers_suffix<typename
- Fields::writer::const_buffers_type>;
- using pcb1_t = buffers_prefix_view<cb1_t const&>;
- using cb2_t = buffers_suffix<buffers_cat_view<
- typename Fields::writer::const_buffers_type,
- typename writer::const_buffers_type>>;
- using pcb2_t = buffers_prefix_view<cb2_t const&>;
- using cb3_t = buffers_suffix<
- typename writer::const_buffers_type>;
- using pcb3_t = buffers_prefix_view<cb3_t const&>;
- using cb4_t = buffers_suffix<buffers_cat_view<
- typename Fields::writer::const_buffers_type,
- detail::chunk_size,
- net::const_buffer,
- chunk_crlf,
- typename writer::const_buffers_type,
- chunk_crlf>>;
- using pcb4_t = buffers_prefix_view<cb4_t const&>;
- using cb5_t = buffers_suffix<buffers_cat_view<
- detail::chunk_size,
- net::const_buffer,
- chunk_crlf,
- typename writer::const_buffers_type,
- chunk_crlf>>;
- using pcb5_t = buffers_prefix_view<cb5_t const&>;
- using cb6_t = buffers_suffix<buffers_cat_view<
- detail::chunk_size,
- net::const_buffer,
- chunk_crlf,
- typename writer::const_buffers_type,
- chunk_crlf,
- net::const_buffer,
- net::const_buffer,
- chunk_crlf>>;
- using pcb6_t = buffers_prefix_view<cb6_t const&>;
- using cb7_t = buffers_suffix<buffers_cat_view<
- typename Fields::writer::const_buffers_type,
- detail::chunk_size,
- net::const_buffer,
- chunk_crlf,
- typename writer::const_buffers_type,
- chunk_crlf,
- net::const_buffer,
- net::const_buffer,
- chunk_crlf>>;
- using pcb7_t = buffers_prefix_view<cb7_t const&>;
- using cb8_t = buffers_suffix<buffers_cat_view<
- net::const_buffer,
- net::const_buffer,
- chunk_crlf>>;
- using pcb8_t = buffers_prefix_view<cb8_t const&>;
- value_type& m_;
- writer wr_;
- boost::optional<typename Fields::writer> fwr_;
- beast::detail::variant<
- cb1_t, cb2_t, cb3_t, cb4_t,
- cb5_t ,cb6_t, cb7_t, cb8_t> v_;
- beast::detail::variant<
- pcb1_t, pcb2_t, pcb3_t, pcb4_t,
- pcb5_t ,pcb6_t, pcb7_t, pcb8_t> pv_;
- std::size_t limit_ =
- (std::numeric_limits<std::size_t>::max)();
- int s_ = do_construct;
- bool split_ = false;
- bool header_done_ = false;
- bool more_ = false;
- public:
-
- serializer(serializer&&) = default;
-
- serializer(serializer const&) = default;
-
- serializer& operator=(serializer const&) = delete;
-
- explicit
- serializer(value_type& msg);
-
- value_type&
- get()
- {
- return m_;
- }
-
- std::size_t
- limit()
- {
- return limit_;
- }
-
- void
- limit(std::size_t limit)
- {
- limit_ = limit > 0 ? limit :
- (std::numeric_limits<std::size_t>::max)();
- }
-
- bool
- split()
- {
- return split_;
- }
-
- void
- split(bool v)
- {
- split_ = v;
- }
-
- bool
- is_header_done()
- {
- return header_done_;
- }
-
- bool
- is_done()
- {
- return s_ == do_complete;
- }
-
- template<class Visit>
- void
- next(error_code& ec, Visit&& visit);
-
- void
- consume(std::size_t n);
-
- writer&
- writer_impl()
- {
- return wr_;
- }
- };
- template<class Body, class Fields = fields>
- using request_serializer = serializer<true, Body, Fields>;
- template<class Body, class Fields = fields>
- using response_serializer = serializer<false, Body, Fields>;
- }
- }
- }
- #include <boost/beast/http/impl/serializer.hpp>
- #endif
|