minimal fix for segfault
This commit is contained in:
parent
6028e0c1fe
commit
7951478edf
@ -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,9 +87,16 @@ void Client::request()
|
|||||||
});
|
});
|
||||||
// server_.responseReady(client_socket_->getFd());
|
// server_.responseReady(client_socket_->getFd());
|
||||||
handler_ = router_->handleRequest();
|
handler_ = router_->handleRequest();
|
||||||
|
if (handler_ != nullptr)
|
||||||
|
{
|
||||||
handler_->handle();
|
handler_->handle();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
ErrorHandler::createErrorResponse(500, *httpResponse_);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
Log::debug("Received partial request",
|
Log::debug("Received partial request",
|
||||||
{
|
{
|
||||||
@ -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
|
||||||
|
|||||||
@ -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 (...)
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user