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