11 #include <restinio/impl/include_fmtlib.hpp> 13 #include <restinio/impl/string_caseless_compare.hpp> 15 #include <restinio/exception.hpp> 16 #include <restinio/string_view.hpp> 17 #include <restinio/optional.hpp> 18 #include <restinio/common_types.hpp> 20 #include <http_parser.h> 34 #define RESTINIO_HTTP_FIELDS_MAP( RESTINIO_GEN ) 35 RESTINIO_GEN( a_im, A-IM ) 36 RESTINIO_GEN( accept, Accept ) 37 RESTINIO_GEN( accept_additions, Accept-Additions ) 38 RESTINIO_GEN( accept_charset, Accept-Charset ) 39 RESTINIO_GEN( accept_datetime, Accept-Datetime ) 40 RESTINIO_GEN( accept_encoding, Accept-Encoding ) 41 RESTINIO_GEN( accept_features, Accept-Features ) 42 RESTINIO_GEN( accept_language, Accept-Language ) 43 RESTINIO_GEN( accept_patch, Accept-Patch ) 44 RESTINIO_GEN( accept_post, Accept-Post ) 45 RESTINIO_GEN( accept_ranges, Accept-Ranges ) 46 RESTINIO_GEN( age, Age ) 47 RESTINIO_GEN( allow, Allow ) 48 RESTINIO_GEN( alpn, ALPN ) 49 RESTINIO_GEN( alt_svc, Alt-Svc ) 50 RESTINIO_GEN( alt_used, Alt-Used ) 51 RESTINIO_GEN( alternates, Alternates ) 52 RESTINIO_GEN( apply_to_redirect_ref, Apply-To-Redirect-Ref ) 53 RESTINIO_GEN( authentication_control, Authentication-Control ) 54 RESTINIO_GEN( authentication_info, Authentication-Info ) 55 RESTINIO_GEN( authorization, Authorization ) 56 RESTINIO_GEN( c_ext, C-Ext ) 57 RESTINIO_GEN( c_man, C-Man ) 58 RESTINIO_GEN( c_opt, C-Opt ) 59 RESTINIO_GEN( c_pep, C-PEP ) 60 RESTINIO_GEN( c_pep_info, C-PEP-Info ) 61 RESTINIO_GEN( cache_control, Cache-Control ) 62 RESTINIO_GEN( caldav_timezones, CalDAV-Timezones ) 63 RESTINIO_GEN( close, Close ) 64 RESTINIO_GEN( content_base, Content-Base ) 65 RESTINIO_GEN( content_disposition, Content-Disposition ) 66 RESTINIO_GEN( content_encoding, Content-Encoding ) 67 RESTINIO_GEN( content_id, Content-ID ) 68 RESTINIO_GEN( content_language, Content-Language ) 69 RESTINIO_GEN( content_location, Content-Location ) 70 RESTINIO_GEN( content_md5, Content-MD5 ) 71 RESTINIO_GEN( content_range, Content-Range ) 72 RESTINIO_GEN( content_script_type, Content-Script-Type ) 73 RESTINIO_GEN( content_style_type, Content-Style-Type ) 74 RESTINIO_GEN( content_type, Content-Type ) 75 RESTINIO_GEN( content_version, Content-Version ) 76 RESTINIO_GEN( cookie, Cookie ) 77 RESTINIO_GEN( cookie2, Cookie2 ) 78 RESTINIO_GEN( dasl, DASL ) 79 RESTINIO_GEN( dav, DAV ) 80 RESTINIO_GEN( date, Date ) 81 RESTINIO_GEN( default_style, Default-Style ) 82 RESTINIO_GEN( delta_base, Delta-Base ) 83 RESTINIO_GEN( depth, Depth ) 84 RESTINIO_GEN( derived_from, Derived-From ) 85 RESTINIO_GEN( destination, Destination ) 86 RESTINIO_GEN( differential_id, Differential-ID ) 87 RESTINIO_GEN( digest, Digest ) 88 RESTINIO_GEN( etag, ETag ) 89 RESTINIO_GEN( expect, Expect ) 90 RESTINIO_GEN( expires, Expires ) 91 RESTINIO_GEN( ext, Ext ) 92 RESTINIO_GEN( forwarded, Forwarded ) 93 RESTINIO_GEN( from, From ) 94 RESTINIO_GEN( getprofile, GetProfile ) 95 RESTINIO_GEN( hobareg, Hobareg ) 96 RESTINIO_GEN( host, Host ) 97 RESTINIO_GEN( http2_settings, HTTP2-Settings ) 98 RESTINIO_GEN( im, IM ) 99 RESTINIO_GEN( if_, If ) 100 RESTINIO_GEN( if_match, If-Match ) 101 RESTINIO_GEN( if_modified_since, If-Modified-Since ) 102 RESTINIO_GEN( if_none_match, If-None-Match ) 103 RESTINIO_GEN( if_range, If-Range ) 104 RESTINIO_GEN( if_schedule_tag_match, If-Schedule-Tag-Match ) 105 RESTINIO_GEN( if_unmodified_since, If-Unmodified-Since ) 106 RESTINIO_GEN( keep_alive, Keep-Alive ) 107 RESTINIO_GEN( label, Label ) 108 RESTINIO_GEN( last_modified, Last-Modified ) 109 RESTINIO_GEN( link, Link ) 110 RESTINIO_GEN( location, Location ) 111 RESTINIO_GEN( lock_token, Lock-Token ) 112 RESTINIO_GEN( man, Man ) 113 RESTINIO_GEN( max_forwards, Max-Forwards ) 114 RESTINIO_GEN( memento_datetime, Memento-Datetime ) 115 RESTINIO_GEN( meter, Meter ) 116 RESTINIO_GEN( mime_version, MIME-Version ) 117 RESTINIO_GEN( negotiate, Negotiate ) 118 RESTINIO_GEN( opt, Opt ) 119 RESTINIO_GEN( optional_www_authenticate, Optional-WWW-Authenticate ) 120 RESTINIO_GEN( ordering_type, Ordering-Type ) 121 RESTINIO_GEN( origin, Origin ) 122 RESTINIO_GEN( overwrite, Overwrite ) 123 RESTINIO_GEN( p3p, P3P ) 124 RESTINIO_GEN( pep, PEP ) 125 RESTINIO_GEN( pics_label, PICS-Label ) 126 RESTINIO_GEN( pep_info, Pep-Info ) 127 RESTINIO_GEN( position, Position ) 128 RESTINIO_GEN( pragma, Pragma ) 129 RESTINIO_GEN( prefer, Prefer ) 130 RESTINIO_GEN( preference_applied, Preference-Applied ) 131 RESTINIO_GEN( profileobject, ProfileObject ) 132 RESTINIO_GEN( protocol, Protocol ) 133 RESTINIO_GEN( protocol_info, Protocol-Info ) 134 RESTINIO_GEN( protocol_query, Protocol-Query ) 135 RESTINIO_GEN( protocol_request, Protocol-Request ) 136 RESTINIO_GEN( proxy_authenticate, Proxy-Authenticate ) 137 RESTINIO_GEN( proxy_authentication_info, Proxy-Authentication-Info ) 138 RESTINIO_GEN( proxy_authorization, Proxy-Authorization ) 139 RESTINIO_GEN( proxy_features, Proxy-Features ) 140 RESTINIO_GEN( proxy_instruction, Proxy-Instruction ) 141 RESTINIO_GEN( public_, Public ) 142 RESTINIO_GEN( public_key_pins, Public-Key-Pins ) 143 RESTINIO_GEN( public_key_pins_report_only, Public-Key-Pins-Report-Only ) 144 RESTINIO_GEN( range, Range ) 145 RESTINIO_GEN( redirect_ref, Redirect-Ref ) 146 RESTINIO_GEN( referer, Referer ) 147 RESTINIO_GEN( retry_after, Retry-After ) 148 RESTINIO_GEN( safe, Safe ) 149 RESTINIO_GEN( schedule_reply, Schedule-Reply ) 150 RESTINIO_GEN( schedule_tag, Schedule-Tag ) 151 RESTINIO_GEN( sec_websocket_accept, Sec-WebSocket-Accept ) 152 RESTINIO_GEN( sec_websocket_extensions, Sec-WebSocket-Extensions ) 153 RESTINIO_GEN( sec_websocket_key, Sec-WebSocket-Key ) 154 RESTINIO_GEN( sec_websocket_protocol, Sec-WebSocket-Protocol ) 155 RESTINIO_GEN( sec_websocket_version, Sec-WebSocket-Version ) 156 RESTINIO_GEN( security_scheme, Security-Scheme ) 157 RESTINIO_GEN( server, Server ) 158 RESTINIO_GEN( set_cookie, Set-Cookie ) 159 RESTINIO_GEN( set_cookie2, Set-Cookie2 ) 160 RESTINIO_GEN( setprofile, SetProfile ) 161 RESTINIO_GEN( slug, SLUG ) 162 RESTINIO_GEN( soapaction, SoapAction ) 163 RESTINIO_GEN( status_uri, Status-URI ) 164 RESTINIO_GEN( strict_transport_security, Strict-Transport-Security ) 165 RESTINIO_GEN( surrogate_capability, Surrogate-Capability ) 166 RESTINIO_GEN( surrogate_control, Surrogate-Control ) 167 RESTINIO_GEN( tcn, TCN ) 168 RESTINIO_GEN( te, TE ) 169 RESTINIO_GEN( timeout, Timeout ) 170 RESTINIO_GEN( topic, Topic ) 171 RESTINIO_GEN( trailer, Trailer ) 172 RESTINIO_GEN( transfer_encoding, Transfer-Encoding ) 173 RESTINIO_GEN( ttl, TTL ) 174 RESTINIO_GEN( urgency, Urgency ) 175 RESTINIO_GEN( uri, URI ) 176 RESTINIO_GEN( upgrade, Upgrade ) 177 RESTINIO_GEN( user_agent, User-Agent ) 178 RESTINIO_GEN( variant_vary, Variant-Vary ) 179 RESTINIO_GEN( vary, Vary ) 180 RESTINIO_GEN( via, Via ) 181 RESTINIO_GEN( www_authenticate, WWW-Authenticate ) 182 RESTINIO_GEN( want_digest, Want-Digest ) 183 RESTINIO_GEN( warning, Warning ) 184 RESTINIO_GEN( x_frame_options, X-Frame-Options ) 186 RESTINIO_GEN( access_control, Access-Control ) 187 RESTINIO_GEN( access_control_allow_credentials, Access-Control-Allow-Credentials ) 188 RESTINIO_GEN( access_control_allow_headers, Access-Control-Allow-Headers ) 189 RESTINIO_GEN( access_control_allow_methods, Access-Control-Allow-Methods ) 190 RESTINIO_GEN( access_control_allow_origin, Access-Control-Allow-Origin ) 191 RESTINIO_GEN( access_control_max_age, Access-Control-Max-Age ) 192 RESTINIO_GEN( access_control_request_method, Access-Control-Request-Method ) 193 RESTINIO_GEN( access_control_request_headers, Access-Control-Request-Headers ) 194 RESTINIO_GEN( compliance, Compliance ) 195 RESTINIO_GEN( content_transfer_encoding, Content-Transfer-Encoding ) 196 RESTINIO_GEN( cost, Cost ) 197 RESTINIO_GEN( ediint_features, EDIINT-Features ) 198 RESTINIO_GEN( message_id, Message-ID ) 199 RESTINIO_GEN( method_check, Method-Check ) 200 RESTINIO_GEN( method_check_expires, Method-Check-Expires ) 201 RESTINIO_GEN( non_compliance, Non-Compliance ) 202 RESTINIO_GEN( optional, Optional ) 203 RESTINIO_GEN( referer_root, Referer-Root ) 204 RESTINIO_GEN( resolution_hint, Resolution-Hint ) 205 RESTINIO_GEN( resolver_location, Resolver-Location ) 206 RESTINIO_GEN( subok, SubOK ) 207 RESTINIO_GEN( subst, Subst ) 208 RESTINIO_GEN( title, Title ) 209 RESTINIO_GEN( ua_color, UA-Color ) 210 RESTINIO_GEN( ua_media, UA-Media ) 211 RESTINIO_GEN( ua_pixels, UA-Pixels ) 212 RESTINIO_GEN( ua_resolution, UA-Resolution ) 213 RESTINIO_GEN( ua_windowpixels, UA-Windowpixels ) 214 RESTINIO_GEN( version, Version ) 215 RESTINIO_GEN( x_device_accept, X-Device-Accept ) 216 RESTINIO_GEN( x_device_accept_charset, X-Device-Accept-Charset ) 217 RESTINIO_GEN( x_device_accept_encoding, X-Device-Accept-Encoding ) 218 RESTINIO_GEN( x_device_accept_language, X-Device-Accept-Language ) 219 RESTINIO_GEN( x_device_user_agent, X-Device-User-Agent ) 234 #define RESTINIO_HTTP_FIELD_GEN( name, ignored ) name, 236 #undef RESTINIO_HTTP_FIELD_GEN 253 const char * field_name = field.data();
254 const std::size_t field_name_size = field.size();
256 #define RESTINIO_HTTP_CHECK_FOR_FIELD( field_id, candidate_field_name ) 257 if( impl::is_equal_caseless(field_name, #candidate_field_name , field_name_size ) ) 258 return http_field_t:: field_id; 262 switch( field_name_size )
542 #undef RESTINIO_HTTP_CHECK_FOR_FIELD 555 const char * result =
"";
558 #define RESTINIO_HTTP_FIELD_STR_GEN( name, string_name ) 559 case http_field_t::name: result = #string_name; break; 562 #undef RESTINIO_HTTP_FIELD_STR_GEN 599 string_view_t value )
615 string_view_t value )
628 m_name = std::move( n );
629 m_field_id = string_to_field( m_name );
635 m_value = std::move( v );
641 m_value.append( v.data(), v.size() );
648 m_name = field_to_string( m_field_id );
667 #if !defined( RESTINIO_HEADER_FIELDS_DEFAULT_RESERVE_COUNT ) 668 #define RESTINIO_HEADER_FIELDS_DEFAULT_RESERVE_COUNT 4
749 std::swap( m_fields, http_header_fields.m_fields );
756 return m_fields.cend() != cfind( field_name );
768 return m_fields.cend() != cfind( field_id );
775 fields_container_t::iterator it;
780 it = find( http_header_field.field_id() );
786 it = find( http_header_field.name() );
789 if( m_fields.end() != it )
791 *it = std::move( http_header_field );
795 m_fields.emplace_back( std::move( http_header_field ) );
802 std::string field_name,
803 std::string field_value )
805 const auto it = find( field_name );
807 if( m_fields.end() != it )
809 it->name( std::move( field_name ) );
810 it->value( std::move( field_value ) );
814 m_fields.emplace_back(
815 std::move( field_name ),
816 std::move( field_value ) );
828 std::string field_value )
832 const auto it = find( field_id );
834 if( m_fields.end() != it )
836 it->value( std::move( field_value ) );
840 m_fields.emplace_back(
842 std::move( field_value ) );
862 std::string field_value )
866 m_fields.emplace_back(
868 std::move( field_value ) );
883 std::string field_name,
884 std::string field_value )
886 m_fields.emplace_back(
887 std::move( field_name ),
888 std::move( field_value ) );
903 m_fields.push_back( std::move(http_header_field) );
909 string_view_t field_name,
910 string_view_t field_value )
912 const auto it = find( field_name );
914 if( m_fields.end() != it )
916 it->append_value( field_value );
920 m_fields.emplace_back( field_name, field_value );
932 string_view_t field_value )
936 const auto it = find( field_id );
938 if( m_fields.end() != it )
940 it->append_value( field_value );
944 m_fields.emplace_back( field_id, field_value );
953 const auto it = cfind( field_name );
955 if( m_fields.end() == it )
957 fmt::format(
"field '{}' doesn't exist", field_name ) };
977 const auto it = cfind( field_name );
978 if( m_fields.end() == it )
981 return std::addressof(it->value());
992 "unspecified fields cannot be searched by id" ) };
995 const auto it = cfind( field_id );
997 if( m_fields.end() == it )
1001 "field '{}' doesn't exist",
1002 field_to_string( field_id ) ) };
1025 const auto it = cfind( field_id );
1026 if( m_fields.end() != it )
1027 return std::addressof(it->value());
1044 const auto it = cfind( field_name );
1046 if( m_fields.end() == it )
1047 return std::string( default_value.data(), default_value.size() );
1063 const auto it = cfind( field_name );
1065 if( m_fields.end() == it )
1066 return std::move(default_value);
1077 string_view_t field_name,
1078 const char * default_value )
const 1080 return this->get_field_or( field_name, string_view_t{ default_value } );
1089 string_view_t field_name,
1090 const std::string & default_value )
const 1092 return this->get_field_or( field_name, string_view_t{ default_value } );
1108 const auto it = cfind( field_id );
1110 if( m_fields.end() != it )
1114 return std::string( default_value.data(), default_value.size() );
1124 const char * default_value )
const 1126 return this->get_field_or( field_id, string_view_t{ default_value } );
1136 const std::string & default_value )
const 1138 return this->get_field_or( field_id, string_view_t{ default_value } );
1154 const auto it = cfind( field_id );
1156 if( m_fields.end() != it )
1160 return std::move( default_value );
1176 const auto it = find( field_name );
1178 if( m_fields.end() != it )
1180 m_fields.erase( it );
1202 const auto it = find( field_id );
1204 if( m_fields.end() != it )
1206 m_fields.erase( it );
1223 std::size_t count{};
1224 for(
auto it = m_fields.begin(); it != m_fields.end(); )
1226 if( impl::is_equal_caseless( it->name(), field_name ) )
1228 it = m_fields.erase( it );
1247 std::size_t count{};
1250 for(
auto it = m_fields.begin(); it != m_fields.end(); )
1252 if( it->field_id() == field_id )
1254 it = m_fields.erase( it );
1275 return {
this->get_field(name) };
1284 return {
this->get_field(field_id) };
1304 optional_t< string_view_t > result;
1306 if(
auto * ptr =
this->try_get_field(name) )
1307 result = string_view_t{ *ptr };
1329 optional_t< string_view_t > result;
1331 if(
auto * ptr =
this->try_get_field(field_id) )
1332 result = string_view_t{ *ptr };
1359 template<
typename Lambda >
1362 noexcept(
noexcept(
lambda(
1399 template<
typename Lambda >
1403 Lambda && lambda )
const 1404 noexcept(
noexcept(
lambda(
1412 "lambda should return restinio::http_header_fields_t::handling_result_t" );
1455 template<
typename Lambda >
1458 string_view_t field_name,
1459 Lambda && lambda )
const 1460 noexcept(
noexcept(
lambda(
1468 "lambda should return restinio::http_header_fields_t::handling_result_t" );
1484 return m_fields.cbegin();
1490 return m_fields.cend();
1495 return m_fields.size();
1511 m_fields.back().append_value( field_value );
1517 return std::find_if(
1520 [&](
const auto & f ){
1521 return impl::is_equal_caseless( f.name(), field_name );
1528 return std::find_if(
1531 [&](
const auto & f ){
1532 return impl::is_equal_caseless( f.name(), field_name );
1539 return std::find_if(
1542 [&](
const auto & f ){
1543 return f.field_id() == field_id;
1550 return std::find_if(
1553 [&](
const auto & f ){
1554 return f.field_id() == field_id;
1586 {
return m_http_major; }
1590 { m_http_major = v; }
1594 {
return m_http_minor; }
1598 { m_http_minor = v; }
1604 {
return m_content_length; }
1608 { m_content_length = l; }
1652 #define RESTINIO_HTTP_METHOD_MAP(RESTINIO_GEN) 1653 RESTINIO_GEN( http_method_delete, HTTP_DELETE, DELETE ) 1654 RESTINIO_GEN( http_method_get, HTTP_GET, GET ) 1655 RESTINIO_GEN( http_method_head, HTTP_HEAD, HEAD ) 1656 RESTINIO_GEN( http_method_post, HTTP_POST, POST ) 1657 RESTINIO_GEN( http_method_put, HTTP_PUT, PUT ) 1659 RESTINIO_GEN( http_method_connect, HTTP_CONNECT, CONNECT ) 1660 RESTINIO_GEN( http_method_options, HTTP_OPTIONS, OPTIONS ) 1661 RESTINIO_GEN( http_method_trace, HTTP_TRACE, TRACE ) 1663 RESTINIO_GEN( http_method_copy, HTTP_COPY, COPY ) 1664 RESTINIO_GEN( http_method_lock, HTTP_LOCK, LOCK ) 1665 RESTINIO_GEN( http_method_mkcol, HTTP_MKCOL, MKCOL ) 1666 RESTINIO_GEN( http_method_move, HTTP_MOVE, MOVE ) 1667 RESTINIO_GEN( http_method_propfind, HTTP_PROPFIND, PROPFIND ) 1668 RESTINIO_GEN( http_method_proppatch, HTTP_PROPPATCH, PROPPATCH ) 1669 RESTINIO_GEN( http_method_search, HTTP_SEARCH, SEARCH ) 1670 RESTINIO_GEN( http_method_unlock, HTTP_UNLOCK, UNLOCK ) 1671 RESTINIO_GEN( http_method_bind, HTTP_BIND, BIND ) 1672 RESTINIO_GEN( http_method_rebind, HTTP_REBIND, REBIND ) 1673 RESTINIO_GEN( http_method_unbind, HTTP_UNBIND, UNBIND ) 1674 RESTINIO_GEN( http_method_acl, HTTP_ACL, ACL ) 1676 RESTINIO_GEN( http_method_report, HTTP_REPORT, REPORT ) 1677 RESTINIO_GEN( http_method_mkactivity, HTTP_MKACTIVITY, MKACTIVITY ) 1678 RESTINIO_GEN( http_method_checkout, HTTP_CHECKOUT, CHECKOUT ) 1679 RESTINIO_GEN( http_method_merge, HTTP_MERGE, MERGE ) 1681 RESTINIO_GEN( http_method_msearch, HTTP_MSEARCH, M-SEARCH) 1682 RESTINIO_GEN( http_method_notify, HTTP_NOTIFY, NOTIFY ) 1683 RESTINIO_GEN( http_method_subscribe, HTTP_SUBSCRIBE, SUBSCRIBE ) 1684 RESTINIO_GEN( http_method_unsubscribe, HTTP_UNSUBSCRIBE, UNSUBSCRIBE ) 1686 RESTINIO_GEN( http_method_patch, HTTP_PATCH, PATCH ) 1687 RESTINIO_GEN( http_method_purge, HTTP_PURGE, PURGE ) 1689 RESTINIO_GEN( http_method_mkcalendar, HTTP_MKCALENDAR, MKCALENDAR ) 1691 RESTINIO_GEN( http_method_link, HTTP_LINK, LINK ) 1692 RESTINIO_GEN( http_method_unlink, HTTP_UNLINK, UNLINK ) 1753 ,
m_name{
"<undefined>" }
1757 const char * name )
noexcept 1773 constexpr const char *
1776 friend constexpr bool 1781 friend constexpr bool 1786 friend constexpr bool 1795 return to << m.c_str();
1799 #define RESTINIO_HTTP_METHOD_FUNC_GEN( func_name, nodejs_code, method_name ) 1800 inline constexpr http_method_id_t func_name() { 1801 return { nodejs_code, #method_name }; 1805 #undef RESTINIO_HTTP_METHOD_FUNC_GEN 1840 #define RESTINIO_HTTP_METHOD_FUNC_GEN( func_name, nodejs_code, method_name ) 1841 case nodejs_code : result = func_name(); break; 1844 #undef RESTINIO_HTTP_METHOD_FUNC_GEN 1857 struct http_request_header_t
final 1863 const char * result =
static_cast<
const char * >(
1864 std::memchr( from, chr, size ) );
1866 return result ?
static_cast< std::size_t >( result - from ) : size;
1874 std::string request_target_ )
1877 request_target( std::move( request_target_ ) );
1882 {
return m_method; }
1890 {
return m_request_target; }
1895 m_request_target.assign( std::move( t ) );
1897 m_fragment_separator_pos =
1898 memchr_helper(
'#', m_request_target.data(), m_request_target.size() );
1900 m_query_separator_pos =
1901 memchr_helper(
'?', m_request_target.data(), m_fragment_separator_pos );
1915 return string_view_t{ m_request_target.data(), m_query_separator_pos };
1927 m_fragment_separator_pos == m_query_separator_pos ?
1928 string_view_t{
nullptr, 0 } :
1930 m_request_target.data() + m_query_separator_pos + 1,
1931 m_fragment_separator_pos - m_query_separator_pos - 1 };
1944 m_request_target.size() == m_fragment_separator_pos ?
1945 string_view_t{
nullptr, 0 } :
1947 m_request_target.data() + m_fragment_separator_pos + 1,
1948 m_request_target.size() - m_fragment_separator_pos - 1 };
1956 if( m_request_target.size() == m_fragment_separator_pos )
1961 const auto fragment_separator_pos_inc =
1962 memchr_helper(
'#', at, length );
1964 m_fragment_separator_pos += fragment_separator_pos_inc;
1966 if( m_request_target.size() == m_query_separator_pos )
1970 m_query_separator_pos +=
1971 memchr_helper(
'?', at, fragment_separator_pos_inc );
1977 m_request_target.append( at, length );
2005 return m_status_code;
2011 return raw_code() == sc.raw_code();
2017 return sc.raw_code() != sc.raw_code();
2023 return sc.raw_code() < sc.raw_code();
2131 std::string reason_phrase )
2138 {
return m_status_code; }
2142 { m_status_code = c; }
2146 {
return m_reason_phrase; }
2150 { m_reason_phrase.assign( std::move( r ) ); }
2160 return o <<
"{" << status_line.status_code().raw_code() <<
", " 2161 << status_line.reason_phrase() <<
"}";
2170 {
return http_status_line_t{ status_code::continue_,
"Continue" }; }
2173 {
return http_status_line_t{ status_code::switching_protocols,
"Switching Protocols" }; }
2176 {
return http_status_line_t{ status_code::ok,
"OK" }; }
2179 {
return http_status_line_t{ status_code::created,
"Created" }; }
2182 {
return http_status_line_t{ status_code::accepted,
"Accepted" }; }
2185 {
return http_status_line_t{ status_code::non_authoritative_information,
"Non-Authoritative Information" }; }
2188 {
return http_status_line_t{ status_code::no_content,
"No Content" }; }
2191 {
return http_status_line_t{ status_code::reset_content,
"Reset Content" }; }
2194 {
return http_status_line_t{ status_code::partial_content,
"Partial Content" }; }
2197 {
return http_status_line_t{ status_code::multiple_choices,
"Multiple Choices" }; }
2200 {
return http_status_line_t{ status_code::moved_permanently,
"Moved Permanently" }; }
2203 {
return http_status_line_t{ status_code::found,
"Found" }; }
2206 {
return http_status_line_t{ status_code::see_other,
"See Other" }; }
2209 {
return http_status_line_t{ status_code::not_modified,
"Not Modified" }; }
2212 {
return http_status_line_t{ status_code::use_proxy,
"Use Proxy" }; }
2215 {
return http_status_line_t{ status_code::temporary_redirect,
"Temporary Redirect" }; }
2218 {
return http_status_line_t{ status_code::bad_request,
"Bad Request" }; }
2221 {
return http_status_line_t{ status_code::unauthorized,
"Unauthorized" }; }
2224 {
return http_status_line_t{ status_code::payment_required,
"Payment Required" }; }
2227 {
return http_status_line_t{ status_code::forbidden,
"Forbidden" }; }
2230 {
return http_status_line_t{ status_code::not_found,
"Not Found" }; }
2233 {
return http_status_line_t{ status_code::method_not_allowed,
"Method Not Allowed" }; }
2236 {
return http_status_line_t{ status_code::not_acceptable,
"Not Acceptable" }; }
2239 {
return http_status_line_t{status_code::proxy_authentication_required,
"Proxy Authentication Required" }; }
2242 {
return http_status_line_t{ status_code::request_time_out,
"Request Timeout" }; }
2245 {
return http_status_line_t{ status_code::conflict,
"Conflict" }; }
2248 {
return http_status_line_t{ status_code::gone,
"Gone" }; }
2251 {
return http_status_line_t{ status_code::length_required,
"Length Required" }; }
2254 {
return http_status_line_t{ status_code::precondition_failed,
"Precondition Failed" }; }
2257 {
return http_status_line_t{ status_code::payload_too_large,
"Payload Too Large" }; }
2260 {
return http_status_line_t{ status_code::uri_too_long,
"URI Too Long" }; }
2263 {
return http_status_line_t{ status_code::unsupported_media_type,
"Unsupported Media Type" }; }
2266 {
return http_status_line_t{ status_code::requested_range_not_satisfiable,
"Requested Range Not Satisfiable" }; }
2269 {
return http_status_line_t{ status_code::expectation_failed,
"Expectation Failed" }; }
2272 {
return http_status_line_t{ status_code::internal_server_error,
"Internal Server Error" }; }
2275 {
return http_status_line_t{ status_code::not_implemented,
"Not Implemented" }; }
2278 {
return http_status_line_t{ status_code::bad_gateway,
"Bad Gateway" }; }
2281 {
return http_status_line_t{ status_code::service_unavailable,
"Service Unavailable" }; }
2284 {
return http_status_line_t{ status_code::gateway_time_out,
"Gateway Timeout" }; }
2287 {
return http_status_line_t{ status_code::http_version_not_supported,
"HTTP Version not supported" }; }
2296 {
return http_status_line_t{ status_code::permanent_redirect,
"Permanent Redirect" }; }
2300 {
return http_status_line_t{ status_code::processing,
"Processing" }; }
2303 {
return http_status_line_t{ status_code::multi_status,
"Multi-Status" }; }
2306 {
return http_status_line_t{ status_code::unprocessable_entity,
"Unprocessable Entity" }; }
2309 {
return http_status_line_t{ status_code::locked,
"Locked" }; }
2312 {
return http_status_line_t{ status_code::failed_dependency,
"Failed Dependency" }; }
2315 {
return http_status_line_t{ status_code::insufficient_storage,
"Insufficient Storage" }; }
2319 {
return http_status_line_t{ status_code::precondition_required,
"Precondition Required" }; }
2322 {
return http_status_line_t{ status_code::too_many_requests,
"Too Many Requests" }; }
2325 {
return http_status_line_t{ status_code::request_header_fields_too_large,
"Request Header Fields Too Large" }; }
2328 {
return http_status_line_t{ status_code::network_authentication_required,
"Network Authentication Required" }; }
2336 struct http_response_header_t
final 2349 {
return m_status_line.status_code(); }
2353 { m_status_line.status_code( c ); }
2357 {
return m_status_line.reason_phrase(); }
2361 { m_status_line.reason_phrase( std::move( r ) ); }
2366 return m_status_line;
2372 m_status_line = std::move( sl );
void reason_phrase(std::string r)
http_status_line_t status_method_not_allowed()
constexpr http_status_code_t see_other
http_status_line_t status_unprocessable_entity()
http_status_line_t status_temporary_redirect()
constexpr http_status_code_t no_content
http_status_line_t status_use_proxy()
friend constexpr bool operator!=(const http_method_id_t &a, const http_method_id_t &b) noexcept
std::ostream & operator<<(std::ostream &o, const http_status_line_t &status_line)
constexpr http_method_id_t(int value, const char *name) noexcept
constexpr http_status_code_t too_many_requests
constexpr http_status_code_t non_authoritative_information
http_status_line_t status_multi_status()
constexpr http_status_code_t ok
constexpr http_status_code_t conflict
http_status_line_t status_gone()
std::string m_reason_phrase
constexpr http_status_code_t(std::uint16_t status_code) noexcept
constexpr http_method_id_t() noexcept
constexpr http_status_code_t payment_required
A type for representation of HTTP method ID.
constexpr http_status_code_t bad_request
constexpr http_status_code_t multi_status
http_status_line_t status_created()
constexpr const char * c_str() const noexcept
http_status_line_t status_bad_request()
http_status_line_t status_internal_server_error()
http_status_line_t status_payment_required()
http_status_line_t status_length_required()
constexpr http_status_code_t expectation_failed
http_status_line_t status_not_acceptable()
friend constexpr bool operator==(const http_method_id_t &a, const http_method_id_t &b) noexcept
constexpr http_status_code_t requested_range_not_satisfiable
constexpr http_status_code_t() noexcept
constexpr bool operator==(const http_status_code_t &sc) const noexcept
constexpr http_method_id_t & operator=(const http_method_id_t &) noexcept=default
http_status_line_t status_payload_too_large()
constexpr http_status_code_t length_required
http_status_line_t(http_status_code_t sc, std::string reason_phrase)
constexpr http_status_code_t moved_permanently
constexpr http_method_id_t(const http_method_id_t &) noexcept=default
constexpr auto raw_code() const noexcept
http_status_line_t status_not_modified()
const char * field_to_string(http_field_t f) noexcept
Helper sunction to get method string name.
constexpr http_status_code_t partial_content
http_status_line_t status_non_authoritative_information()
std::uint16_t m_status_code
Status code value.
http_status_line_t status_precondition_failed()
constexpr http_method_id_t http_method_unknown()
http_status_line_t status_http_version_not_supported()
constexpr http_status_code_t request_time_out
const std::string & reason_phrase() const noexcept
constexpr http_status_code_t temporary_redirect
http_status_line_t status_proxy_authentication_required()
constexpr http_status_code_t processing
http_status_line_t status_conflict()
http_status_line_t status_expectation_failed()
constexpr http_status_code_t precondition_required
constexpr http_status_code_t unauthorized
HTTP response header status line.
constexpr http_status_code_t internal_server_error
http_connection_header_t
Values for conection header field.
constexpr http_status_code_t gateway_time_out
http_status_line_t status_request_header_fields_too_large()
http_status_line_t status_partial_content()
constexpr http_status_code_t switching_protocols
constexpr http_status_code_t not_acceptable
http_status_line_t status_failed_dependency()
constexpr http_status_code_t http_version_not_supported
constexpr http_status_code_t method_not_allowed
constexpr http_status_code_t continue_
http_status_line_t status_gateway_time_out()
std::ostream & operator<<(std::ostream &to, const http_method_id_t &m)
constexpr http_status_code_t network_authentication_required
http_status_line_t status_accepted()
friend constexpr bool operator<(const http_method_id_t &a, const http_method_id_t &b) noexcept
void status_code(http_status_code_t c) noexcept
http_status_line_t status_unauthorized()
constexpr http_status_code_t insufficient_storage
constexpr bool operator<(const http_status_code_t &sc) const noexcept
http_status_line_t status_service_unavailable()
constexpr http_status_code_t reset_content
http_status_line_t status_multiple_choices()
http_status_line_t status_found()
http_status_line_t status_reset_content()
http_status_line_t status_too_many_requests()
constexpr http_status_code_t created
http_status_code_t m_status_code
http_status_line_t status_moved_permanently()
http_status_line_t status_not_found()
constexpr http_status_code_t found
constexpr http_method_id_t(http_method_id_t &&) noexcept=default
constexpr http_status_code_t unprocessable_entity
constexpr bool operator!=(const http_status_code_t &sc) const noexcept
http_status_line_t status_bad_gateway()
http_status_line_t status_requested_range_not_satisfiable()
A handy wrapper for HTTP response status code.
constexpr http_status_code_t not_implemented
http_status_code_t status_code() const noexcept
http_status_line_t status_locked()
http_status_line_t status_forbidden()
The default implementation for http_method_mapper.
static constexpr const int unknown_method
http_status_line_t status_request_time_out()
http_status_line_t status_uri_too_long()
constexpr http_status_code_t locked
constexpr http_status_code_t not_found
constexpr http_status_code_t request_header_fields_too_large
constexpr http_status_code_t bad_gateway
constexpr http_status_code_t service_unavailable
constexpr http_status_code_t precondition_failed
http_field_t string_to_field(string_view_t field) noexcept
Helper function to get method string name.
RESTINIO_NODISCARD char to_lower_case(unsigned char ch)
http_status_line_t status_precondition_required()
constexpr http_status_code_t proxy_authentication_required
constexpr http_status_code_t accepted
constexpr http_status_code_t not_modified
constexpr http_status_code_t unsupported_media_type
http_status_line_t status_no_content()
constexpr http_status_code_t multiple_choices
constexpr http_status_code_t use_proxy
http_status_line_t status_ok()
constexpr http_status_code_t permanent_redirect
http_status_line_t status_processing()
constexpr http_status_code_t failed_dependency
static constexpr http_method_id_t from_nodejs(int value) noexcept
http_status_line_t status_insufficient_storage()
http_status_line_t status_permanent_redirect()
http_status_line_t status_unsupported_media_type()
constexpr auto raw_id() const noexcept
http_status_line_t status_switching_protocols()
constexpr http_status_code_t payload_too_large
http_field_t
C++ enum that repeats nodejs c-style enum.
http_status_line_t status_network_authentication_required()
constexpr http_status_code_t forbidden
http_status_line_t status_continue()
http_status_line_t status_not_implemented()
http_status_line_t status_see_other()
constexpr http_status_code_t uri_too_long
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 ...
constexpr http_method_id_t & operator=(http_method_id_t &&) noexcept=default
constexpr http_status_code_t gone