#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"); constexpr static const char* status405("Status: 405 Method Not Allowed"); constexpr static const char* status500("Status: 500 Internal Error"); constexpr static const char* status200("Status: 200 OK"); constexpr static const char* contentTypeHtml("Content-type: text/html"); constexpr static const char* headerEnd("\n\n"); constexpr static const char* newLine("\n"); constexpr static const char* svgHeader("image/svg+xml;charset=utf-8"); 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 requestMethod(FCGX_GetParam(REQUEST_METHOD, request.envp)); if (requestMethod != GET) { os << status405; return; } writeHeader(os); try { std::string_view sPath = getPath(request); Response response(sPath); } catch (const std::exception e) { 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 << status200 << newLine; out << contentTypeHtml; out << headerEnd; } 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::cout << "couldn't parse " << std::endl; } } } 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; }