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