33 #ifndef _IDENTT_HTTP_STATUS_CODE_HPP_ 34 #define _IDENTT_HTTP_STATUS_CODE_HPP_ 39 #include <unordered_map> 45 enum class StatusCode {
47 information_continue = 100,
48 information_switching_protocols,
49 information_processing,
53 success_non_authoritative_information,
55 success_reset_content,
56 success_partial_content,
58 success_already_reported,
59 success_im_used = 226,
60 redirection_multiple_choices = 300,
61 redirection_moved_permanently,
63 redirection_see_other,
64 redirection_not_modified,
65 redirection_use_proxy,
66 redirection_switch_proxy,
67 redirection_temporary_redirect,
68 redirection_permanent_redirect,
69 client_error_bad_request = 400,
70 client_error_unauthorized,
71 client_error_payment_required,
72 client_error_forbidden,
73 client_error_not_found,
74 client_error_method_not_allowed,
75 client_error_not_acceptable,
76 client_error_proxy_authentication_required,
77 client_error_request_timeout,
78 client_error_conflict,
80 client_error_length_required,
81 client_error_precondition_failed,
82 client_error_payload_too_large,
83 client_error_uri_too_long,
84 client_error_unsupported_media_type,
85 client_error_range_not_satisfiable,
86 client_error_expectation_failed,
87 client_error_im_a_teapot,
88 client_error_misdirection_required = 421,
89 client_error_unprocessable_entity,
91 client_error_failed_dependency,
92 client_error_upgrade_required = 426,
93 client_error_precondition_required = 428,
94 client_error_too_many_requests,
95 client_error_request_header_fields_too_large = 431,
96 client_error_unavailable_for_legal_reasons = 451,
97 server_error_internal_server_error = 500,
98 server_error_not_implemented,
99 server_error_bad_gateway,
100 server_error_service_unavailable,
101 server_error_gateway_timeout,
102 server_error_http_version_not_supported,
103 server_error_variant_also_negotiates,
104 server_error_insufficient_storage,
105 server_error_loop_detected,
106 server_error_not_extended = 510,
107 server_error_network_authentication_required
110 inline const std::map<StatusCode, std::string> &status_code_strings()
112 static const std::map<StatusCode, std::string> status_code_strings = {
113 {StatusCode::unknown,
""},
114 {StatusCode::information_continue,
"100 Continue"},
115 {StatusCode::information_switching_protocols,
"101 Switching Protocols"},
116 {StatusCode::information_processing,
"102 Processing"},
117 {StatusCode::success_ok,
"200 OK"},
118 {StatusCode::success_created,
"201 Created"},
119 {StatusCode::success_accepted,
"202 Accepted"},
120 {StatusCode::success_non_authoritative_information,
"203 Non-Authoritative Information"},
121 {StatusCode::success_no_content,
"204 No Content"},
122 {StatusCode::success_reset_content,
"205 Reset Content"},
123 {StatusCode::success_partial_content,
"206 Partial Content"},
124 {StatusCode::success_multi_status,
"207 Multi-Status"},
125 {StatusCode::success_already_reported,
"208 Already Reported"},
126 {StatusCode::success_im_used,
"226 IM Used"},
127 {StatusCode::redirection_multiple_choices,
"300 Multiple Choices"},
128 {StatusCode::redirection_moved_permanently,
"301 Moved Permanently"},
129 {StatusCode::redirection_found,
"302 Found"},
130 {StatusCode::redirection_see_other,
"303 See Other"},
131 {StatusCode::redirection_not_modified,
"304 Not Modified"},
132 {StatusCode::redirection_use_proxy,
"305 Use Proxy"},
133 {StatusCode::redirection_switch_proxy,
"306 Switch Proxy"},
134 {StatusCode::redirection_temporary_redirect,
"307 Temporary Redirect"},
135 {StatusCode::redirection_permanent_redirect,
"308 Permanent Redirect"},
136 {StatusCode::client_error_bad_request,
"400 Bad Request"},
137 {StatusCode::client_error_unauthorized,
"401 Unauthorized"},
138 {StatusCode::client_error_payment_required,
"402 Payment Required"},
139 {StatusCode::client_error_forbidden,
"403 Forbidden"},
140 {StatusCode::client_error_not_found,
"404 Not Found"},
141 {StatusCode::client_error_method_not_allowed,
"405 Method Not Allowed"},
142 {StatusCode::client_error_not_acceptable,
"406 Not Acceptable"},
143 {StatusCode::client_error_proxy_authentication_required,
"407 Proxy Authentication Required"},
144 {StatusCode::client_error_request_timeout,
"408 Request Timeout"},
145 {StatusCode::client_error_conflict,
"409 Conflict"},
146 {StatusCode::client_error_gone,
"410 Gone"},
147 {StatusCode::client_error_length_required,
"411 Length Required"},
148 {StatusCode::client_error_precondition_failed,
"412 Precondition Failed"},
149 {StatusCode::client_error_payload_too_large,
"413 Payload Too Large"},
150 {StatusCode::client_error_uri_too_long,
"414 URI Too Long"},
151 {StatusCode::client_error_unsupported_media_type,
"415 Unsupported Media Type"},
152 {StatusCode::client_error_range_not_satisfiable,
"416 Range Not Satisfiable"},
153 {StatusCode::client_error_expectation_failed,
"417 Expectation Failed"},
154 {StatusCode::client_error_im_a_teapot,
"418 I'm a teapot"},
155 {StatusCode::client_error_misdirection_required,
"421 Misdirected Request"},
156 {StatusCode::client_error_unprocessable_entity,
"422 Unprocessable Entity"},
157 {StatusCode::client_error_locked,
"423 Locked"},
158 {StatusCode::client_error_failed_dependency,
"424 Failed Dependency"},
159 {StatusCode::client_error_upgrade_required,
"426 Upgrade Required"},
160 {StatusCode::client_error_precondition_required,
"428 Precondition Required"},
161 {StatusCode::client_error_too_many_requests,
"429 Too Many Requests"},
162 {StatusCode::client_error_request_header_fields_too_large,
"431 Request Header Fields Too Large"},
163 {StatusCode::client_error_unavailable_for_legal_reasons,
"451 Unavailable For Legal Reasons"},
164 {StatusCode::server_error_internal_server_error,
"500 Internal Server Error"},
165 {StatusCode::server_error_not_implemented,
"501 Not Implemented"},
166 {StatusCode::server_error_bad_gateway,
"502 Bad Gateway"},
167 {StatusCode::server_error_service_unavailable,
"503 Service Unavailable"},
168 {StatusCode::server_error_gateway_timeout,
"504 Gateway Timeout"},
169 {StatusCode::server_error_http_version_not_supported,
"505 HTTP Version Not Supported"},
170 {StatusCode::server_error_variant_also_negotiates,
"506 Variant Also Negotiates"},
171 {StatusCode::server_error_insufficient_storage,
"507 Insufficient Storage"},
172 {StatusCode::server_error_loop_detected,
"508 Loop Detected"},
173 {StatusCode::server_error_not_extended,
"510 Not Extended"},
174 {StatusCode::server_error_network_authentication_required,
"511 Network Authentication Required"}
176 return status_code_strings;
179 inline StatusCode status_code(
const std::string &status_code_string) noexcept
181 if(status_code_string.size() < 3)
182 return StatusCode::unknown;
184 auto number = status_code_string.substr(0, 3);
185 if(number[0] <
'0' || number[0] >
'9' || number[1] <
'0' || number[1] >
'9' || number[2] <
'0' || number[2] >
'9')
186 return StatusCode::unknown;
188 class StringToStatusCode :
public std::unordered_map<std::string, identt::http::StatusCode> {
192 for(
auto &status_code : status_code_strings())
193 emplace(status_code.second.substr(0, 3), status_code.first);
196 static StringToStatusCode string_to_status_code;
198 auto pos = string_to_status_code.find(number);
199 if(pos == string_to_status_code.end())
200 return static_cast<StatusCode>(atoi(number.c_str()));
204 inline const std::string &status_code(StatusCode status_code_enum) noexcept
206 auto pos = status_code_strings().find(status_code_enum);
207 if(pos == status_code_strings().end()) {
208 static std::string empty_string;
Definition: CryptoBase.hpp:49