30 #include <shared_mutex>
35 struct 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));
55 unique_lock l(data->configurationMutex);
56 data->config = make_shared<Config>(move(config));
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);
99 unique_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);
108 unique_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.
Class which connects NAWA to the fastcgi++ library.
A request handler which creates a development web server.
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)
std::shared_ptr< Config const > getConfig() const noexcept
virtual ~RequestHandler()
void handleRequest(Connection &connection)
void setConfig(Config config) noexcept
void setAccessFilters(AccessFilterList accessFilters) noexcept
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