this repo has no description
at main 96 lines 2.4 kB view raw
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};