Imported Upstream version 1.72.0
[platform/upstream/boost.git] / boost / beast / http / impl / basic_parser.hpp
1 //
2 // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
3 //
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)
6 //
7 // Official repository: https://github.com/boostorg/beast
8 //
9
10 #ifndef BOOST_BEAST_HTTP_IMPL_BASIC_PARSER_HPP
11 #define BOOST_BEAST_HTTP_IMPL_BASIC_PARSER_HPP
12
13 #include <boost/beast/core/buffer_traits.hpp>
14 #include <boost/asio/buffer.hpp>
15 #include <boost/make_unique.hpp>
16
17 namespace boost {
18 namespace beast {
19 namespace http {
20
21 template<bool isRequest>
22 template<class ConstBufferSequence>
23 std::size_t
24 basic_parser<isRequest>::
25 put(ConstBufferSequence const& buffers,
26     error_code& ec)
27 {
28     static_assert(net::is_const_buffer_sequence<
29         ConstBufferSequence>::value,
30             "ConstBufferSequence type requirements not met");
31     auto const p = net::buffer_sequence_begin(buffers);
32     auto const last = net::buffer_sequence_end(buffers);
33     if(p == last)
34     {
35         ec = {};
36         return 0;
37     }
38     if(std::next(p) == last)
39     {
40         // single buffer
41         return put(net::const_buffer(*p), ec);
42     }
43     auto const size = buffer_bytes(buffers);
44     if(size <= max_stack_buffer)
45         return put_from_stack(size, buffers, ec);
46     if(size > buf_len_)
47     {
48         // reallocate
49         buf_ = boost::make_unique_noinit<char[]>(size);
50         buf_len_ = size;
51     }
52     // flatten
53     net::buffer_copy(net::buffer(
54         buf_.get(), size), buffers);
55     return put(net::const_buffer{
56         buf_.get(), size}, ec);
57 }
58
59 template<bool isRequest>
60 template<class ConstBufferSequence>
61 std::size_t
62 basic_parser<isRequest>::
63 put_from_stack(std::size_t size,
64     ConstBufferSequence const& buffers,
65         error_code& ec)
66 {
67     char buf[max_stack_buffer];
68     net::buffer_copy(net::mutable_buffer(
69         buf, sizeof(buf)), buffers);
70     return put(net::const_buffer{
71         buf, size}, ec);
72 }
73
74 } // http
75 } // beast
76 } // boost
77
78 #endif