1 #pragma once 2 3 #include "common.hpp" 4 #include "http_body.hpp" 5 #include "sessions.hpp" 6 7 #include <boost/asio/io_context.hpp> 8 #include <boost/asio/ip/address.hpp> 9 #include <boost/beast/http/message.hpp> 10 #include <boost/beast/websocket.hpp> 11 #include <boost/url/url.hpp> 12 13 #include <string> 14 #include <string_view> 15 #include <system_error> 16 17 namespace crow 18 { 19 20 struct Request 21 { 22 boost::beast::http::request<bmcweb::HttpBody> req; 23 24 private: 25 boost::urls::url urlBase; 26 27 public: 28 bool isSecure{false}; 29 30 boost::asio::io_context* ioService = nullptr; 31 boost::asio::ip::address ipAddress; 32 33 std::shared_ptr<persistent_data::UserSession> session; 34 35 std::string userRole; 36 Request(boost::beast::http::request<bmcweb::HttpBody> reqIn, 37 std::error_code& ec) : 38 req(std::move(reqIn)) 39 { 40 if (!setUrlInfo()) 41 { 42 ec = std::make_error_code(std::errc::invalid_argument); 43 } 44 } 45 46 Request(std::string_view bodyIn, std::error_code& /*ec*/) : req({}, bodyIn) 47 {} 48 49 Request() = default; 50 51 Request(const Request& other) = default; 52 Request(Request&& other) = default; 53 54 Request& operator=(const Request&) = default; 55 Request& operator=(Request&&) = default; 56 ~Request() = default; 57 58 void addHeader(std::string_view key, std::string_view value) 59 { 60 req.insert(key, value); 61 } 62 63 void addHeader(boost::beast::http::field key, std::string_view value) 64 { 65 req.insert(key, value); 66 } 67 68 void clear() 69 { 70 req.clear(); 71 urlBase.clear(); 72 isSecure = false; 73 ioService = nullptr; 74 ipAddress = boost::asio::ip::address(); 75 session = nullptr; 76 userRole = ""; 77 } 78 79 boost::beast::http::verb method() const 80 { 81 return req.method(); 82 } 83 84 std::string_view getHeaderValue(std::string_view key) const 85 { 86 return req[key]; 87 } 88 89 std::string_view getHeaderValue(boost::beast::http::field key) const 90 { 91 return req[key]; 92 } 93 94 std::string_view methodString() const 95 { 96 return req.method_string(); 97 } 98 99 std::string_view target() const 100 { 101 return req.target(); 102 } 103 104 boost::urls::url_view url() const 105 { 106 return {urlBase}; 107 } 108 109 const boost::beast::http::fields& fields() const 110 { 111 return req.base(); 112 } 113 114 const std::string& body() const 115 { 116 return req.body().str(); 117 } 118 119 bool target(std::string_view target) 120 { 121 req.target(target); 122 return setUrlInfo(); 123 } 124 125 unsigned version() const 126 { 127 return req.version(); 128 } 129 130 bool isUpgrade() const 131 { 132 return boost::beast::websocket::is_upgrade(req); 133 } 134 135 bool keepAlive() const 136 { 137 return req.keep_alive(); 138 } 139 140 private: 141 bool setUrlInfo() 142 { 143 auto result = boost::urls::parse_relative_ref(target()); 144 145 if (!result) 146 { 147 return false; 148 } 149 urlBase = *result; 150 return true; 151 } 152 }; 153 154 } // namespace crow 155