Skip to content

Commit

Permalink
Backport HttpRequest concept
Browse files Browse the repository at this point in the history
  • Loading branch information
gpicciuca committed Feb 13, 2025
1 parent fc9da59 commit 9a393fd
Show file tree
Hide file tree
Showing 7 changed files with 171 additions and 123 deletions.
16 changes: 9 additions & 7 deletions src/engine/GraphStoreProtocol.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,9 @@ class UnsupportedMediatypeError : public std::runtime_error {
class GraphStoreProtocol {
private:
// Extract the mediatype from a request.
static ad_utility::MediaType extractMediatype(
const ad_utility::httpUtils::HttpRequest auto& rawRequest) {
CPP_template_2(typename RequestT)(requires ad_utility::httpUtils::HttpRequest<
RequestT>) static ad_utility::MediaType
extractMediatype(const RequestT& rawRequest) {
using namespace boost::beast::http;

std::string_view contentTypeString;
Expand Down Expand Up @@ -76,9 +77,9 @@ class GraphStoreProtocol {

// Transform a SPARQL Graph Store Protocol POST to an equivalent ParsedQuery
// which is an SPARQL Update.
static ParsedQuery transformPost(
const ad_utility::httpUtils::HttpRequest auto& rawRequest,
const GraphOrDefault& graph) {
CPP_template_2(typename RequestT)(
requires ad_utility::httpUtils::HttpRequest<RequestT>) static ParsedQuery
transformPost(const RequestT& rawRequest, const GraphOrDefault& graph) {
auto triples =
parseTriples(rawRequest.body(), extractMediatype(rawRequest));
auto convertedTriples = convertTriples(graph, std::move(triples));
Expand All @@ -98,8 +99,9 @@ class GraphStoreProtocol {
// Every Graph Store Protocol request has equivalent SPARQL Query or Update.
// Transform the Graph Store Protocol request into it's equivalent Query or
// Update.
static ParsedQuery transformGraphStoreProtocol(
const ad_utility::httpUtils::HttpRequest auto& rawRequest) {
CPP_template_2(typename RequestT)(
requires ad_utility::httpUtils::HttpRequest<RequestT>) static ParsedQuery
transformGraphStoreProtocol(const RequestT& rawRequest) {
ad_utility::url_parser::ParsedUrl parsedUrl =
ad_utility::url_parser::parseRequestTarget(rawRequest.target());
// We only support passing the target graph as a query parameter (`Indirect
Expand Down
14 changes: 9 additions & 5 deletions src/engine/SPARQLProtocol.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,10 @@ class SPARQLProtocol {
public:
/// Parse the path and URL parameters from the given request. Supports both
/// GET and POST request according to the SPARQL 1.1 standard.
static ad_utility::url_parser::ParsedRequest parseHttpRequest(
const ad_utility::httpUtils::HttpRequest auto& request) {
CPP_template_2(typename RequestT)(
requires ad_utility::httpUtils::HttpRequest<
RequestT>) static ad_utility::url_parser::ParsedRequest
parseHttpRequest(const RequestT& request) {
using namespace ad_utility::url_parser::sparqlOperation;
using namespace ad_utility::use_type_identity;
namespace http = boost::beast::http;
Expand Down Expand Up @@ -174,9 +176,11 @@ class SPARQLProtocol {
};

private:
static std::optional<std::string> extractAccessToken(
const ad_utility::httpUtils::HttpRequest auto& request,
const ad_utility::url_parser::ParamValueMap& params) {
CPP_template_2(typename RequestT)(
requires ad_utility::httpUtils::HttpRequest<RequestT>) static std::
optional<std::string> extractAccessToken(
const RequestT& request,
const ad_utility::url_parser::ParamValueMap& params) {
namespace http = boost::beast::http;
std::optional<std::string> tokenFromAuthorizationHeader;
std::optional<std::string> tokenFromParameter;
Expand Down
98 changes: 56 additions & 42 deletions src/engine/Server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -172,10 +172,12 @@ void Server::run(const string& indexBaseName, bool useText, bool usePatterns,
}

// _____________________________________________________________________________
net::awaitable<std::optional<Server::TimeLimit>>
Server::verifyUserSubmittedQueryTimeout(
std::optional<std::string_view> userTimeout, bool accessTokenOk,
const ad_utility::httpUtils::HttpRequest auto& request, auto& send) const {
CPP_template_2(typename RequestT, typename ResponseT)(
requires ad_utility::httpUtils::HttpRequest<RequestT>)
net::awaitable<std::optional<Server::TimeLimit>> Server::
verifyUserSubmittedQueryTimeout(
std::optional<std::string_view> userTimeout, bool accessTokenOk,
const RequestT& request, ResponseT& send) const {

Check warning on line 180 in src/engine/Server.cpp

View check run for this annotation

Codecov / codecov/patch

src/engine/Server.cpp#L180

Added line #L180 was not covered by tests
auto defaultTimeout = RuntimeParameters().get<"default-query-timeout">();
// TODO<GCC12> Use the monadic operations for std::optional
if (userTimeout.has_value()) {
Expand Down Expand Up @@ -213,8 +215,9 @@ class QueryAlreadyInUseError : public std::runtime_error {
};

// _____________________________________________________________________________
Awaitable<void> Server::process(
const ad_utility::httpUtils::HttpRequest auto& request, auto&& send) {
CPP_template_2(typename RequestT, typename ResponseT)(
requires ad_utility::httpUtils::HttpRequest<RequestT>)
Awaitable<void> Server::process(const RequestT& request, ResponseT&& send) {

Check warning on line 220 in src/engine/Server.cpp

View check run for this annotation

Codecov / codecov/patch

src/engine/Server.cpp#L220

Added line #L220 was not covered by tests
using namespace ad_utility::httpUtils;

// Log some basic information about the request. Start with an empty line so
Expand Down Expand Up @@ -485,10 +488,11 @@ auto Server::setupCancellationHandle(
}

// ____________________________________________________________________________
template <QL_CONCEPT_OR_TYPENAME(QueryOrUpdate) Operation>
auto Server::parseOperation(ad_utility::websocket::MessageSender& messageSender,
const ad_utility::url_parser::ParamValueMap& params,
const Operation& operation, TimeLimit timeLimit) {
CPP_template_2(typename Operation)(
requires QueryOrUpdate<Operation>) auto Server::
parseOperation(ad_utility::websocket::MessageSender& messageSender,
const ad_utility::url_parser::ParamValueMap& params,
const Operation& operation, TimeLimit timeLimit) {

Check warning on line 495 in src/engine/Server.cpp

View check run for this annotation

Codecov / codecov/patch

src/engine/Server.cpp#L495

Added line #L495 was not covered by tests
// The operation string was to be copied, do it here at the beginning.
const auto [operationName, operationSPARQL] =
[&operation]() -> std::pair<std::string_view, std::string> {
Expand Down Expand Up @@ -630,9 +634,10 @@ nlohmann::json Server::composeCacheStatsJson() const {
}

// _____________________________________________
ad_utility::websocket::OwningQueryId Server::getQueryId(
const ad_utility::httpUtils::HttpRequest auto& request,
std::string_view query) {
CPP_template_2(typename RequestT)(
requires ad_utility::httpUtils::HttpRequest<RequestT>)
ad_utility::websocket::OwningQueryId Server::getQueryId(
const RequestT& request, std::string_view query) {
using ad_utility::websocket::OwningQueryId;
std::string_view queryIdHeader = request.base()["Query-Id"];
if (queryIdHeader.empty()) {
Expand All @@ -647,11 +652,13 @@ ad_utility::websocket::OwningQueryId Server::getQueryId(
}

// _____________________________________________________________________________
Awaitable<void> Server::sendStreamableResponse(
const ad_utility::httpUtils::HttpRequest auto& request, auto& send,
MediaType mediaType, const PlannedQuery& plannedQuery,
const QueryExecutionTree& qet, const ad_utility::Timer& requestTimer,
SharedCancellationHandle cancellationHandle) const {
CPP_template_2(typename RequestT, typename ResponseT)(
requires ad_utility::httpUtils::HttpRequest<RequestT>)
Awaitable<void> Server::sendStreamableResponse(
const RequestT& request, ResponseT& send, MediaType mediaType,
const PlannedQuery& plannedQuery, const QueryExecutionTree& qet,
const ad_utility::Timer& requestTimer,
SharedCancellationHandle cancellationHandle) const {

Check warning on line 661 in src/engine/Server.cpp

View check run for this annotation

Codecov / codecov/patch

src/engine/Server.cpp#L661

Added line #L661 was not covered by tests
auto responseGenerator = ExportQueryExecutionTrees::computeResult(
plannedQuery.parsedQuery_, qet, mediaType, requestTimer,
std::move(cancellationHandle));
Expand Down Expand Up @@ -689,9 +696,11 @@ Awaitable<void> Server::sendStreamableResponse(
}

// ____________________________________________________________________________
MediaType Server::determineMediaType(
const ad_utility::url_parser::ParamValueMap& params,
const ad_utility::httpUtils::HttpRequest auto& request) {
CPP_template_2(typename RequestT)(
requires ad_utility::httpUtils::HttpRequest<RequestT>)
MediaType Server::determineMediaType(
const ad_utility::url_parser::ParamValueMap& params,
const RequestT& request) {
using namespace ad_utility::url_parser;
// The following code block determines the media type to be used for the
// result. The media type is either determined by the "Accept:" header of
Expand Down Expand Up @@ -726,10 +735,11 @@ MediaType Server::determineMediaType(
}

// ____________________________________________________________________________
ad_utility::websocket::MessageSender Server::createMessageSender(
const std::weak_ptr<ad_utility::websocket::QueryHub>& queryHub,
const ad_utility::httpUtils::HttpRequest auto& request,
const string& operation) {
CPP_template_2(typename RequestT)(
requires ad_utility::httpUtils::HttpRequest<RequestT>)
ad_utility::websocket::MessageSender Server::createMessageSender(
const std::weak_ptr<ad_utility::websocket::QueryHub>& queryHub,
const RequestT& request, const string& operation) {
auto queryHubLock = queryHub.lock();
AD_CORRECTNESS_CHECK(queryHubLock);
ad_utility::websocket::MessageSender messageSender{
Expand All @@ -738,13 +748,14 @@ ad_utility::websocket::MessageSender Server::createMessageSender(
}

// ____________________________________________________________________________
Awaitable<void> Server::processQuery(
const ad_utility::url_parser::ParamValueMap& params, ParsedQuery&& query,
const ad_utility::Timer& requestTimer,
ad_utility::SharedCancellationHandle cancellationHandle,
QueryExecutionContext& qec,
const ad_utility::httpUtils::HttpRequest auto& request, auto&& send,
TimeLimit timeLimit) {
CPP_template_2(typename RequestT, typename ResponseT)(
requires ad_utility::httpUtils::HttpRequest<RequestT>)
Awaitable<void> Server::processQuery(
const ad_utility::url_parser::ParamValueMap& params,
ParsedQuery&& query, const ad_utility::Timer& requestTimer,
ad_utility::SharedCancellationHandle cancellationHandle,
QueryExecutionContext& qec, const RequestT& request, ResponseT&& send,
TimeLimit timeLimit) {

Check warning on line 758 in src/engine/Server.cpp

View check run for this annotation

Codecov / codecov/patch

src/engine/Server.cpp#L758

Added line #L758 was not covered by tests
AD_CORRECTNESS_CHECK(!query.hasUpdateClause());

MediaType mediaType = determineMediaType(params, request);
Expand Down Expand Up @@ -889,12 +900,13 @@ json Server::processUpdateImpl(
}

// ____________________________________________________________________________
Awaitable<void> Server::processUpdate(
ParsedQuery&& update, const ad_utility::Timer& requestTimer,
ad_utility::SharedCancellationHandle cancellationHandle,
QueryExecutionContext& qec,
const ad_utility::httpUtils::HttpRequest auto& request, auto&& send,
TimeLimit timeLimit) {
CPP_template_2(typename RequestT, typename ResponseT)(
requires ad_utility::httpUtils::HttpRequest<RequestT>)
Awaitable<void> Server::processUpdate(
ParsedQuery&& update, const ad_utility::Timer& requestTimer,
ad_utility::SharedCancellationHandle cancellationHandle,
QueryExecutionContext& qec, const RequestT& request, ResponseT&& send,
TimeLimit timeLimit) {

Check warning on line 909 in src/engine/Server.cpp

View check run for this annotation

Codecov / codecov/patch

src/engine/Server.cpp#L909

Added line #L909 was not covered by tests
AD_CORRECTNESS_CHECK(update.hasUpdateClause());
PlannedQuery plannedQuery =
co_await planQuery(updateThreadPool_, std::move(update), requestTimer,
Expand Down Expand Up @@ -923,10 +935,12 @@ Awaitable<void> Server::processUpdate(
}

// ____________________________________________________________________________
Awaitable<void> Server::processOperation(
ad_utility::url_parser::sparqlOperation::Operation operation, auto visitor,
const ad_utility::Timer& requestTimer,
const ad_utility::httpUtils::HttpRequest auto& request, auto& send) {
CPP_template_2(typename VisitorT, typename RequestT, typename ResponseT)(
requires ad_utility::httpUtils::HttpRequest<RequestT>)
Awaitable<void> Server::processOperation(
ad_utility::url_parser::sparqlOperation::Operation operation,
VisitorT visitor, const ad_utility::Timer& requestTimer,
const RequestT& request, ResponseT& send) {

Check warning on line 943 in src/engine/Server.cpp

View check run for this annotation

Codecov / codecov/patch

src/engine/Server.cpp#L943

Added line #L943 was not covered by tests
auto operationString = [&operation] {
if (auto* q = std::get_if<Query>(&operation)) {
return q->query_;
Expand Down
Loading

0 comments on commit 9a393fd

Please sign in to comment.