verb.ipp 6.5 KB

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