27 template< 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;
71 content_length_field_presence_t::add_content_length,
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";
106 case http_connection_header_t::keep_alive:
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 ) );
128 if( content_length_field_presence_t::add_content_length ==
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 );