#include "server.h" constexpr static const char* REQUEST_URI("REQUEST_URI"); constexpr static const char* DOCUMENT_URI("DOCUMENT_URI"); constexpr static const char* DOCUMENT_ROOT("DOCUMENT_ROOT"); constexpr static const char* SCRIPT_NAME("SCRIPT_NAME"); constexpr static const char* SCRIPT_FILENAME("SCRIPT_FILENAME"); Server::Server(): terminating(false), requestCount(0), serverName(std::nullopt), router() { router.addRoute("info", Server::info); router.addRoute("env", Server::printEnvironment); } Server::~Server() {} void Server::run(int socketDescriptor) { while (!terminating) { std::unique_ptr request = std::make_unique(); bool result = request->wait(socketDescriptor); if (!result) { std::cerr << "Error accepting a request" << std::endl; return; } handleRequest(std::move(request)); } } void Server::handleRequest(std::unique_ptr request) { ++requestCount; if (!serverName) { try { serverName = request->getServerName(); std::cout << "received server name " << serverName.value() << std::endl; } catch (...) { std::cerr << "failed to read server name" << std::endl; Response error(Response::Status::internalError); error.replyTo(*request.get()); return; } } if (!request->isGet()) { static const Response methodNotAllowed(Response::Status::methodNotAllowed); methodNotAllowed.replyTo(*request.get()); return; } try { std::string path = request->getPath(serverName.value()); router.route(path.data(), std::move(request)); } catch (const std::exception e) { Response error(Response::Status::internalError); error.setBody(std::string(e.what())); error.replyTo(*request.get()); } } bool Server::printEnvironment(Request* request) { nlohmann::json body = nlohmann::json::object(); request->printEnvironment(body); Response res; res.setBody(body); res.replyTo(*request); return true; } bool Server::info(Request* request) { Response res; nlohmann::json body = nlohmann::json::object(); body["type"] = "Pica"; body["version"] = "0.0.1"; res.setBody(body); res.replyTo(*request); return true; }