status.ipp 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. //
  2. // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
  3. //
  4. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  5. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. //
  7. // Official repository: https://github.com/boostorg/beast
  8. //
  9. #ifndef BOOST_BEAST_HTTP_IMPL_STATUS_IPP
  10. #define BOOST_BEAST_HTTP_IMPL_STATUS_IPP
  11. #include <boost/beast/http/status.hpp>
  12. #include <boost/throw_exception.hpp>
  13. namespace boost {
  14. namespace beast {
  15. namespace http {
  16. status
  17. int_to_status(unsigned v)
  18. {
  19. switch(static_cast<status>(v))
  20. {
  21. // 1xx
  22. case status::continue_:
  23. case status::switching_protocols:
  24. case status::processing:
  25. BOOST_FALLTHROUGH;
  26. // 2xx
  27. case status::ok:
  28. case status::created:
  29. case status::accepted:
  30. case status::non_authoritative_information:
  31. case status::no_content:
  32. case status::reset_content:
  33. case status::partial_content:
  34. case status::multi_status:
  35. case status::already_reported:
  36. case status::im_used:
  37. BOOST_FALLTHROUGH;
  38. // 3xx
  39. case status::multiple_choices:
  40. case status::moved_permanently:
  41. case status::found:
  42. case status::see_other:
  43. case status::not_modified:
  44. case status::use_proxy:
  45. case status::temporary_redirect:
  46. case status::permanent_redirect:
  47. BOOST_FALLTHROUGH;
  48. // 4xx
  49. case status::bad_request:
  50. case status::unauthorized:
  51. case status::payment_required:
  52. case status::forbidden:
  53. case status::not_found:
  54. case status::method_not_allowed:
  55. case status::not_acceptable:
  56. case status::proxy_authentication_required:
  57. case status::request_timeout:
  58. case status::conflict:
  59. case status::gone:
  60. case status::length_required:
  61. case status::precondition_failed:
  62. case status::payload_too_large:
  63. case status::uri_too_long:
  64. case status::unsupported_media_type:
  65. case status::range_not_satisfiable:
  66. case status::expectation_failed:
  67. case status::misdirected_request:
  68. case status::unprocessable_entity:
  69. case status::locked:
  70. case status::failed_dependency:
  71. case status::upgrade_required:
  72. case status::precondition_required:
  73. case status::too_many_requests:
  74. case status::request_header_fields_too_large:
  75. case status::connection_closed_without_response:
  76. case status::unavailable_for_legal_reasons:
  77. case status::client_closed_request:
  78. BOOST_FALLTHROUGH;
  79. // 5xx
  80. case status::internal_server_error:
  81. case status::not_implemented:
  82. case status::bad_gateway:
  83. case status::service_unavailable:
  84. case status::gateway_timeout:
  85. case status::http_version_not_supported:
  86. case status::variant_also_negotiates:
  87. case status::insufficient_storage:
  88. case status::loop_detected:
  89. case status::not_extended:
  90. case status::network_authentication_required:
  91. case status::network_connect_timeout_error:
  92. return static_cast<status>(v);
  93. default:
  94. break;
  95. }
  96. return status::unknown;
  97. }
  98. status_class
  99. to_status_class(unsigned v)
  100. {
  101. switch(v / 100)
  102. {
  103. case 1: return status_class::informational;
  104. case 2: return status_class::successful;
  105. case 3: return status_class::redirection;
  106. case 4: return status_class::client_error;
  107. case 5: return status_class::server_error;
  108. default:
  109. break;
  110. }
  111. return status_class::unknown;
  112. }
  113. status_class
  114. to_status_class(status v)
  115. {
  116. return to_status_class(static_cast<int>(v));
  117. }
  118. string_view
  119. obsolete_reason(status v)
  120. {
  121. switch(static_cast<status>(v))
  122. {
  123. // 1xx
  124. case status::continue_: return "Continue";
  125. case status::switching_protocols: return "Switching Protocols";
  126. case status::processing: return "Processing";
  127. // 2xx
  128. case status::ok: return "OK";
  129. case status::created: return "Created";
  130. case status::accepted: return "Accepted";
  131. case status::non_authoritative_information: return "Non-Authoritative Information";
  132. case status::no_content: return "No Content";
  133. case status::reset_content: return "Reset Content";
  134. case status::partial_content: return "Partial Content";
  135. case status::multi_status: return "Multi-Status";
  136. case status::already_reported: return "Already Reported";
  137. case status::im_used: return "IM Used";
  138. // 3xx
  139. case status::multiple_choices: return "Multiple Choices";
  140. case status::moved_permanently: return "Moved Permanently";
  141. case status::found: return "Found";
  142. case status::see_other: return "See Other";
  143. case status::not_modified: return "Not Modified";
  144. case status::use_proxy: return "Use Proxy";
  145. case status::temporary_redirect: return "Temporary Redirect";
  146. case status::permanent_redirect: return "Permanent Redirect";
  147. // 4xx
  148. case status::bad_request: return "Bad Request";
  149. case status::unauthorized: return "Unauthorized";
  150. case status::payment_required: return "Payment Required";
  151. case status::forbidden: return "Forbidden";
  152. case status::not_found: return "Not Found";
  153. case status::method_not_allowed: return "Method Not Allowed";
  154. case status::not_acceptable: return "Not Acceptable";
  155. case status::proxy_authentication_required: return "Proxy Authentication Required";
  156. case status::request_timeout: return "Request Timeout";
  157. case status::conflict: return "Conflict";
  158. case status::gone: return "Gone";
  159. case status::length_required: return "Length Required";
  160. case status::precondition_failed: return "Precondition Failed";
  161. case status::payload_too_large: return "Payload Too Large";
  162. case status::uri_too_long: return "URI Too Long";
  163. case status::unsupported_media_type: return "Unsupported Media Type";
  164. case status::range_not_satisfiable: return "Range Not Satisfiable";
  165. case status::expectation_failed: return "Expectation Failed";
  166. case status::misdirected_request: return "Misdirected Request";
  167. case status::unprocessable_entity: return "Unprocessable Entity";
  168. case status::locked: return "Locked";
  169. case status::failed_dependency: return "Failed Dependency";
  170. case status::upgrade_required: return "Upgrade Required";
  171. case status::precondition_required: return "Precondition Required";
  172. case status::too_many_requests: return "Too Many Requests";
  173. case status::request_header_fields_too_large: return "Request Header Fields Too Large";
  174. case status::connection_closed_without_response: return "Connection Closed Without Response";
  175. case status::unavailable_for_legal_reasons: return "Unavailable For Legal Reasons";
  176. case status::client_closed_request: return "Client Closed Request";
  177. // 5xx
  178. case status::internal_server_error: return "Internal Server Error";
  179. case status::not_implemented: return "Not Implemented";
  180. case status::bad_gateway: return "Bad Gateway";
  181. case status::service_unavailable: return "Service Unavailable";
  182. case status::gateway_timeout: return "Gateway Timeout";
  183. case status::http_version_not_supported: return "HTTP Version Not Supported";
  184. case status::variant_also_negotiates: return "Variant Also Negotiates";
  185. case status::insufficient_storage: return "Insufficient Storage";
  186. case status::loop_detected: return "Loop Detected";
  187. case status::not_extended: return "Not Extended";
  188. case status::network_authentication_required: return "Network Authentication Required";
  189. case status::network_connect_timeout_error: return "Network Connect Timeout Error";
  190. default:
  191. break;
  192. }
  193. return "<unknown-status>";
  194. }
  195. std::ostream&
  196. operator<<(std::ostream& os, status v)
  197. {
  198. return os << obsolete_reason(v);
  199. }
  200. } // http
  201. } // beast
  202. } // boost
  203. #endif