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