| #pragma once | |
| #ifdef BMCWEB_ENABLE_GRPC | |
| #include "absl/log/log.h" | |
| #endif | |
| #include <memory> | |
| #include <string> | |
| #include <string_view> | |
| #include <system_error> // NOLINT | |
| #include <unordered_set> | |
| #include "boost/asio/io_context.hpp" // NOLINT | |
| #include "boost/asio/ip/address.hpp" // NOLINT | |
| #include "boost/beast/http/message.hpp" // NOLINT | |
| #include "boost/beast/http/string_body.hpp" // NOLINT | |
| #include "boost/beast/websocket.hpp" // NOLINT | |
| #include "boost/url/url.hpp" // NOLINT | |
| #include "common.hpp" // NOLINT(misc-include-cleaner) | |
| #include "sessions.hpp" | |
| namespace crow { | |
| struct Request { | |
| boost::beast::http::request<boost::beast::http::string_body> req; | |
| private: | |
| boost::urls::url urlBase; // NOLINT | |
| public: | |
| bool isSecure{false}; // NOLINT | |
| boost::asio::io_context* ioService{}; // NOLINT | |
| boost::asio::ip::address ipAddress; // NOLINT | |
| std::shared_ptr<persistent_data::UserSession> session; | |
| bool isSubscriptionRequest = false; // NOLINT | |
| // Dynamic fine grained authorization | |
| bool fromGrpc = false; // NOLINT | |
| bool with_trust_bundle = false; | |
| bool peer_authenticated = false; | |
| std::unordered_set<std::string> peer_privileges; | |
| std::string userRole; // NOLINT | |
| Request(boost::beast::http::request<boost::beast::http::string_body> reqIn, | |
| std::error_code& ec); | |
| Request(std::string_view bodyIn, std::error_code& ec); | |
| Request() = default; | |
| Request(const Request& other) = default; | |
| Request(Request&& other) = default; | |
| Request& operator=(const Request&) = delete; | |
| Request& operator=(const Request&&) = delete; | |
| ~Request() = default; | |
| boost::beast::http::verb method() const { return req.method(); } | |
| boost::beast::http::request<boost::beast::http::string_body> request() const { | |
| return req; | |
| } | |
| std::string_view getHeaderValue(std::string_view key) const { | |
| return req[key]; | |
| } | |
| std::string_view getHeaderValue(boost::beast::http::field key) const { | |
| return req[key]; | |
| } | |
| std::string_view methodString() const { return req.method_string(); } | |
| std::string_view target() const { return req.target(); } | |
| boost::urls::url& mutableUrl() { return urlBase; } | |
| boost::urls::url_view url() const { return {urlBase}; } | |
| const boost::beast::http::fields& fields() const { return req.base(); } | |
| const std::string& body() const { return req.body(); } | |
| bool target(std::string_view target) { | |
| req.target(target); | |
| return setUrlInfo(); | |
| } | |
| void set_method(boost::beast::http::verb method) { req.method(method); } | |
| unsigned version() const { return req.version(); } | |
| bool isUpgrade() const { return boost::beast::websocket::is_upgrade(req); } | |
| bool keepAlive() const { return req.keep_alive(); } | |
| private: | |
| bool setUrlInfo(); | |
| }; | |
| } // namespace crow |