SSX3LobbyServer/lib/http/request.hpp

69 lines
1.6 KiB
C++
Raw Permalink Normal View History

#pragma once
// This header needs to be included before beast headers
// because of a bit of a bug. I hope 1.84 solves this
//clang-format off
#include <cstdint>
//clang-format on
#include <boost/beast/http/message.hpp>
#include <boost/beast/http/string_body.hpp>
#include <boost/url/url_view.hpp>
#include <http/r3_helpers.hpp>
#include <r3.hpp>
#include <base/assert.hpp>
#include <base/types.hpp>
#include <unordered_map>
namespace base::http {
struct Request {
using BeastRequest = beast::http::request<beast::http::string_body>;
Request(BeastRequest& request, burl::url_view url, r3::MatchEntry& me) : req(request), url(url) {
BASE_ASSERT(me.get() != nullptr, "Request constructor requires a valid match entry..");
// convert data from r3 into something with brain cells
auto& data = me.get()->vars;
for(u32 i = 0; i < data.tokens.size; ++i) {
auto& siov = data.slugs.entries[i];
auto& eiov = data.tokens.entries[i];
matches[R3IovecString(siov)] = R3IovecString(eiov);
}
// convert boost.URL params
for(auto kv : url.params()) {
if(kv.key.empty())
continue;
if(kv.has_value) {
query[kv.key] = kv.value;
} else {
query[kv.key] = "";
}
}
}
BeastRequest& Native() { return req; }
const auto& Matches() const { return matches; }
const std::string& Get(const std::string& key) const { return matches.at(key); }
asio::ip::address src;
std::unordered_map<std::string, std::string> matches;
// Query string parameters
std::unordered_map<std::string, std::string> query;
private:
friend struct Server;
BeastRequest req;
burl::url_view url;
};
} // namespace base::http