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