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/method.hpp>
11 : #include <boost/http_proto/detail/sv.hpp>
12 : #include <boost/throw_exception.hpp>
13 : #include <ostream>
14 :
15 : namespace boost {
16 : namespace http_proto {
17 :
18 : core::string_view
19 95 : to_string(method v)
20 : {
21 : using namespace detail::string_literals;
22 95 : switch(v)
23 : {
24 5 : case method::delete_: return "DELETE"_sv;
25 55 : case method::get: return "GET"_sv;
26 1 : case method::head: return "HEAD"_sv;
27 3 : case method::post: return "POST"_sv;
28 1 : case method::put: return "PUT"_sv;
29 1 : case method::connect: return "CONNECT"_sv;
30 1 : case method::options: return "OPTIONS"_sv;
31 1 : case method::trace: return "TRACE"_sv;
32 :
33 1 : case method::copy: return "COPY"_sv;
34 1 : case method::lock: return "LOCK"_sv;
35 1 : case method::mkcol: return "MKCOL"_sv;
36 1 : case method::move: return "MOVE"_sv;
37 1 : case method::propfind: return "PROPFIND"_sv;
38 1 : case method::proppatch: return "PROPPATCH"_sv;
39 1 : case method::search: return "SEARCH"_sv;
40 1 : case method::unlock: return "UNLOCK"_sv;
41 1 : case method::bind: return "BIND"_sv;
42 1 : case method::rebind: return "REBIND"_sv;
43 1 : case method::unbind: return "UNBIND"_sv;
44 1 : case method::acl: return "ACL"_sv;
45 :
46 1 : case method::report: return "REPORT"_sv;
47 1 : case method::mkactivity: return "MKACTIVITY"_sv;
48 1 : case method::checkout: return "CHECKOUT"_sv;
49 1 : case method::merge: return "MERGE"_sv;
50 :
51 1 : case method::msearch: return "M-SEARCH"_sv;
52 1 : case method::notify: return "NOTIFY"_sv;
53 1 : case method::subscribe: return "SUBSCRIBE"_sv;
54 1 : case method::unsubscribe: return "UNSUBSCRIBE"_sv;
55 :
56 1 : case method::patch: return "PATCH"_sv;
57 1 : case method::purge: return "PURGE"_sv;
58 :
59 1 : case method::mkcalendar: return "MKCALENDAR"_sv;
60 :
61 1 : case method::link: return "LINK"_sv;
62 1 : case method::unlink: return "UNLINK"_sv;
63 :
64 1 : case method::unknown:
65 1 : return "<unknown>"_sv;
66 : }
67 :
68 2 : BOOST_THROW_EXCEPTION(
69 : std::invalid_argument("unknown method"));
70 : }
71 :
72 : method
73 9833 : string_to_method(
74 : core::string_view v)
75 : {
76 : /*
77 : ACL
78 : BIND
79 : CHECKOUT
80 : CONNECT
81 : COPY
82 : DELETE
83 : GET
84 : HEAD
85 : LINK
86 : LOCK
87 : M-SEARCH
88 : MERGE
89 : MKACTIVITY
90 : MKCALENDAR
91 : MKCOL
92 : MOVE
93 : NOTIFY
94 : OPTIONS
95 : PATCH
96 : POST
97 : PROPFIND
98 : PROPPATCH
99 : PURGE
100 : PUT
101 : REBIND
102 : REPORT
103 : SEARCH
104 : SUBSCRIBE
105 : TRACE
106 : UNBIND
107 : UNLINK
108 : UNLOCK
109 : UNSUBSCRIBE
110 : */
111 : using namespace detail::string_literals;
112 9833 : if(v.size() < 3)
113 0 : return method::unknown;
114 9833 : auto c = v[0];
115 9833 : v.remove_prefix(1);
116 9833 : switch(c)
117 : {
118 2 : case 'A':
119 2 : if(v == "CL"_sv)
120 1 : return method::acl;
121 1 : break;
122 :
123 2 : case 'B':
124 2 : if(v == "IND"_sv)
125 1 : return method::bind;
126 1 : break;
127 :
128 7 : case 'C':
129 7 : c = v[0];
130 7 : v.remove_prefix(1);
131 7 : switch(c)
132 : {
133 2 : case 'H':
134 2 : if(v == "ECKOUT"_sv)
135 1 : return method::checkout;
136 1 : break;
137 :
138 5 : case 'O':
139 5 : if(v == "NNECT"_sv)
140 2 : return method::connect;
141 3 : if(v == "PY"_sv)
142 1 : return method::copy;
143 : BOOST_FALLTHROUGH;
144 :
145 : default:
146 2 : break;
147 : }
148 3 : break;
149 :
150 8 : case 'D':
151 8 : if(v == "ELETE"_sv)
152 7 : return method::delete_;
153 1 : break;
154 :
155 9685 : case 'G':
156 9685 : if(v == "ET"_sv)
157 9684 : return method::get;
158 1 : break;
159 :
160 2 : case 'H':
161 2 : if(v == "EAD"_sv)
162 1 : return method::head;
163 1 : break;
164 :
165 4 : case 'L':
166 4 : if(v == "INK"_sv)
167 1 : return method::link;
168 3 : if(v == "OCK"_sv)
169 1 : return method::lock;
170 2 : break;
171 :
172 12 : case 'M':
173 12 : c = v[0];
174 12 : v.remove_prefix(1);
175 12 : switch(c)
176 : {
177 2 : case '-':
178 2 : if(v == "SEARCH"_sv)
179 1 : return method::msearch;
180 1 : break;
181 :
182 2 : case 'E':
183 2 : if(v == "RGE"_sv)
184 1 : return method::merge;
185 1 : break;
186 :
187 6 : case 'K':
188 6 : if(v == "ACTIVITY"_sv)
189 1 : return method::mkactivity;
190 5 : if(v[0] == 'C')
191 : {
192 4 : v.remove_prefix(1);
193 4 : if(v == "ALENDAR"_sv)
194 1 : return method::mkcalendar;
195 3 : if(v == "OL"_sv)
196 1 : return method::mkcol;
197 2 : break;
198 : }
199 1 : break;
200 :
201 2 : case 'O':
202 2 : if(v == "VE"_sv)
203 1 : return method::move;
204 : BOOST_FALLTHROUGH;
205 :
206 : default:
207 1 : break;
208 : }
209 6 : break;
210 :
211 2 : case 'N':
212 2 : if(v == "OTIFY"_sv)
213 1 : return method::notify;
214 1 : break;
215 :
216 2 : case 'O':
217 2 : if(v == "PTIONS"_sv)
218 1 : return method::options;
219 1 : break;
220 :
221 76 : case 'P':
222 76 : c = v[0];
223 76 : v.remove_prefix(1);
224 76 : switch(c)
225 : {
226 2 : case 'A':
227 2 : if(v == "TCH"_sv)
228 1 : return method::patch;
229 1 : break;
230 :
231 62 : case 'O':
232 62 : if(v == "ST"_sv)
233 61 : return method::post;
234 1 : break;
235 :
236 4 : case 'R':
237 4 : if(v == "OPFIND"_sv)
238 1 : return method::propfind;
239 3 : if(v == "OPPATCH"_sv)
240 1 : return method::proppatch;
241 2 : break;
242 :
243 8 : case 'U':
244 8 : if(v == "RGE"_sv)
245 1 : return method::purge;
246 7 : if(v == "T"_sv)
247 5 : return method::put;
248 : BOOST_FALLTHROUGH;
249 :
250 : default:
251 2 : break;
252 : }
253 6 : break;
254 :
255 4 : case 'R':
256 4 : if(v[0] != 'E')
257 0 : break;
258 4 : v.remove_prefix(1);
259 4 : if(v == "BIND"_sv)
260 1 : return method::rebind;
261 3 : if(v == "PORT"_sv)
262 1 : return method::report;
263 2 : break;
264 :
265 16 : case 'S':
266 16 : if(v == "EARCH"_sv)
267 1 : return method::search;
268 15 : if(v == "UBSCRIBE"_sv)
269 1 : return method::subscribe;
270 14 : break;
271 :
272 2 : case 'T':
273 2 : if(v == "RACE"_sv)
274 1 : return method::trace;
275 1 : break;
276 :
277 8 : case 'U':
278 8 : if(v[0] != 'N')
279 0 : break;
280 8 : v.remove_prefix(1);
281 8 : if(v == "BIND"_sv)
282 1 : return method::unbind;
283 7 : if(v == "LINK"_sv)
284 1 : return method::unlink;
285 6 : if(v == "LOCK"_sv)
286 1 : return method::unlock;
287 5 : if(v == "SUBSCRIBE"_sv)
288 1 : return method::unsubscribe;
289 4 : break;
290 :
291 1 : default:
292 1 : break;
293 : }
294 :
295 46 : return method::unknown;
296 : }
297 :
298 : std::ostream&
299 0 : operator<<(
300 : std::ostream& os,
301 : method v)
302 : {
303 0 : os << to_string(v);
304 0 : return os;
305 : }
306 :
307 : } // http_proto
308 : } // boost
|