identt
StatusCode.hpp
Go to the documentation of this file.
1 
33 #ifndef _IDENTT_HTTP_STATUS_CODE_HPP_
34 #define _IDENTT_HTTP_STATUS_CODE_HPP_
35 
36 #include <cstdlib>
37 #include <map>
38 #include <string>
39 #include <unordered_map>
40 #include <vector>
41 
42 namespace identt {
43 namespace http {
44 
45 enum class StatusCode {
46  unknown = 0,
47  information_continue = 100,
48  information_switching_protocols,
49  information_processing,
50  success_ok = 200,
51  success_created,
52  success_accepted,
53  success_non_authoritative_information,
54  success_no_content,
55  success_reset_content,
56  success_partial_content,
57  success_multi_status,
58  success_already_reported,
59  success_im_used = 226,
60  redirection_multiple_choices = 300,
61  redirection_moved_permanently,
62  redirection_found,
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,
79  client_error_gone,
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,
90  client_error_locked,
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
108 };
109 
110 inline const std::map<StatusCode, std::string> &status_code_strings()
111 {
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"}
175  };
176  return status_code_strings;
177 }
178 
179 inline StatusCode status_code(const std::string &status_code_string) noexcept
180 {
181  if(status_code_string.size() < 3)
182  return StatusCode::unknown;
183 
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;
187 
188  class StringToStatusCode : public std::unordered_map<std::string, identt::http::StatusCode> {
189  public:
190  StringToStatusCode()
191  {
192  for(auto &status_code : status_code_strings())
193  emplace(status_code.second.substr(0, 3), status_code.first);
194  }
195  };
196  static StringToStatusCode string_to_status_code;
197 
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()));
201  return pos->second;
202 }
203 
204 inline const std::string &status_code(StatusCode status_code_enum) noexcept
205 {
206  auto pos = status_code_strings().find(status_code_enum);
207  if(pos == status_code_strings().end()) {
208  static std::string empty_string;
209  return empty_string;
210  }
211  return pos->second;
212 }
213 } // namespace http
214 } // namespace identt
215 
216 #endif /* _IDENTT_HTTP_STATUS_CODE_HPP_ */
217 
Definition: CryptoBase.hpp:49