LCOV - code coverage report
Current view: top level - boost/http_proto/metadata.hpp (source / functions) Coverage Total Hit
Test: coverage_filtered.info Lines: 100.0 % 34 34
Test Date: 2024-05-23 18:56:44 Functions: 100.0 % 11 11

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

Generated by: LCOV version 2.1