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