14 #include <restinio/buffers.hpp> 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;
76 if( 0 != buffer_size )
77 result.reserve( buffer_size );
79 result.reserve( calculate_approx_buffer_size_for_header( h ) );
81 constexpr const char header_part1[] =
"HTTP/";
82 result.append( header_part1, ct_string_len( header_part1 ) );
84 result +=
static_cast<
char>(
'0' + h.http_major() );
86 result +=
static_cast<
char>(
'0' + h.http_minor() );
89 const auto sc = h.status_code().raw_code();
94 result +=
'0' + ( sc / 100 ) % 10;
95 result +=
'0' + ( sc / 10 ) % 10;
96 result +=
'0' + ( sc ) % 10;
99 result += h.reason_phrase();
101 constexpr const char header_rn[] =
"\r\n";
102 result.append( header_rn, ct_string_len( header_rn ) );
104 switch( h.connection() )
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 ) );
113 case http_connection_header_t::close:
115 constexpr const char header_part2_2[] =
"Connection: close\r\n";
116 result.append( header_part2_2, ct_string_len( header_part2_2 ) );
120 case http_connection_header_t::upgrade:
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",
137 static_cast<
unsigned long long >( h.content_length() ) );
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 ) );
147 result.append( header_rn, ct_string_len( header_rn ) );
150 result.append( header_rn, ct_string_len( header_rn ) );
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" 164 writable_items_container_t result;
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" 178 writable_items_container_t result;
179 result.emplace_back( raw_504_response );
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.
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.
content_length_field_presence_t
auto create_timeout_resp()
auto create_not_implemented_resp()
constexpr std::size_t ct_string_len(const char(&)[N]) noexcept
Compile time c-string length.
std::enable_if< std::is_same< Parameter_Container, query_string_params_t >::value||std::is_same< Parameter_Container, router::route_params_t >::value, optional_t< Value_Type > >::type opt_value(const Parameter_Container ¶ms, string_view_t key)
Gets the value of a parameter specified by key wrapped in optional_t<Value_Type> if parameter exists ...