1  
//
1  
//
2  
// Copyright (c) 2026 Vinnie Falco (vinnie.falco@gmail.com)
2  
// Copyright (c) 2026 Vinnie Falco (vinnie.falco@gmail.com)
3  
//
3  
//
4  
// Distributed under the Boost Software License, Version 1.0. (See accompanying
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)
5  
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6  
//
6  
//
7  
// Official repository: https://github.com/cppalliance/http
7  
// Official repository: https://github.com/cppalliance/http
8  
//
8  
//
9  

9  

10  
#include <boost/http/config.hpp>
10  
#include <boost/http/config.hpp>
11  
#include <boost/http/detail/except.hpp>
11  
#include <boost/http/detail/except.hpp>
12  
#include <boost/http/detail/header.hpp>
12  
#include <boost/http/detail/header.hpp>
13  

13  

14  
#include <cstdint>
14  
#include <cstdint>
15  
#include <memory>
15  
#include <memory>
16  

16  

17  
namespace boost {
17  
namespace boost {
18  
namespace http {
18  
namespace http {
19  

19  

20  
std::size_t
20  
std::size_t
21  
parser_config_impl::
21  
parser_config_impl::
22  
max_overread() const noexcept
22  
max_overread() const noexcept
23  
{
23  
{
24  
    return headers.max_size + min_buffer;
24  
    return headers.max_size + min_buffer;
25  
}
25  
}
26  

26  

27  
std::shared_ptr<parser_config_impl const>
27  
std::shared_ptr<parser_config_impl const>
28  
make_parser_config(parser_config cfg)
28  
make_parser_config(parser_config cfg)
29  
{
29  
{
30  
    if(cfg.max_prepare < 1)
30  
    if(cfg.max_prepare < 1)
31  
        detail::throw_invalid_argument();
31  
        detail::throw_invalid_argument();
32  

32  

33  
    auto impl = std::make_shared<parser_config_impl>(std::move(cfg));
33  
    auto impl = std::make_shared<parser_config_impl>(std::move(cfg));
34  

34  

35  
    /*
35  
    /*
36  
        | fb |     cb0     |     cb1     | T | f |
36  
        | fb |     cb0     |     cb1     | T | f |
37  

37  

38  
        fb  flat_dynamic_buffer         headers.max_size
38  
        fb  flat_dynamic_buffer         headers.max_size
39  
        cb0 circular_buffer     min_buffer
39  
        cb0 circular_buffer     min_buffer
40  
        cb1 circular_buffer     min_buffer
40  
        cb1 circular_buffer     min_buffer
41  
        f   table               max_table_space
41  
        f   table               max_table_space
42  
    */
42  
    */
43  

43  

44  
    std::size_t space_needed = 0;
44  
    std::size_t space_needed = 0;
45  

45  

46  
    space_needed += impl->headers.valid_space_needed();
46  
    space_needed += impl->headers.valid_space_needed();
47  

47  

48  
    // cb0_, cb1_
48  
    // cb0_, cb1_
49  
    space_needed += impl->min_buffer + impl->min_buffer;
49  
    space_needed += impl->min_buffer + impl->min_buffer;
50  

50  

51  
    // round up to alignof(detail::header::entry)
51  
    // round up to alignof(detail::header::entry)
52  
    auto const al = alignof(detail::header::entry);
52  
    auto const al = alignof(detail::header::entry);
53  
    space_needed = al * ((space_needed + al - 1) / al);
53  
    space_needed = al * ((space_needed + al - 1) / al);
54  

54  

55  
    impl->space_needed = space_needed;
55  
    impl->space_needed = space_needed;
56  
    impl->max_codec = 0;  // not currently used for parser
56  
    impl->max_codec = 0;  // not currently used for parser
57  

57  

58  
    return impl;
58  
    return impl;
59  
}
59  
}
60  

60  

61  
std::shared_ptr<serializer_config_impl const>
61  
std::shared_ptr<serializer_config_impl const>
62  
make_serializer_config(serializer_config cfg)
62  
make_serializer_config(serializer_config cfg)
63  
{
63  
{
64  
    auto impl = std::make_shared<serializer_config_impl>();
64  
    auto impl = std::make_shared<serializer_config_impl>();
65  
    static_cast<serializer_config&>(*impl) = std::move(cfg);
65  
    static_cast<serializer_config&>(*impl) = std::move(cfg);
66  

66  

67  
    std::size_t space_needed = 0;
67  
    std::size_t space_needed = 0;
68  
    space_needed += impl->payload_buffer;
68  
    space_needed += impl->payload_buffer;
69  

69  

70  
    impl->space_needed = space_needed;
70  
    impl->space_needed = space_needed;
71  

71  

72  
    return impl;
72  
    return impl;
73  
}
73  
}
74  

74  

75  
} // http
75  
} // http
76  
} // boost
76  
} // boost