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