#include "server.h" constexpr static const char* GET("GET"); constexpr static const char* REQUEST_METHOD("REQUEST_METHOD"); 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"); constexpr static const char* SERVER_NAME("SERVER_NAME"); Server::Server(): requestCount(0), serverName(std::nullopt) {} Server::~Server() {} void Server::handleRequest(FCGX_Request& request) { accountRequest(request); fcgi_streambuf cin_fcgi_streambuf(request.in); fcgi_streambuf cout_fcgi_streambuf(request.out); fcgi_streambuf cerr_fcgi_streambuf(request.err); std::ostream os{&cout_fcgi_streambuf}; std::ostream errs{&cerr_fcgi_streambuf}; std::istream is{&cin_fcgi_streambuf}; std::string_view requestMethod(FCGX_GetParam(REQUEST_METHOD, request.envp)); if (requestMethod != GET) { os << Response::status405Header; return; } try { std::string_view sPath = getPath(request); Response* response = Response::create(sPath); response->writeHeader(os); response->writeBody(os); delete response; } catch (const std::exception e) { writeHeader(os); os << e.what(); } } void Server::printEnv(std::ostream& out, FCGX_Request& request) { char **envp = request.envp; for (int i = 0; envp[i] != nullptr; ++i) { out << envp[i] << "
"; } } void Server::writeHeader(std::ostream& out) { out << Response::status200Header << Response::newLine; out << Response::contentTypeHTML; out << Response::headerTerminator; } void Server::accountRequest(const FCGX_Request& request) { ++requestCount; if (!serverName.has_value()) { try { serverName = FCGX_GetParam(SERVER_NAME, request.envp); std::cout << "received server name " << serverName.value() << std::endl; } catch (...) {} } } std::string_view Server::getPath(const FCGX_Request& request) { std::string_view path; if (serverName.has_value()) { const std::string& sn = serverName.value(); std::string_view scriptFileName(FCGX_GetParam(SCRIPT_FILENAME, request.envp)); std::string::size_type snLocation = scriptFileName.find(sn); if (snLocation != std::string::npos) { if (snLocation + sn.size() < scriptFileName.size()) { path = scriptFileName.substr(snLocation + sn.size() + 1); } } } return path; }