LCOV - code coverage report
Current view: top level - src/server - http_worker.cpp (source / functions) Coverage Total Hit
Test: coverage_remapped.info Lines: 100.0 % 10 10
Test Date: 2026-06-13 19:44:58 Functions: 100.0 % 3 3

           TLA  Line data    Source code
       1                 : //
       2                 : // Copyright (c) 2026 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
       8                 : //
       9                 : 
      10                 : #include <boost/http/server/http_worker.hpp>
      11                 : #include <boost/http/error.hpp>
      12                 : #include <boost/url/parse.hpp>
      13                 : #include <iostream>
      14                 : 
      15                 : namespace boost {
      16                 : namespace http {
      17                 : 
      18                 : capy::task<void>
      19 HIT           1 : http_worker::
      20                 : do_http_session()
      21                 : {
      22                 :     struct guard
      23                 :     {
      24                 :         http_worker& self;
      25                 : 
      26               1 :         guard(http_worker& self_)
      27               1 :             : self(self_)
      28                 :         {
      29               1 :         }
      30                 : 
      31               1 :         ~guard()
      32                 :         {
      33               1 :             self.parser.reset();
      34               1 :             self.parser.start();
      35               1 :             self.rp.session_data.clear();
      36               1 :         }
      37                 :     };
      38                 : 
      39                 :     guard g(*this); // clear things when session ends
      40                 : 
      41                 :     // read request, send response loop
      42                 :     for(;;)
      43                 :     {
      44                 :         parser.reset();
      45                 :         parser.start();
      46                 :         rp.session_data.clear();
      47                 : 
      48                 :         // Read HTTP request header
      49                 :         auto [ec] = co_await parser.read_header(stream);
      50                 :         if(ec)
      51                 :         {
      52                 :             std::cerr << "read_header error: " << ec.message() << "\n";
      53                 :             break;
      54                 :         }
      55                 : 
      56                 :         // Process headers and dispatch
      57                 :         // Set up Request and Response objects
      58                 :         rp.req = parser.get();
      59                 :         rp.route_data.clear();
      60                 :         rp.res.set_start_line(
      61                 :             http::status::ok, rp.req.version());
      62                 :         rp.res.set_keep_alive(rp.req.keep_alive());
      63                 :         serializer.reset();
      64                 : 
      65                 :         // Parse the URL
      66                 :         {
      67                 :             auto rv = urls::parse_uri_reference(rp.req.target());
      68                 :             if(rv.has_error())
      69                 :             {
      70                 :                 rp.status(http::status::bad_request);
      71                 :             }
      72                 :             rp.url = rv.value();
      73                 :         }
      74                 : 
      75                 :         {
      76                 :             auto rv = co_await fr.dispatch(rp.req.method(), rp.url, rp);
      77                 :             if(rv.failed())
      78                 :             {
      79                 :                 // VFALCO log rv.error()
      80                 :                 break;
      81                 :             }
      82                 : 
      83                 :             if(! rp.res.keep_alive())
      84                 :                 break;
      85                 :         }
      86                 :     }
      87               2 : }
      88                 : 
      89                 : } // http
      90                 : } // boost
        

Generated by: LCOV version 2.3