25#include <nawa/RequestHandler/impl/FastcgiRequestHandler.h>
26#include <nawa/RequestHandler/impl/HttpRequestHandler.h>
30#include <shared_mutex>
35struct RequestHandler::Data {
36 shared_mutex configurationMutex;
37 shared_ptr<HandleRequestFunctionWrapper> handleRequestFunction;
38 shared_ptr<AccessFilterList> accessFilters;
39 shared_ptr<Config> config;
45 unique_lock l(data->configurationMutex);
46 data->handleRequestFunction = move(handleRequestFunction);
50 unique_lock l(data->configurationMutex);
51 data->accessFilters = make_shared<AccessFilterList>(move(accessFilters));
54void RequestHandler::setConfig(
Config config)
noexcept {
55 unique_lock l(data->configurationMutex);
56 data->config = make_shared<Config>(move(config));
59shared_ptr<Config const> RequestHandler::getConfig() const noexcept {
64 optional<AccessFilterList> accessFilters,
65 optional<Config> config)
noexcept {
66 unique_lock l(data->configurationMutex);
67 if (handleRequestFunction) {
68 data->handleRequestFunction = *handleRequestFunction;
71 data->accessFilters = make_shared<AccessFilterList>(move(*accessFilters));
74 data->config = make_shared<Config>(move(*config));
79 optional<Config> config)
noexcept {
80 reconfigure(make_shared<HandleRequestFunctionWrapper>(move(handleRequestFunction)), move(accessFilters),
85 shared_ptr<HandleRequestFunctionWrapper> handleRequestFunction;
86 shared_ptr<AccessFilterList> accessFilters;
87 shared_ptr<Config> config;
89 shared_lock l(data->configurationMutex);
90 handleRequestFunction = data->handleRequestFunction;
91 accessFilters = data->accessFilters;
94 if (!accessFilters || !connection.
applyFilters(*accessFilters)) {
95 (*handleRequestFunction)(connection);
99unique_ptr<RequestHandler>
101 Config config,
int concurrency) {
102 if (config[{
"system",
"request_handler"}] ==
"http") {
103 return make_unique<HttpRequestHandler>(handleRequestFunction, move(config), concurrency);
105 return make_unique<FastcgiRequestHandler>(handleRequestFunction, move(config), concurrency);
108unique_ptr<RequestHandler>
111 return newRequestHandler(make_shared<HandleRequestFunctionWrapper>(move(handleRequestFunction)), move(config),
Response object to be passed back to NAWA and accessor to the request.
Handles and serves incoming requests via the NAWA app.
Class for managing sessions and getting and setting connection-independent session data.
bool applyFilters(AccessFilterList const &accessFilters)
virtual ~RequestHandler()
void handleRequest(Connection &connection)
static std::unique_ptr< RequestHandler > newRequestHandler(std::shared_ptr< HandleRequestFunctionWrapper > const &handleRequestFunction, Config config, int concurrency)
void reconfigure(std::optional< std::shared_ptr< HandleRequestFunctionWrapper > > handleRequestFunction, std::optional< AccessFilterList > accessFilters, std::optional< Config > config) noexcept
Namespace containing functions for text encoding and decoding.
#define NAWA_DEFAULT_CONSTRUCTOR_IMPL(Class)
std::function< int(nawa::Connection &)> HandleRequestFunction