#include "../middleware/notfound.hpp" #include "../middleware/staticcontent.hpp" #include "../logger.hpp" #include "configuration.hpp" #include "connectionoperator.hpp" #include #include std::vector ConnectionOperator::HandleNewConnection(int fd) { auto requestBytes = Socket::ReadBytes(fd, 512); Http::Request request; Http::Response response; try { request = Http::Request::Deserialize(requestBytes); } catch (std::runtime_error & e) { std::stringstream ss; ss << "Error during parsing of request <"; ss << e.what(); ss << '>'; logger.Error(ss.str()); response.code = HttpResponse::Code::BAD_REQUEST; return response.Serialize(); } for(size_t i = 0; i < middlewares.size(); ++i) { middlewares[i]->HandleRequest(request, response); } if (response.code == HttpResponse::Code::UNKNOWN) { std::stringstream ss; ss << "Unhandled "; ss << HttpRequest::typeStrings[static_cast(request.type)]; ss << " request for file <"; ss << request.url.GetPath(); ss << '>'; logger.Error(ss.str()); response.code = HttpResponse::Code::NOT_IMPLEMENTED; return response.Serialize(); } return response.Serialize(); } ConnectionOperator::ConnectionOperator(Logger & _logger, ServerConfiguration const & serverConfiguration) : logger(_logger) { // Base static file server auto const & staticFileRoot = serverConfiguration.GetWwwRoot(); if (staticFileRoot.size() > 0) { middlewares.emplace_back(std::make_unique(_logger, staticFileRoot)); } // ALWAYS LAST! middlewares.emplace_back(std::make_unique(_logger)); }