feat: handle cgi exit status

This commit is contained in:
Quinten 2025-10-30 15:58:33 +01:00
parent 4a41b678c3
commit 2e59cb779d
3 changed files with 12 additions and 10 deletions

View File

@ -177,7 +177,7 @@ void CgiHandler::parseCgiOutput()
Log::debug("CGI output headers not complete yet"); Log::debug("CGI output headers not complete yet");
return; return;
} }
if (header.substr(static_cast<long>(headerEnd), 2) == "\r\n") if (header.substr(static_cast<long>(headerEnd), 2) == "\r\n")
{ {
headerSeperatorSize = 4; headerSeperatorSize = 4;
@ -190,7 +190,7 @@ void CgiHandler::parseCgiOutput()
parseCgiHeaders(headers); parseCgiHeaders(headers);
buffer_.erase(buffer_.begin(), buffer_.begin() + static_cast<long>(headerEnd) + headerSeperatorSize); buffer_.erase(buffer_.begin(), buffer_.begin() + static_cast<long>(headerEnd) + headerSeperatorSize);
parseCgiBody(); finalizeCgiResponse();
} }
void CgiHandler::parseCgiHeaders(std::string &headers) void CgiHandler::parseCgiHeaders(std::string &headers)
@ -265,13 +265,13 @@ void CgiHandler::handleTimeout()
// cancelTimer(); // cancelTimer();
} }
void CgiHandler::parseCgiBody() void CgiHandler::finalizeCgiResponse()
{ {
Log::trace(LOCATION); Log::trace(LOCATION);
auto status = response_.getHeaders().get("Status"); auto status = response_.getHeaders().get("Status");
if (cgiProcess_->getExitCode() > 0 && !status.empty()) wait();
if (cgiProcess_->getExitCode() > 0 && status.empty())
{ {
response_.setStatus(500); response_.setStatus(500);
} }
@ -288,4 +288,4 @@ void CgiHandler::appendToBuffer(const char *data, size_t length)
{ {
Log::trace(LOCATION); Log::trace(LOCATION);
buffer_.insert(buffer_.end(), data, data + length); buffer_.insert(buffer_.end(), data, data + length);
} }

View File

@ -45,7 +45,7 @@ class CgiHandler : public AHandler
std::unique_ptr<CgiSocket> cgiStdErr_; std::unique_ptr<CgiSocket> cgiStdErr_;
void parseCgiOutput(); void parseCgiOutput();
void parseCgiHeaders(std::string &headers); void parseCgiHeaders(std::string &headers);
void parseCgiBody(); void finalizeCgiResponse();
void appendToBuffer(const char *data, size_t length); void appendToBuffer(const char *data, size_t length);
int pid_ = -1; int pid_ = -1;

View File

@ -18,7 +18,8 @@
#include <sys/wait.h> // for waitpid, WNOHANG #include <sys/wait.h> // for waitpid, WNOHANG
#include <unistd.h> // for close, dup2, pipe2, execve, fork, STDERR_FILENO, STDIN_FILENO, STDOUT_FILENO #include <unistd.h> // for close, dup2, pipe2, execve, fork, STDERR_FILENO, STDIN_FILENO, STDOUT_FILENO
CgiProcess::CgiProcess(const HttpRequest &request, CgiHandler &handler) : request_(request), handler_(handler), pid_(-1), status_(-1) CgiProcess::CgiProcess(const HttpRequest &request, CgiHandler &handler)
: request_(request), handler_(handler), pid_(-1), status_(-1)
{ {
if (!request_.getUri().isCgi()) if (!request_.getUri().isCgi())
{ {
@ -133,8 +134,9 @@ void CgiProcess::wait() noexcept
return; return;
} }
Log::debug("CGI process with PID " + std::to_string(pid_) + " has terminated with status " + std::to_string(status)); Log::debug("CGI process with PID " + std::to_string(pid_) + " has terminated with status "
status_ = status; + std::to_string(WEXITSTATUS(status)));
status_ = WEXITSTATUS(status);
pid_ = -1; pid_ = -1;
} }
} }