LCOV - code coverage report
Current view: top level - src - response_base.cpp (source / functions) Coverage Total Hit Missed
Test: coverage_remapped.info Lines: 95.1 % 41 39 2
Test Date: 2026-06-13 19:44:58 Functions: 100.0 % 2 2

           TLA  Line data    Source code
       1                 : //
       2                 : // Copyright (c) 2025 Mohammad Nejati
       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
       8                 : //
       9                 : 
      10                 : #include <boost/http/response_base.hpp>
      11                 : 
      12                 : #include <cstring>
      13                 : 
      14                 : namespace boost {
      15                 : namespace http {
      16                 : 
      17                 : void
      18 HIT          26 : response_base::
      19                 : set_start_line_impl(
      20                 :     http::status sc,
      21                 :     unsigned short si,
      22                 :     core::string_view rs,
      23                 :     http::version v)
      24                 : {
      25                 :     // TODO: check validity
      26              26 :     auto const vs = to_string(v);
      27                 :     auto const new_prefix =
      28              26 :         vs.size() + 1 + // HTTP-version SP
      29              26 :         3 + 1 +         // status-code SP
      30              26 :         rs.size() + 2;  // reason-phrase CRLF
      31                 : 
      32                 :     // Introduce a new scope so that prefix_op's
      33                 :     // destructor runs before h_.on_start_line().
      34                 :     {
      35              26 :         auto op = prefix_op_t(*this, new_prefix, &rs);
      36              25 :         char* dest = h_.buf;
      37                 : 
      38              25 :         h_.version = v;
      39              25 :         vs.copy(dest, vs.size());
      40              25 :         dest += vs.size();
      41              25 :         *dest++ = ' ';
      42                 : 
      43              25 :         h_.res.status = sc;
      44              25 :         h_.res.status_int = si;
      45              25 :         dest[0] = '0' + ((h_.res.status_int / 100) % 10);
      46              25 :         dest[1] = '0' + ((h_.res.status_int /  10) % 10);
      47              25 :         dest[2] = '0' + ((h_.res.status_int /   1) % 10);
      48              25 :         dest[3] = ' ';
      49              25 :         dest += 4;
      50                 : 
      51              25 :         std::memmove(dest, rs.data(), rs.size());
      52              25 :         dest += rs.size();
      53              25 :         dest[0] = '\r';
      54              25 :         dest[1] = '\n';
      55              25 :     }
      56                 : 
      57              25 :     h_.on_start_line();
      58              25 : }
      59                 : 
      60                 : void
      61               3 : response_base::
      62                 : set_version(
      63                 :     http::version v)
      64                 : {
      65               3 :     if(v == h_.version)
      66               1 :         return;
      67               2 :     if(h_.is_default())
      68                 :     {
      69               1 :         auto def = h_.get_default(detail::kind::response);
      70 MIS           0 :         return set_start_line_impl(
      71 HIT           1 :             def->res.status, def->res.status_int,
      72                 :             core::string_view(
      73               2 :                 def->cbuf + 13, def->prefix - 15), v);
      74                 :     }
      75                 : 
      76                 :     // Introduce a new scope so that prefix_op's
      77                 :     // destructor runs before h_.on_start_line().
      78                 :     {
      79                 :         auto op = prefix_op_t(
      80               1 :             *this, h_.prefix, nullptr);
      81               1 :         char* dest = h_.buf;
      82               1 :         if(v == http::version::http_1_1)
      83               1 :             dest[7] = '1';
      84                 :         else
      85 MIS           0 :             dest[7] = '0';
      86 HIT           1 :         h_.version = v;
      87               1 :     }
      88                 : 
      89               1 :     h_.on_start_line();
      90                 : }
      91                 : 
      92                 : } // http
      93                 : } // boost
        

Generated by: LCOV version 2.3