2 // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 // Official repository: https://github.com/boostorg/beast
10 #ifndef BOOST_BEAST_HTTP_IMPL_SERIALIZER_HPP
11 #define BOOST_BEAST_HTTP_IMPL_SERIALIZER_HPP
13 #include <boost/beast/core/buffer_traits.hpp>
14 #include <boost/beast/core/detail/buffers_ref.hpp>
15 #include <boost/beast/http/error.hpp>
16 #include <boost/beast/http/status.hpp>
17 #include <boost/beast/core/detail/config.hpp>
18 #include <boost/assert.hpp>
26 bool isRequest, class Body, class Fields>
28 serializer<isRequest, Body, Fields>::
29 fwrinit(std::true_type)
31 fwr_.emplace(m_, m_.version(), m_.method());
35 bool isRequest, class Body, class Fields>
37 serializer<isRequest, Body, Fields>::
38 fwrinit(std::false_type)
40 fwr_.emplace(m_, m_.version(), m_.result_int());
44 bool isRequest, class Body, class Fields>
45 template<std::size_t I, class Visit>
48 serializer<isRequest, Body, Fields>::
49 do_visit(error_code& ec, Visit& visit)
51 pv_.template emplace<I>(limit_, v_.template get<I>());
52 visit(ec, beast::detail::make_buffers_ref(
53 pv_.template get<I>()));
56 //------------------------------------------------------------------------------
59 bool isRequest, class Body, class Fields>
60 serializer<isRequest, Body, Fields>::
61 serializer(value_type& m)
63 , wr_(m_.base(), m_.body())
68 bool isRequest, class Body, class Fields>
71 serializer<isRequest, Body, Fields>::
72 next(error_code& ec, Visit&& visit)
78 fwrinit(std::integral_constant<bool,
93 auto result = wr_.get(ec);
94 if(ec == error::need_more)
100 more_ = result->second;
101 v_.template emplace<2>(
102 boost::in_place_init,
110 do_visit<2>(ec, visit);
114 v_.template emplace<1>(fwr_->get());
118 do_visit<1>(ec, visit);
127 auto result = wr_.get(ec);
132 more_ = result->second;
133 v_.template emplace<3>(result->first);
139 do_visit<3>(ec, visit);
142 //----------------------------------------------------------------------
153 goto go_header_only_c;
154 auto result = wr_.get(ec);
155 if(ec == error::need_more)
156 goto go_header_only_c;
160 goto go_header_only_c;
161 more_ = result->second;
164 // do it all in one buffer
165 v_.template emplace<7>(
166 boost::in_place_init,
168 buffer_bytes(result->first),
169 net::const_buffer{nullptr, 0},
173 detail::chunk_last(),
174 net::const_buffer{nullptr, 0},
178 v_.template emplace<4>(
179 boost::in_place_init,
181 buffer_bytes(result->first),
182 net::const_buffer{nullptr, 0},
191 do_visit<4>(ec, visit);
195 v_.template emplace<1>(fwr_->get());
196 s_ = do_header_only_c;
199 case do_header_only_c:
200 do_visit<1>(ec, visit);
209 auto result = wr_.get(ec);
214 more_ = result->second;
217 // do it all in one buffer
218 v_.template emplace<6>(
219 boost::in_place_init,
220 buffer_bytes(result->first),
221 net::const_buffer{nullptr, 0},
225 detail::chunk_last(),
226 net::const_buffer{nullptr, 0},
228 goto go_body_final_c;
230 v_.template emplace<5>(
231 boost::in_place_init,
232 buffer_bytes(result->first),
233 net::const_buffer{nullptr, 0},
242 do_visit<5>(ec, visit);
246 s_ = do_body_final_c;
248 case do_body_final_c:
249 do_visit<6>(ec, visit);
256 do_visit<7>(ec, visit);
261 v_.template emplace<8>(
262 boost::in_place_init,
263 detail::chunk_last(),
264 net::const_buffer{nullptr, 0},
270 do_visit<8>(ec, visit);
273 //----------------------------------------------------------------------
287 bool isRequest, class Body, class Fields>
289 serializer<isRequest, Body, Fields>::
290 consume(std::size_t n)
296 n <= buffer_bytes(v_.template get<2>()));
297 v_.template get<2>().consume(n);
298 if(buffer_bytes(v_.template get<2>()) > 0)
309 n <= buffer_bytes(v_.template get<1>()));
310 v_.template get<1>().consume(n);
311 if(buffer_bytes(v_.template get<1>()) > 0)
323 n <= buffer_bytes(v_.template get<3>()));
324 v_.template get<3>().consume(n);
325 if(buffer_bytes(v_.template get<3>()) > 0)
334 //----------------------------------------------------------------------
338 n <= buffer_bytes(v_.template get<4>()));
339 v_.template get<4>().consume(n);
340 if(buffer_bytes(v_.template get<4>()) > 0)
350 case do_header_only_c:
353 n <= buffer_bytes(v_.template get<1>()));
354 v_.template get<1>().consume(n);
355 if(buffer_bytes(v_.template get<1>()) > 0)
370 n <= buffer_bytes(v_.template get<5>()));
371 v_.template get<5>().consume(n);
372 if(buffer_bytes(v_.template get<5>()) > 0)
381 case do_body_final_c:
384 n <= buffer_bytes(v_.template get<6>()));
385 v_.template get<6>().consume(n);
386 if(buffer_bytes(v_.template get<6>()) > 0)
396 n <= buffer_bytes(v_.template get<7>()));
397 v_.template get<7>().consume(n);
398 if(buffer_bytes(v_.template get<7>()) > 0)
407 BOOST_ASSERT(buffer_bytes(v_.template get<8>()));
408 v_.template get<8>().consume(n);
409 if(buffer_bytes(v_.template get<8>()) > 0)
414 //----------------------------------------------------------------------