66 lines
1.6 KiB
C++
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));
|
|
} |