minimal fix for segfault

This commit is contained in:
whaffman 2025-10-21 15:11:39 +02:00
parent 6028e0c1fe
commit 7951478edf
3 changed files with 29 additions and 9 deletions

View File

@ -1,4 +1,5 @@
#include "webserv/handler/CgiHandler.hpp" #include "webserv/handler/CgiHandler.hpp"
#include "webserv/handler/ErrorHandler.hpp"
#include "webserv/socket/ASocket.hpp" #include "webserv/socket/ASocket.hpp"
#include "webserv/socket/CgiSocket.hpp" #include "webserv/socket/CgiSocket.hpp"
@ -86,7 +87,14 @@ void Client::request()
}); });
// server_.responseReady(client_socket_->getFd()); // server_.responseReady(client_socket_->getFd());
handler_ = router_->handleRequest(); handler_ = router_->handleRequest();
handler_->handle(); if (handler_ != nullptr)
{
handler_->handle();
}
else
{
ErrorHandler::createErrorResponse(500, *httpResponse_);
}
} }
else else
{ {
@ -110,7 +118,7 @@ void Client::setCgiSockets(CgiSocket *cgiStdIn, CgiSocket *cgiStdOut)
void Client::removeCgiSocket(CgiSocket *cgiSocket) void Client::removeCgiSocket(CgiSocket *cgiSocket)
{ {
server_.remove(*cgiSocket); // write server_.remove(*cgiSocket); // write
sockets_.erase(cgiSocket->getFd()); sockets_.erase(cgiSocket->getFd());
// sockets_[cgiStdIn->getFd()] = cgiStdIn; // sockets_[cgiStdIn->getFd()] = cgiStdIn;
@ -119,7 +127,7 @@ void Client::removeCgiSocket(CgiSocket *cgiSocket)
void Client::poll() const void Client::poll() const
{ {
auto * cgiHandler = dynamic_cast<CgiHandler *>(handler_.get()); auto *cgiHandler = dynamic_cast<CgiHandler *>(handler_.get());
if (cgiHandler != nullptr) if (cgiHandler != nullptr)
{ {
Log::debug("Polling CGI handler for client, fd: " + std::to_string(clientSocket_->getFd())); Log::debug("Polling CGI handler for client, fd: " + std::to_string(clientSocket_->getFd()));
@ -132,7 +140,6 @@ void Client::poll() const
clientSocket_->setCallback([this]() { respond(); }); clientSocket_->setCallback([this]() { respond(); });
server_.writable(clientSocket_->getFd()); server_.writable(clientSocket_->getFd());
} }
} }
void Client::respond() const void Client::respond() const

View File

@ -1,4 +1,5 @@
#include "webserv/config/ConfigManager.hpp" #include "webserv/config/ConfigManager.hpp"
#include "webserv/config/ServerConfig.hpp"
#include "webserv/handler/URI.hpp" #include "webserv/handler/URI.hpp"
#include <webserv/client/Client.hpp> // for Client #include <webserv/client/Client.hpp> // for Client
@ -33,9 +34,17 @@ void HttpRequest::setState(State state)
{ {
if (state == State::Complete) if (state == State::Complete)
{ {
//TODO: segfault if server does not exist // TODO: segfault if server does not exist
std::string hostHeader = getHeaders().getHost().value_or("");
ServerConfig *serverConfig = ConfigManager::getInstance().getMatchingServerConfig(hostHeader);
if (hostHeader.empty() || serverConfig == nullptr)
{
Log::error("No matching server config found for host: " + hostHeader);
state_ = State::ParseError;
return;
}
uri_ = std::make_unique<URI>( uri_ = std::make_unique<URI>(
*this, *ConfigManager::getInstance().getMatchingServerConfig(getHeaders().getHost().value_or(""))); *this, *serverConfig);
} }
state_ = state; state_ = state;
} }
@ -93,9 +102,7 @@ void HttpRequest::parseBuffer()
case State::Complete: case State::Complete:
Log::debug("HttpRequest::parseBuffer() request is complete"); Log::debug("HttpRequest::parseBuffer() request is complete");
return; // Request is complete return; // Request is complete
case State::ParseError: case State::ParseError: Log::warning("Parse error occurred, stopping further processing"); return;
Log::warning("Parse error occurred, stopping further processing");
return;
} }
} }
catch (...) catch (...)

View File

@ -38,6 +38,12 @@ std::unique_ptr<AHandler> Router::handleRequest()
Log::trace(LOCATION); Log::trace(LOCATION);
HttpRequest &request = client_->getHttpRequest(); HttpRequest &request = client_->getHttpRequest();
if (request.getState() == HttpRequest::State::ParseError)
{
Log::error("Router::handleRequest() called with incomplete request");
return nullptr;
}
HttpResponse &response = client_->getHttpResponse(); HttpResponse &response = client_->getHttpResponse();
const std::string &target = request.getTarget(); const std::string &target = request.getTarget();