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