birdbadge/src/server.cpp

95 lines
2.6 KiB
C++
Raw Normal View History

2023-04-13 22:34:06 +00:00
#include "server.h"
2023-04-11 23:06:36 +00:00
constexpr static const char* GET("GET");
constexpr static const char* REQUEST_METHOD("REQUEST_METHOD");
2023-04-13 22:34:06 +00:00
constexpr static const char* REQUEST_URI("REQUEST_URI");
constexpr static const char* DOCUMENT_URI("DOCUMENT_URI");
constexpr static const char* DOCUMENT_ROOT("DOCUMENT_ROOT");
2023-04-11 23:06:36 +00:00
constexpr static const char* SCRIPT_NAME("SCRIPT_NAME");
2023-04-13 22:34:06 +00:00
constexpr static const char* SCRIPT_FILENAME("SCRIPT_FILENAME");
2023-04-11 23:06:36 +00:00
constexpr static const char* SERVER_NAME("SERVER_NAME");
2023-04-13 22:34:06 +00:00
Server::Server():
requestCount(0),
serverName(std::nullopt)
2023-04-13 22:34:06 +00:00
{}
2023-04-18 16:16:36 +00:00
Server::~Server() {}
2023-04-13 22:34:06 +00:00
void Server::handleRequest(FCGX_Request& request) {
accountRequest(request);
2023-04-13 22:34:06 +00:00
2023-04-11 23:06:36 +00:00
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};
2023-04-18 16:16:36 +00:00
std::string_view requestMethod(FCGX_GetParam(REQUEST_METHOD, request.envp));
2023-04-11 23:06:36 +00:00
if (requestMethod != GET) {
2023-04-18 16:16:36 +00:00
os << Response::status405Header;
2023-04-11 23:06:36 +00:00
return;
}
2023-04-13 22:34:06 +00:00
try {
std::string_view sPath = getPath(request);
2023-04-18 16:16:36 +00:00
Response* response = Response::create(sPath);
response->writeHeader(os);
response->writeBody(os);
delete response;
2023-04-11 23:06:36 +00:00
2023-04-13 22:34:06 +00:00
} catch (const std::exception e) {
2023-04-18 16:16:36 +00:00
writeHeader(os);
2023-04-13 22:34:06 +00:00
os << e.what();
}
}
2023-04-11 23:06:36 +00:00
2023-04-13 22:34:06 +00:00
void Server::printEnv(std::ostream& out, FCGX_Request& request) {
char **envp = request.envp;
for (int i = 0; envp[i] != nullptr; ++i) {
out << envp[i] << "</br>";
2023-04-11 23:06:36 +00:00
}
2023-04-11 22:05:33 +00:00
}
2023-04-13 22:34:06 +00:00
void Server::writeHeader(std::ostream& out) {
2023-04-18 16:16:36 +00:00
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;
2023-04-18 16:16:36 +00:00
} 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;
}