src/server/http_worker.cpp

100.0% Lines (10/10) 100.0% Functions (3/3)
src/server/http_worker.cpp
Line TLA Hits Source Code
1 //
2 // Copyright (c) 2026 Vinnie Falco ([email protected])
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 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
91