Files
http-server/src/server/connectionoperator.cpp

66 lines
1.6 KiB
C++

#include "../middleware/notfound.hpp"
#include "../middleware/staticcontent.hpp"
#include "../logger.hpp"
#include "configuration.hpp"
#include "connectionoperator.hpp"
#include <cstdio>
#include <sstream>
std::vector<char> 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<int>(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<Middleware::StaticContent>(_logger, staticFileRoot));
}
// ALWAYS LAST!
middlewares.emplace_back(std::make_unique<Middleware::NotFound>(_logger));
}