GCC Code Coverage Report


Directory: libs/http_proto/
File: include/boost/http_proto/metadata.hpp
Date: 2025-09-21 18:08:15
Exec Total Coverage
Lines: 39 39 100.0%
Functions: 13 13 100.0%
Branches: 0 0 -%

Line Branch Exec Source
1 //
2 // Copyright (c) 2021 Vinnie Falco (vinnie.falco@gmail.com)
3 // Copyright (c) 2024 Mohammad Nejati
4 //
5 // Distributed under the Boost Software License, Version 1.0. (See accompanying
6 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 //
8 // Official repository: https://github.com/cppalliance/http_proto
9 //
10
11 #ifndef BOOST_HTTP_PROTO_METADATA_HPP
12 #define BOOST_HTTP_PROTO_METADATA_HPP
13
14 #include <boost/http_proto/detail/config.hpp>
15 #include <boost/system/error_code.hpp>
16 #include <cstdint>
17 #include <cstdlib>
18
19 namespace boost {
20 namespace http_proto {
21
22 /** Identifies the payload type of a message.
23 */
24 enum class payload
25 {
26 /** This message has no payload.
27 */
28 none,
29
30 /** The payload is unknown due to errors.
31 */
32 error,
33
34 /** This message has a known payload size.
35 */
36 size,
37
38 /** This message contains a chunked payload.
39 */
40 chunked,
41
42 /** The payload for this message continues until EOF.
43 */
44 to_eof
45 };
46
47 /** Standard content-codings for HTTP message bodies.
48 */
49 enum class content_coding
50 {
51 unknown,
52 br,
53 compress,
54 dcb,
55 dcz,
56 deflate,
57 gzip,
58 identity,
59 zstd,
60 };
61
62 /** Metadata about a request or response.
63 */
64 struct metadata
65 {
66 /** Metadata for the Connection field.
67 */
68 struct connection_t
69 {
70 /** Error status of Connection.
71 */
72 system::error_code ec;
73
74 /** The total number of fields.
75 */
76 std::size_t count = 0;
77
78 /** true if a close token is present.
79 */
80 bool close = false;
81
82 /** true if a keep-alive token is present.
83 */
84 bool keep_alive = false;
85
86 /** true if an upgrade token is present.
87 */
88 bool upgrade = false;
89
90 #ifdef BOOST_HTTP_PROTO_AGGREGATE_WORKAROUND
91 constexpr
92 11974 connection_t() = default;
93
94 constexpr
95 15 connection_t(
96 system::error_code ec_,
97 std::size_t count_,
98 bool close_,
99 bool keep_alive_,
100 bool upgrade_) noexcept
101 15 : ec(ec_)
102 15 , count(count_)
103 15 , close(close_)
104 15 , keep_alive(keep_alive_)
105 15 , upgrade(upgrade_)
106 {
107 15 }
108 #endif
109 };
110
111 //--------------------------------------------
112
113 /** Metadata for the Content-Encoding field.
114 */
115 struct content_encoding_t
116 {
117 /** Error status of Content-Encoding.
118 */
119 system::error_code ec;
120
121 /** The total number of fields.
122 */
123 std::size_t count = 0;
124
125 /** The body encoding.
126 */
127 content_coding coding =
128 content_coding::identity;
129
130 #ifdef BOOST_HTTP_PROTO_AGGREGATE_WORKAROUND
131 constexpr
132 11962 content_encoding_t() = default;
133
134 constexpr
135 5 content_encoding_t(
136 system::error_code ec_,
137 std::size_t count_,
138 content_coding coding_) noexcept
139 5 : ec(ec_)
140 5 , count(count_)
141 5 , coding(coding_)
142 {
143 5 }
144 #endif
145 };
146
147 //--------------------------------------------
148
149 /** Metadata for the Content-Length field.
150 */
151 struct content_length_t
152 {
153 /** Error status of Content-Length.
154 */
155 system::error_code ec;
156
157 /** The total number of fields.
158 */
159 std::size_t count = 0;
160
161 /** The value as an integer.
162
163 This is only valid when ec does
164 not hold a failure, and when
165 count is greater than zero.
166 */
167 std::uint64_t value = 0;
168
169 #ifdef BOOST_HTTP_PROTO_AGGREGATE_WORKAROUND
170 constexpr
171 11966 content_length_t() = default;
172
173 constexpr
174 11 content_length_t(
175 system::error_code ec_,
176 std::size_t count_,
177 std::uint64_t value_) noexcept
178 11 : ec(ec_)
179 11 , count(count_)
180 11 , value(value_)
181 {
182 11 }
183 #endif
184 };
185
186 //--------------------------------------------
187
188 /** Metadata for the Expect field.
189 */
190 struct expect_t
191 {
192 /** Error status of Expect.
193 */
194 system::error_code ec;
195
196 /** The total number of fields.
197 */
198 std::size_t count = 0;
199
200 /** True if Expect is 100-continue.
201 */
202 bool is_100_continue = false;
203
204 #ifdef BOOST_HTTP_PROTO_AGGREGATE_WORKAROUND
205 constexpr
206 11981 expect_t() = default;
207
208 constexpr
209 14 expect_t(
210 system::error_code ec_,
211 std::size_t count_,
212 bool is_100_continue_) noexcept
213 14 : ec(ec_)
214 14 , count(count_)
215 14 , is_100_continue(is_100_continue_)
216 {
217 14 }
218 #endif
219 };
220
221 //--------------------------------------------
222
223 /** Metadata for the Transfer-Encoding field.
224 */
225 struct transfer_encoding_t
226 {
227 /** Error status of Content-Length.
228 */
229 system::error_code ec;
230
231 /** The total number of fields.
232 */
233 std::size_t count = 0;
234
235 /** True if valid and chunked is specified last.
236 */
237 bool is_chunked = false;
238
239 #ifdef BOOST_HTTP_PROTO_AGGREGATE_WORKAROUND
240 constexpr
241 11967 transfer_encoding_t() = default;
242
243 constexpr
244 19 transfer_encoding_t(
245 system::error_code ec_,
246 std::size_t count_,
247 bool is_chunked_) noexcept
248 19 : ec(ec_)
249 19 , count(count_)
250 19 , is_chunked(is_chunked_)
251 {
252 19 }
253 #endif
254 };
255
256 //--------------------------------------------
257
258 /** Metadata for Upgrade field.
259 */
260 struct upgrade_t
261 {
262 /** Error status of Upgrade.
263 */
264 system::error_code ec;
265
266 /** The total number of fields.
267 */
268 std::size_t count = 0;
269
270 /** True if websocket appears at least once.
271 */
272 bool websocket = false;
273
274 #ifdef BOOST_HTTP_PROTO_AGGREGATE_WORKAROUND
275 constexpr
276 11967 upgrade_t() = default;
277
278 constexpr
279 15 upgrade_t(
280 system::error_code ec_,
281 std::size_t count_,
282 bool websocket_) noexcept
283 15 : ec(ec_)
284 15 , count(count_)
285 15 , websocket(websocket_)
286 {
287 15 }
288 #endif
289 };
290
291 //--------------------------------------------
292
293 /** True if payload is manually specified.
294
295 This flag is used to allow the caller
296 to resolve problems with non-compliant
297 values for Content-Length.
298 */
299 bool payload_override = false;
300
301 /** The type of payload.
302 */
303 http_proto::payload payload =
304 http_proto::payload::none;
305
306 /** The size of the payload if known.
307
308 This is only valid when @ref payload
309 equals @ref http_proto::payload::size.
310 */
311 std::uint64_t payload_size = 0;
312
313 //--------------------------------------------
314
315 // header metadata
316
317 /** Metadata for the Connection field.
318 */
319 connection_t connection;
320
321 /** Metadata for the Content-Encoding field.
322 */
323 content_encoding_t content_encoding;
324
325 /** Metadata for the Content-Length field.
326 */
327 content_length_t content_length;
328
329 /** Metadata for the Expect field.
330 */
331 expect_t expect;
332
333 /** Metadata for the Transfer-Encoding field.
334 */
335 transfer_encoding_t transfer_encoding;
336
337 /** Metadata for the Upgrade field.
338 */
339 upgrade_t upgrade;
340
341 //--------------------------------------------
342
343 /** Constructor.
344 */
345 11962 constexpr metadata() = default;
346 };
347
348 } // http_proto
349 } // boost
350
351 #endif
352