#include "arguments.hh"
#include <yahttp/router.hpp>
-struct connectionThreadData {
- WebServer* webServer{nullptr};
- std::shared_ptr<Socket> client{nullptr};
-};
-
json11::Json HttpRequest::json()
{
string err;
registerBareHandler(url, f);
}
-static void *WebServerConnectionThreadStart(std::shared_ptr<connectionThreadData> data) {
- data->webServer->serveConnection(data->client);
+static void *WebServerConnectionThreadStart(const WebServer* webServer, std::shared_ptr<Socket> client) {
+ webServer->serveConnection(client);
return nullptr;
}
-void WebServer::handleRequest(HttpRequest& req, HttpResponse& resp)
+void WebServer::handleRequest(HttpRequest& req, HttpResponse& resp) const
{
// set default headers
resp.headers["Content-Type"] = "text/html; charset=utf-8";
}
}
-void WebServer::serveConnection(std::shared_ptr<Socket> client)
+void WebServer::serveConnection(std::shared_ptr<Socket> client) const
try {
HttpRequest req;
YaHTTP::AsyncRequestLoader yarl;
acl.toMasks(::arg()["webserver-allow-from"]);
while(true) {
- // data and data->client will be freed by thread
- auto data = std::make_shared<connectionThreadData>();
- data->webServer = this;
try {
- data->client = d_server->accept();
- if (data->client->acl(acl)) {
- std::thread webHandler(WebServerConnectionThreadStart, data);
+ auto client = d_server->accept();
+ if (client->acl(acl)) {
+ std::thread webHandler(WebServerConnectionThreadStart, this, client);
webHandler.detach();
} else {
ComboAddress remote;
- if (data->client->getRemote(remote))
+ if (client->getRemote(remote))
L<<Logger::Error<<"Webserver closing socket: remote ("<< remote.toString() <<") does not match 'webserver-allow-from'"<<endl;
}
}
void bind();
void go();
- void serveConnection(std::shared_ptr<Socket> client);
- void handleRequest(HttpRequest& request, HttpResponse& resp);
+ void serveConnection(std::shared_ptr<Socket> client) const;
+ void handleRequest(HttpRequest& request, HttpResponse& resp) const;
typedef boost::function<void(HttpRequest* req, HttpResponse* resp)> HandlerFunction;
void registerApiHandler(const string& url, HandlerFunction handler);
#include "htmlfiles.h"
-void serveStuff(HttpRequest* req, HttpResponse* resp)
+static void serveStuff(HttpRequest* req, HttpResponse* resp)
{
resp->headers["Cache-Control"] = "max-age=86400";
}
// This is an entry point from FDM, so it needs to catch everything.
-void AsyncWebServer::serveConnection(std::shared_ptr<Socket> client)
+void AsyncWebServer::serveConnection(std::shared_ptr<Socket> client) const
try {
HttpRequest req;
YaHTTP::AsyncRequestLoader yarl;