27template< std::
size_t N >
48 std::size_t result = 13;
49 result += h.reason_phrase().size() + 2;
55 h.for_each_field( [&result](
const auto & f)
noexcept {
56 result += f.name().size() + 2 + f.value().size() + 2;
72 std::size_t buffer_size = 0 )
76 if( 0 != buffer_size )
77 result.reserve( buffer_size );
81 constexpr const char header_part1[] =
"HTTP/";
84 result +=
static_cast<char>(
'0' + h.
http_major() );
86 result +=
static_cast<char>(
'0' + h.
http_minor() );
94 result +=
'0' + ( sc / 100 ) % 10;
95 result +=
'0' + ( sc / 10 ) % 10;
96 result +=
'0' + ( sc ) % 10;
101 constexpr const char header_rn[] =
"\r\n";
108 constexpr const char header_part2_1[] =
"Connection: keep-alive\r\n";
109 result.append( header_part2_1,
ct_string_len( header_part2_1 ) );
115 constexpr const char header_part2_2[] =
"Connection: close\r\n";
116 result.append( header_part2_2,
ct_string_len( header_part2_2 ) );
122 constexpr const char header_part2_3[] =
"Connection: Upgrade\r\n";
123 result.append( header_part2_3,
ct_string_len( header_part2_3 ) );
129 content_length_field_presence )
131 std::array< char, 64 > buf;
136 "Content-Length: %llu\r\n",
139 result.append( buf.data(),
static_cast<std::string::size_type
>(n) );
142 constexpr const char header_field_sep[] =
": ";
143 h.
for_each_field( [&result, header_field_sep, header_rn](
const auto & f) {
145 result.append( header_field_sep,
ct_string_len( header_field_sep ) );
158 constexpr const char raw_501_response[] =
159 "HTTP/1.1 501 Not Implemented\r\n"
160 "Connection: close\r\n"
161 "Content-Length: 0\r\n"
165 result.emplace_back( raw_501_response );
172 constexpr const char raw_504_response[] =
173 "HTTP/1.1 504 Gateway Time-out\r\n"
174 "Connection: close\r\n"
175 "Content-Length: 0\r\n"
179 result.emplace_back( raw_504_response );
constexpr auto raw_code() const noexcept
constexpr std::size_t N
A special marker that means infinite repetitions.
std::size_t calculate_approx_buffer_size_for_header(const http_response_header_t &h) noexcept
Calculate buffer size that is enough for serializing the buffer.
std::string create_header_string(const http_response_header_t &h, content_length_field_presence_t content_length_field_presence=content_length_field_presence_t::add_content_length, std::size_t buffer_size=0)
Creates a string for http response header.
auto create_timeout_resp()
auto create_not_implemented_resp()
content_length_field_presence_t
constexpr std::size_t ct_string_len(const char(&)[N]) noexcept
Compile time c-string length.
std::vector< writable_item_t > writable_items_container_t