this repo has no description
1#pragma once
2// Standard Library Includes
3#include <cstdint>
4#include <expected>
5#include <span>
6#include <string>
7#include <utility>
8#include <vector>
9// Third-Party Library Includes
10#include <llhttp.h>
11
12struct HttpRequest
13{
14 std::string method;
15 std::string url;
16 uint8_t http_major = 0;
17 uint8_t http_minor = 0;
18 std::vector<std::pair<std::string, std::string>> headers;
19 std::vector<std::byte> body;
20};
21
22using RequestList = std::vector<HttpRequest>;
23
24class HttpRequestParser
25{
26 enum class State
27 {
28 Idle,
29 Parsing,
30 Completed,
31 Error
32 };
33
34 public:
35 HttpRequestParser();
36
37 bool in_error_state() const noexcept
38 {
39 return m_state == State::Error;
40 }
41
42 std::expected<void, std::string> parse(std::span<const std::byte> data);
43
44 size_t get_number_of_completed_requests() const noexcept
45 {
46 return m_completed_requests.size();
47 }
48
49 void get_completed_requests(RequestList &out_requests)
50 {
51 std::swap(out_requests, m_completed_requests);
52 m_completed_requests = {};
53 }
54
55 void reset();
56
57 private:
58 static HttpRequestParser &from_llhttp(llhttp_t *parser);
59 void commit_pending_header();
60
61 /*1*/ static int on_message_complete(llhttp_t *parser);
62 /*2*/ static int on_url(llhttp_t *parser, const char *ptr, size_t length);
63 /*3*/ static int on_method(llhttp_t *parser, const char *ptr, size_t length);
64 /*4*/ static int on_version(llhttp_t *parser, const char *ptr, size_t length);
65 /*5*/ static int on_header_field(llhttp_t *parser, const char *ptr, size_t length);
66 /*6*/ static int on_header_value(llhttp_t *parser, const char *ptr, size_t length);
67 /*7*/ static int on_body(llhttp_t *parser, const char *ptr, size_t length);
68
69 llhttp_t m_parser{};
70 llhttp_settings_t m_settings{};
71 State m_state{State::Idle};
72 RequestList m_completed_requests;
73 HttpRequest m_current_request;
74 std::string m_current_header_field;
75 std::string m_current_header_value;
76
77 enum class HeaderState
78 {
79 None,
80 Field,
81 Value
82 };
83 HeaderState m_header_state{HeaderState::None};
84};
85
86struct HttpResponse
87{
88 uint8_t http_major = 1;
89 uint8_t http_minor = 1;
90 uint16_t status_code;
91 std::string reason_phrase;
92 std::vector<std::pair<std::string, std::string>> headers;
93 std::vector<std::byte> body;
94
95 void serialize_into(std::vector<std::byte> &) const;
96};