blob: 3fd9d4d753d841da10e0f2148a917a47240f6ff0 [file] [log] [blame]
Ed Tanous7045c8d2017-04-03 10:04:37 -07001#pragma once
2
Ed Tanous04e438c2020-10-03 08:06:26 -07003#include "common.hpp"
Ratan Gupta6f359562019-04-03 10:39:08 +05304#include "sessions.hpp"
5
Ed Tanous8f626352018-12-19 14:51:54 -08006#include <boost/asio/io_context.hpp>
Sunitha Harishc0ea7ae2020-10-30 02:37:30 -05007#include <boost/asio/ip/address.hpp>
Ed Tanousd43cd0c2020-09-30 20:46:53 -07008#include <boost/beast/http/message.hpp>
9#include <boost/beast/http/string_body.hpp>
Manojkiran Eda44250442020-06-16 12:51:38 +053010#include <boost/beast/websocket.hpp>
Ed Tanous39662a32023-02-06 15:09:46 -080011#include <boost/url/url.hpp>
raviteja-b4722efe2020-02-03 12:23:18 -060012
Ed Tanous8a9a25c2021-05-11 14:50:58 -070013#include <string>
14#include <string_view>
Ed Tanousf79b7a52021-09-22 19:04:29 -070015#include <system_error>
Ed Tanous8a9a25c2021-05-11 14:50:58 -070016
Ed Tanous1abe55e2018-09-05 08:30:59 -070017namespace crow
18{
Ed Tanous7045c8d2017-04-03 10:04:37 -070019
Ed Tanous1abe55e2018-09-05 08:30:59 -070020struct Request
21{
John Edward Broadbent59b98b22021-07-13 15:36:32 -070022 boost::beast::http::request<boost::beast::http::string_body> req;
Ed Tanous50b8a432022-02-03 16:29:50 -080023
Ed Tanous39662a32023-02-06 15:09:46 -080024 private:
25 boost::urls::url urlBase{};
26
27 public:
Ed Tanous1abe55e2018-09-05 08:30:59 -070028 bool isSecure{false};
Ed Tanous7045c8d2017-04-03 10:04:37 -070029
Ed Tanous8f626352018-12-19 14:51:54 -080030 boost::asio::io_context* ioService{};
Sunitha Harishc0ea7ae2020-10-30 02:37:30 -050031 boost::asio::ip::address ipAddress{};
Ed Tanous7045c8d2017-04-03 10:04:37 -070032
Ed Tanous52cc1122020-07-18 13:51:21 -070033 std::shared_ptr<persistent_data::UserSession> session;
Ratan Gupta6f359562019-04-03 10:39:08 +053034
RAJESWARAN THILLAIGOVINDAN61dbeef2019-12-13 04:26:54 -060035 std::string userRole{};
Ed Tanousf79b7a52021-09-22 19:04:29 -070036 Request(boost::beast::http::request<boost::beast::http::string_body> reqIn,
37 std::error_code& ec) :
Ed Tanous33c6b582023-02-14 15:05:48 -080038 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)
Ed Tanousf79b7a52021-09-22 19:04:29 -070047 {
48 if (!setUrlInfo())
49 {
50 ec = std::make_error_code(std::errc::invalid_argument);
51 }
52 }
Ed Tanous7045c8d2017-04-03 10:04:37 -070053
Ed Tanous39662a32023-02-06 15:09:46 -080054 Request(const Request& other) = default;
55 Request(Request&& other) = default;
Ed Tanous2d6cb562022-07-07 20:44:54 -070056
Ed Tanous597d2b12021-09-16 15:07:53 -070057 Request& operator=(const Request&) = delete;
Ed Tanousecd6a3a2022-01-07 09:18:40 -080058 Request& operator=(const Request&&) = delete;
59 ~Request() = default;
Ed Tanous597d2b12021-09-16 15:07:53 -070060
Ed Tanous271584a2019-07-09 16:24:22 -070061 boost::beast::http::verb method() const
Ed Tanous1abe55e2018-09-05 08:30:59 -070062 {
63 return req.method();
64 }
Ed Tanous7045c8d2017-04-03 10:04:37 -070065
Ed Tanous3174e4d2020-10-07 11:41:22 -070066 std::string_view getHeaderValue(std::string_view key) const
Ed Tanous1abe55e2018-09-05 08:30:59 -070067 {
68 return req[key];
69 }
Ed Tanous7045c8d2017-04-03 10:04:37 -070070
Ed Tanous3174e4d2020-10-07 11:41:22 -070071 std::string_view getHeaderValue(boost::beast::http::field key) const
Ed Tanous1abe55e2018-09-05 08:30:59 -070072 {
73 return req[key];
74 }
Ed Tanouse0d918b2018-03-27 17:41:04 -070075
Ed Tanous3174e4d2020-10-07 11:41:22 -070076 std::string_view methodString() const
Ed Tanous1abe55e2018-09-05 08:30:59 -070077 {
78 return req.method_string();
79 }
Ed Tanouse0d918b2018-03-27 17:41:04 -070080
Ed Tanous3174e4d2020-10-07 11:41:22 -070081 std::string_view target() const
Ed Tanous1abe55e2018-09-05 08:30:59 -070082 {
83 return req.target();
84 }
Ed Tanouse0d918b2018-03-27 17:41:04 -070085
Ed Tanous39662a32023-02-06 15:09:46 -080086 boost::urls::url_view url() const
87 {
88 return {urlBase};
89 }
90
Ed Tanous98fe7402023-02-14 14:50:33 -080091 const boost::beast::http::fields& fields() const
92 {
93 return req.base();
94 }
95
Ed Tanous33c6b582023-02-14 15:05:48 -080096 const std::string& body() const
97 {
98 return req.body();
99 }
100
Ed Tanous26ccae32023-02-16 10:28:44 -0800101 bool target(std::string_view target)
Ed Tanousf79b7a52021-09-22 19:04:29 -0700102 {
103 req.target(target);
104 return setUrlInfo();
105 }
106
Ed Tanous3174e4d2020-10-07 11:41:22 -0700107 unsigned version() const
Ed Tanous1abe55e2018-09-05 08:30:59 -0700108 {
109 return req.version();
110 }
Ed Tanouse0d918b2018-03-27 17:41:04 -0700111
Ed Tanous3174e4d2020-10-07 11:41:22 -0700112 bool isUpgrade() const
Ed Tanous1abe55e2018-09-05 08:30:59 -0700113 {
114 return boost::beast::websocket::is_upgrade(req);
115 }
Ed Tanouse0d918b2018-03-27 17:41:04 -0700116
Ed Tanous3174e4d2020-10-07 11:41:22 -0700117 bool keepAlive() const
Ed Tanous1abe55e2018-09-05 08:30:59 -0700118 {
119 return req.keep_alive();
120 }
Ed Tanousf79b7a52021-09-22 19:04:29 -0700121
122 private:
Ed Tanous67df0732021-10-26 11:23:56 -0700123 bool setUrlInfo()
124 {
Ed Tanous079360a2022-06-29 10:05:19 -0700125 auto result = boost::urls::parse_relative_ref(target());
Ed Tanous67df0732021-10-26 11:23:56 -0700126
127 if (!result)
128 {
129 return false;
130 }
Ed Tanous39662a32023-02-06 15:09:46 -0800131 urlBase = *result;
Ed Tanous67df0732021-10-26 11:23:56 -0700132 return true;
133 }
Ed Tanous7045c8d2017-04-03 10:04:37 -0700134};
Ed Tanouse0d918b2018-03-27 17:41:04 -0700135
Ed Tanous1abe55e2018-09-05 08:30:59 -0700136} // namespace crow