blob: 9b53e9d8c00f263673078f7673fab4120b68ba91 [file] [log] [blame]
#pragma once
#ifdef BMCWEB_ENABLE_GRPC
#include "absl/log/log.h"
#include "bmcweb_authorizer_singleton.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