#include "ext/incbin/incbin.h"
#include "rec-lua-conf.hh"
#include "rpzloader.hh"
+#include "uuid-utils.hh"
extern thread_local FDMultiplexer* t_fdm;
d_ws = new AsyncWebServer(fdm, arg()["webserver-address"], arg().asNum("webserver-port"));
d_ws->setApiKey(arg()["api-key"]);
d_ws->setPassword(arg()["webserver-password"]);
+ d_ws->setLogLevel(arg()["webserver-loglevel"]);
NetmaskGroup acl;
acl.toMasks(::arg()["webserver-allow-from"]);
}
// This is an entry point from FDM, so it needs to catch everything.
-void AsyncWebServer::serveConnection(std::shared_ptr<Socket> client) const
-try {
- HttpRequest req;
- YaHTTP::AsyncRequestLoader yarl;
- yarl.initialize(&req);
- client->setNonBlocking();
-
- string data;
+void AsyncWebServer::serveConnection(std::shared_ptr<Socket> client) const {
+ const string logprefix = d_logprefix + to_string(getUniqueID()) + " ";
+
+ HttpRequest req(logprefix);
+ HttpResponse resp;
+ ComboAddress remote;
+ string reply;
+
try {
- while(!req.complete) {
- int bytes = arecvtcp(data, 16384, client.get(), true);
- if (bytes > 0) {
- req.complete = yarl.feed(data);
- } else {
- // read error OR EOF
- break;
+ YaHTTP::AsyncRequestLoader yarl;
+ yarl.initialize(&req);
+ client->setNonBlocking();
+
+ string data;
+ try {
+ while(!req.complete) {
+ int bytes = arecvtcp(data, 16384, client.get(), true);
+ if (bytes > 0) {
+ req.complete = yarl.feed(data);
+ } else {
+ // read error OR EOF
+ break;
+ }
}
+ yarl.finalize();
+ } catch (YaHTTP::ParseError &e) {
+ // request stays incomplete
+ g_log<<Logger::Warning<<logprefix<<"Unable to parse request: "<<e.what()<<endl;
+ }
+
+ if (d_loglevel >= WebServer::LogLevel::None) {
+ client->getRemote(remote);
}
- yarl.finalize();
- } catch (YaHTTP::ParseError &e) {
- // request stays incomplete
+
+ logRequest(req, remote);
+
+ WebServer::handleRequest(req, resp);
+ ostringstream ss;
+ resp.write(ss);
+ reply = ss.str();
+
+ logResponse(resp, remote, logprefix);
+
+ // now send the reply
+ if (asendtcp(reply, client.get()) == -1 || reply.empty()) {
+ g_log<<Logger::Error<<logprefix<<"Failed sending reply to HTTP client"<<endl;
+ }
+ }
+ catch(PDNSException &e) {
+ g_log<<Logger::Error<<logprefix<<"Exception: "<<e.reason<<endl;
+ }
+ catch(std::exception &e) {
+ if(strstr(e.what(), "timeout")==0)
+ g_log<<Logger::Error<<logprefix<<"STL Exception: "<<e.what()<<endl;
+ }
+ catch(...) {
+ g_log<<Logger::Error<<logprefix<<"Unknown exception"<<endl;
}
- HttpResponse resp;
- handleRequest(req, resp);
- ostringstream ss;
- resp.write(ss);
- data = ss.str();
-
- // now send the reply
- if (asendtcp(data, client.get()) == -1 || data.empty()) {
- g_log<<Logger::Error<<"Failed sending reply to HTTP client"<<endl;
+ if (d_loglevel >= WebServer::LogLevel::Normal) {
+ g_log<<Logger::Notice<<logprefix<<remote<<" \""<<req.method<<" "<<req.url.path<<" HTTP/"<<req.versionStr(req.version)<<"\" "<<resp.status<<" "<<reply.size()<<endl;
}
}
-catch(PDNSException &e) {
- g_log<<Logger::Error<<"HTTP Exception: "<<e.reason<<endl;
-}
-catch(std::exception &e) {
- if(strstr(e.what(), "timeout")==0)
- g_log<<Logger::Error<<"HTTP STL Exception: "<<e.what()<<endl;
-}
-catch(...) {
- g_log<<Logger::Error<<"HTTP: Unknown exception"<<endl;
-}
void AsyncWebServer::go() {
if (!d_server)