GCC Code Coverage Report


Directory: libs/http_proto/
File: src/method.cpp
Date: 2025-09-21 18:08:15
Exec Total Coverage
Lines: 178 184 96.7%
Functions: 2 3 66.7%
Branches: 133 140 95.0%

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