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