1  
//
1  
//
2  
// Copyright (c) 2021 Vinnie Falco (vinnie.falco@gmail.com)
2  
// Copyright (c) 2021 Vinnie Falco (vinnie.falco@gmail.com)
3  
// Copyright (c) 2024 Mohammad Nejati
3  
// Copyright (c) 2024 Mohammad Nejati
4  
//
4  
//
5  
// Distributed under the Boost Software License, Version 1.0. (See accompanying
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)
6  
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7  
//
7  
//
8  
// Official repository: https://github.com/cppalliance/http
8  
// Official repository: https://github.com/cppalliance/http
9  
//
9  
//
10  

10  

11  
#ifndef BOOST_HTTP_METADATA_HPP
11  
#ifndef BOOST_HTTP_METADATA_HPP
12  
#define BOOST_HTTP_METADATA_HPP
12  
#define BOOST_HTTP_METADATA_HPP
13  

13  

14  
#include <boost/http/detail/config.hpp>
14  
#include <boost/http/detail/config.hpp>
15  
#include <boost/system/error_code.hpp>
15  
#include <boost/system/error_code.hpp>
16  
#include <cstdint>
16  
#include <cstdint>
17  
#include <cstdlib>
17  
#include <cstdlib>
18  

18  

19  
namespace boost {
19  
namespace boost {
20  
namespace http {
20  
namespace http {
21  

21  

22  
/** Identifies the payload type of a message.
22  
/** Identifies the payload type of a message.
23  
*/
23  
*/
24  
enum class payload
24  
enum class payload
25  
{
25  
{
26  
    /** This message has no payload.
26  
    /** This message has no payload.
27  
    */
27  
    */
28  
    none,
28  
    none,
29  

29  

30  
    /** The payload is unknown due to errors.
30  
    /** The payload is unknown due to errors.
31  
    */
31  
    */
32  
    error,
32  
    error,
33  

33  

34  
    /** This message has a known payload size.
34  
    /** This message has a known payload size.
35  
    */
35  
    */
36  
    size,
36  
    size,
37  

37  

38  
    /** This message contains a chunked payload.
38  
    /** This message contains a chunked payload.
39  
    */
39  
    */
40  
    chunked,
40  
    chunked,
41  

41  

42  
    /** The payload for this message continues until EOF.
42  
    /** The payload for this message continues until EOF.
43  
    */
43  
    */
44  
    to_eof
44  
    to_eof
45  
};
45  
};
46  

46  

47  
/** Standard content-codings for HTTP message bodies.
47  
/** Standard content-codings for HTTP message bodies.
48  
*/
48  
*/
49  
enum class content_coding
49  
enum class content_coding
50  
{
50  
{
51  
    unknown,
51  
    unknown,
52  
    br,
52  
    br,
53  
    compress,
53  
    compress,
54  
    dcb,
54  
    dcb,
55  
    dcz,
55  
    dcz,
56  
    deflate,
56  
    deflate,
57  
    gzip,
57  
    gzip,
58  
    identity,
58  
    identity,
59  
    zstd,
59  
    zstd,
60  
};
60  
};
61  

61  

62  
/** Metadata about a request or response.
62  
/** Metadata about a request or response.
63  
*/
63  
*/
64  
struct metadata
64  
struct metadata
65  
{
65  
{
66  
    /** Metadata for the Connection field.
66  
    /** Metadata for the Connection field.
67  
    */
67  
    */
68  
    struct connection_t
68  
    struct connection_t
69  
    {
69  
    {
70  
        /** Error status of Connection.
70  
        /** Error status of Connection.
71  
        */
71  
        */
72  
        system::error_code ec;
72  
        system::error_code ec;
73  

73  

74  
        /** The total number of fields.
74  
        /** The total number of fields.
75  
        */
75  
        */
76  
        std::size_t count = 0;
76  
        std::size_t count = 0;
77  

77  

78  
        /** true if a close token is present.
78  
        /** true if a close token is present.
79  
        */
79  
        */
80  
        bool close = false;
80  
        bool close = false;
81  

81  

82  
        /** true if a keep-alive token is present.
82  
        /** true if a keep-alive token is present.
83  
        */
83  
        */
84  
        bool keep_alive = false;
84  
        bool keep_alive = false;
85  

85  

86  
        /** true if an upgrade token is present.
86  
        /** true if an upgrade token is present.
87  
        */
87  
        */
88  
        bool upgrade = false;
88  
        bool upgrade = false;
89  

89  

90  
    #ifdef BOOST_HTTP_AGGREGATE_WORKAROUND
90  
    #ifdef BOOST_HTTP_AGGREGATE_WORKAROUND
91  
        constexpr
91  
        constexpr
92  
        connection_t() = default;
92  
        connection_t() = default;
93  

93  

94  
        constexpr
94  
        constexpr
95  
        connection_t(
95  
        connection_t(
96  
            system::error_code ec_,
96  
            system::error_code ec_,
97  
            std::size_t count_,
97  
            std::size_t count_,
98  
            bool close_,
98  
            bool close_,
99  
            bool keep_alive_,
99  
            bool keep_alive_,
100  
            bool upgrade_) noexcept
100  
            bool upgrade_) noexcept
101  
            : ec(ec_)
101  
            : ec(ec_)
102  
            , count(count_)
102  
            , count(count_)
103  
            , close(close_)
103  
            , close(close_)
104  
            , keep_alive(keep_alive_)
104  
            , keep_alive(keep_alive_)
105  
            , upgrade(upgrade_)
105  
            , upgrade(upgrade_)
106  
        {
106  
        {
107  
        }
107  
        }
108  
    #endif
108  
    #endif
109  
    };
109  
    };
110  

110  

111  
    //--------------------------------------------
111  
    //--------------------------------------------
112  

112  

113  
    /** Metadata for the Content-Encoding field.
113  
    /** Metadata for the Content-Encoding field.
114  
    */
114  
    */
115  
    struct content_encoding_t
115  
    struct content_encoding_t
116  
    {
116  
    {
117  
        /** Error status of Content-Encoding.
117  
        /** Error status of Content-Encoding.
118  
        */
118  
        */
119  
        system::error_code ec;
119  
        system::error_code ec;
120  

120  

121  
        /** The total number of fields.
121  
        /** The total number of fields.
122  
        */
122  
        */
123  
        std::size_t count = 0;
123  
        std::size_t count = 0;
124  

124  

125  
        /** The body encoding.
125  
        /** The body encoding.
126  
        */
126  
        */
127  
        content_coding coding =
127  
        content_coding coding =
128  
            content_coding::identity;
128  
            content_coding::identity;
129  

129  

130  
    #ifdef BOOST_HTTP_AGGREGATE_WORKAROUND
130  
    #ifdef BOOST_HTTP_AGGREGATE_WORKAROUND
131  
        constexpr
131  
        constexpr
132  
        content_encoding_t() = default;
132  
        content_encoding_t() = default;
133  

133  

134  
        constexpr
134  
        constexpr
135  
        content_encoding_t(
135  
        content_encoding_t(
136  
            system::error_code ec_,
136  
            system::error_code ec_,
137  
            std::size_t count_,
137  
            std::size_t count_,
138  
            content_coding coding_) noexcept
138  
            content_coding coding_) noexcept
139  
            : ec(ec_)
139  
            : ec(ec_)
140  
            , count(count_)
140  
            , count(count_)
141  
            , coding(coding_)
141  
            , coding(coding_)
142  
        {
142  
        {
143  
        }
143  
        }
144  
    #endif
144  
    #endif
145  
    };
145  
    };
146  

146  

147  
    //--------------------------------------------
147  
    //--------------------------------------------
148  

148  

149  
    /** Metadata for the Content-Length field.
149  
    /** Metadata for the Content-Length field.
150  
    */
150  
    */
151  
    struct content_length_t
151  
    struct content_length_t
152  
    {
152  
    {
153  
        /** Error status of Content-Length.
153  
        /** Error status of Content-Length.
154  
        */
154  
        */
155  
        system::error_code ec;
155  
        system::error_code ec;
156  

156  

157  
        /** The total number of fields.
157  
        /** The total number of fields.
158  
        */
158  
        */
159  
        std::size_t count = 0;
159  
        std::size_t count = 0;
160  

160  

161  
        /** The value as an integer.
161  
        /** The value as an integer.
162  

162  

163  
            This is only valid when ec does
163  
            This is only valid when ec does
164  
            not hold a failure, and when
164  
            not hold a failure, and when
165  
            count is greater than zero.
165  
            count is greater than zero.
166  
        */
166  
        */
167  
        std::uint64_t value = 0;
167  
        std::uint64_t value = 0;
168  

168  

169  
    #ifdef BOOST_HTTP_AGGREGATE_WORKAROUND
169  
    #ifdef BOOST_HTTP_AGGREGATE_WORKAROUND
170  
        constexpr
170  
        constexpr
171  
        content_length_t() = default;
171  
        content_length_t() = default;
172  

172  

173  
        constexpr
173  
        constexpr
174  
        content_length_t(
174  
        content_length_t(
175  
            system::error_code ec_,
175  
            system::error_code ec_,
176  
            std::size_t count_,
176  
            std::size_t count_,
177  
            std::uint64_t value_) noexcept
177  
            std::uint64_t value_) noexcept
178  
            : ec(ec_)
178  
            : ec(ec_)
179  
            , count(count_)
179  
            , count(count_)
180  
            , value(value_)
180  
            , value(value_)
181  
        {
181  
        {
182  
        }
182  
        }
183  
    #endif
183  
    #endif
184  
    };
184  
    };
185  

185  

186  
    //--------------------------------------------
186  
    //--------------------------------------------
187  

187  

188  
    /** Metadata for the Expect field.
188  
    /** Metadata for the Expect field.
189  
    */
189  
    */
190  
    struct expect_t
190  
    struct expect_t
191  
    {
191  
    {
192  
        /** Error status of Expect.
192  
        /** Error status of Expect.
193  
        */
193  
        */
194  
        system::error_code ec;
194  
        system::error_code ec;
195  

195  

196  
        /** The total number of fields.
196  
        /** The total number of fields.
197  
        */
197  
        */
198  
        std::size_t count = 0;
198  
        std::size_t count = 0;
199  

199  

200  
        /** True if Expect is 100-continue.
200  
        /** True if Expect is 100-continue.
201  
        */
201  
        */
202  
        bool is_100_continue = false;
202  
        bool is_100_continue = false;
203  

203  

204  
    #ifdef BOOST_HTTP_AGGREGATE_WORKAROUND
204  
    #ifdef BOOST_HTTP_AGGREGATE_WORKAROUND
205  
        constexpr
205  
        constexpr
206  
        expect_t() = default;
206  
        expect_t() = default;
207  

207  

208  
        constexpr
208  
        constexpr
209  
        expect_t(
209  
        expect_t(
210  
            system::error_code ec_,
210  
            system::error_code ec_,
211  
            std::size_t count_,
211  
            std::size_t count_,
212  
            bool is_100_continue_) noexcept
212  
            bool is_100_continue_) noexcept
213  
            : ec(ec_)
213  
            : ec(ec_)
214  
            , count(count_)
214  
            , count(count_)
215  
            , is_100_continue(is_100_continue_)
215  
            , is_100_continue(is_100_continue_)
216  
        {
216  
        {
217  
        }
217  
        }
218  
    #endif
218  
    #endif
219  
    };
219  
    };
220  

220  

221  
    //--------------------------------------------
221  
    //--------------------------------------------
222  

222  

223  
    /** Metadata for the Transfer-Encoding field.
223  
    /** Metadata for the Transfer-Encoding field.
224  
    */
224  
    */
225  
    struct transfer_encoding_t
225  
    struct transfer_encoding_t
226  
    {
226  
    {
227  
        /** Error status of Content-Length.
227  
        /** Error status of Content-Length.
228  
        */
228  
        */
229  
        system::error_code ec;
229  
        system::error_code ec;
230  

230  

231  
        /** The total number of fields.
231  
        /** The total number of fields.
232  
        */
232  
        */
233  
        std::size_t count = 0;
233  
        std::size_t count = 0;
234  

234  

235  
        /** True if valid and chunked is specified last.
235  
        /** True if valid and chunked is specified last.
236  
        */
236  
        */
237  
        bool is_chunked = false;
237  
        bool is_chunked = false;
238  

238  

239  
    #ifdef BOOST_HTTP_AGGREGATE_WORKAROUND
239  
    #ifdef BOOST_HTTP_AGGREGATE_WORKAROUND
240  
        constexpr
240  
        constexpr
241  
        transfer_encoding_t() = default;
241  
        transfer_encoding_t() = default;
242  

242  

243  
        constexpr
243  
        constexpr
244  
        transfer_encoding_t(
244  
        transfer_encoding_t(
245  
            system::error_code ec_,
245  
            system::error_code ec_,
246  
            std::size_t count_,
246  
            std::size_t count_,
247  
            bool is_chunked_) noexcept
247  
            bool is_chunked_) noexcept
248  
            : ec(ec_)
248  
            : ec(ec_)
249  
            , count(count_)
249  
            , count(count_)
250  
            , is_chunked(is_chunked_)
250  
            , is_chunked(is_chunked_)
251  
        {
251  
        {
252  
        }
252  
        }
253  
    #endif
253  
    #endif
254  
    };
254  
    };
255  

255  

256  
    //--------------------------------------------
256  
    //--------------------------------------------
257  

257  

258  
    /** Metadata for Upgrade field.
258  
    /** Metadata for Upgrade field.
259  
    */
259  
    */
260  
    struct upgrade_t
260  
    struct upgrade_t
261  
    {
261  
    {
262  
        /** Error status of Upgrade.
262  
        /** Error status of Upgrade.
263  
        */
263  
        */
264  
        system::error_code ec;
264  
        system::error_code ec;
265  

265  

266  
        /** The total number of fields.
266  
        /** The total number of fields.
267  
        */
267  
        */
268  
        std::size_t count = 0;
268  
        std::size_t count = 0;
269  

269  

270  
        /** True if websocket appears at least once.
270  
        /** True if websocket appears at least once.
271  
        */
271  
        */
272  
        bool websocket = false;
272  
        bool websocket = false;
273  

273  

274  
    #ifdef BOOST_HTTP_AGGREGATE_WORKAROUND
274  
    #ifdef BOOST_HTTP_AGGREGATE_WORKAROUND
275  
        constexpr
275  
        constexpr
276  
        upgrade_t() = default;
276  
        upgrade_t() = default;
277  

277  

278  
        constexpr
278  
        constexpr
279  
        upgrade_t(
279  
        upgrade_t(
280  
            system::error_code ec_,
280  
            system::error_code ec_,
281  
            std::size_t count_,
281  
            std::size_t count_,
282  
            bool websocket_) noexcept
282  
            bool websocket_) noexcept
283  
            : ec(ec_)
283  
            : ec(ec_)
284  
            , count(count_)
284  
            , count(count_)
285  
            , websocket(websocket_)
285  
            , websocket(websocket_)
286  
        {
286  
        {
287  
        }
287  
        }
288  
    #endif
288  
    #endif
289  
    };
289  
    };
290  

290  

291  
    //--------------------------------------------
291  
    //--------------------------------------------
292  

292  

293  
    /** True if payload is manually specified.
293  
    /** True if payload is manually specified.
294  

294  

295  
        This flag is used to allow the caller
295  
        This flag is used to allow the caller
296  
        to resolve problems with non-compliant
296  
        to resolve problems with non-compliant
297  
        values for Content-Length.
297  
        values for Content-Length.
298  
    */
298  
    */
299  
    bool payload_override = false;
299  
    bool payload_override = false;
300  

300  

301  
    /** The type of payload.
301  
    /** The type of payload.
302  
    */
302  
    */
303  
    http::payload payload =
303  
    http::payload payload =
304  
        http::payload::none;
304  
        http::payload::none;
305  

305  

306  
    /** The size of the payload if known.
306  
    /** The size of the payload if known.
307  

307  

308  
        This is only valid when @ref payload
308  
        This is only valid when @ref payload
309  
        equals @ref http::payload::size.
309  
        equals @ref http::payload::size.
310  
    */
310  
    */
311  
    std::uint64_t payload_size = 0;
311  
    std::uint64_t payload_size = 0;
312  

312  

313  
    //--------------------------------------------
313  
    //--------------------------------------------
314  

314  

315  
    // header metadata
315  
    // header metadata
316  

316  

317  
    /** Metadata for the Connection field.
317  
    /** Metadata for the Connection field.
318  
    */
318  
    */
319  
    connection_t connection;
319  
    connection_t connection;
320  

320  

321  
    /** Metadata for the Content-Encoding field.
321  
    /** Metadata for the Content-Encoding field.
322  
    */
322  
    */
323  
    content_encoding_t content_encoding;
323  
    content_encoding_t content_encoding;
324  

324  

325  
    /** Metadata for the Content-Length field.
325  
    /** Metadata for the Content-Length field.
326  
    */
326  
    */
327  
    content_length_t content_length;
327  
    content_length_t content_length;
328  

328  

329  
    /** Metadata for the Expect field.
329  
    /** Metadata for the Expect field.
330  
    */
330  
    */
331  
    expect_t expect;
331  
    expect_t expect;
332  

332  

333  
    /** Metadata for the Transfer-Encoding field.
333  
    /** Metadata for the Transfer-Encoding field.
334  
    */
334  
    */
335  
    transfer_encoding_t transfer_encoding;
335  
    transfer_encoding_t transfer_encoding;
336  

336  

337  
    /** Metadata for the Upgrade field.
337  
    /** Metadata for the Upgrade field.
338  
    */
338  
    */
339  
    upgrade_t upgrade;
339  
    upgrade_t upgrade;
340  

340  

341  
    //--------------------------------------------
341  
    //--------------------------------------------
342  

342  

343  
    /** Constructor.
343  
    /** Constructor.
344  
    */
344  
    */
345  
    constexpr metadata() = default;
345  
    constexpr metadata() = default;
346  
};
346  
};
347  

347  

348  
} // http
348  
} // http
349  
} // boost
349  
} // boost
350  

350  

351  
#endif
351  
#endif