client: allow buffer to be read in multiple epoll events

This commit is contained in:
Quinten Mennen 2025-09-18 17:33:06 +02:00
parent afc936a696
commit c246bde4be
2 changed files with 56 additions and 10 deletions

View File

@ -7,14 +7,33 @@ Client::Client(std::unique_ptr<Socket> socket, Server &server, const ServerConfi
{ {
} }
Client::~Client(){ Client::~Client()
{
std::cout << "Client destructor called for fd: " << client_socket_->getFd() << '\n'; std::cout << "Client destructor called for fd: " << client_socket_->getFd() << '\n';
server.removeFromEpoll(*client_socket_); server.removeFromEpoll(*client_socket_);
}; };
int Client::parseHeaderforContentLength(const std::string &request)
{
std::string header = "Content-Length: ";
size_t pos = request.find(header);
std::cout << "Parsing header for Content-Length...\n" << header << '\n';
if (pos != std::string::npos)
{
size_t start = pos + header.length();
size_t end = request.find("\r\n", start);
if (end != std::string::npos)
{
std::string lengthStr = request.substr(start, end - start);
return std::atoi(lengthStr.c_str());
}
}
return -1; // Not found
}
void Client::request() void Client::request()
{ {
char buffer[1024] = {}; char buffer[9] = {};
ssize_t bytesRead = client_socket_->recv(buffer, sizeof(buffer) - 1); ssize_t bytesRead = client_socket_->recv(buffer, sizeof(buffer) - 1);
if (bytesRead < 0) if (bytesRead < 0)
{ {
@ -28,13 +47,36 @@ void Client::request()
} }
buffer[bytesRead] = '\0'; // Null-terminate the buffer buffer[bytesRead] = '\0'; // Null-terminate the buffer
std::cout << "Received request:\n" << buffer << '\n'; requestBuffer_ += buffer;
if (header_.empty())
// Handle the request (placeholder implementation) {
auto headerEnd = requestBuffer_.find("\r\n\r\n");
if (headerEnd != std::string::npos)
{
header_ = requestBuffer_.substr(0, headerEnd + 4);
contentLength_ = parseHeaderforContentLength(header_);
if (contentLength_ == -1)
{
std::cout << "Received complete request:\n" << requestBuffer_ << "\n=== HEADER FINISHED\n";
server.responseReady(client_socket_->getFd()); server.responseReady(client_socket_->getFd());
}
requestBuffer_.erase(0, headerEnd + 4);
return;
}
}
else
{
content_ += requestBuffer_;
if (content_.size() >= contentLength_)
{
std::cout << "Received complete request:\n" << header_ << content_ << "\n=== FULL REQUEST FINISHED\n";
server.responseReady(client_socket_->getFd());
requestBuffer_.clear();
contentLength_ = -1;
}
}
} }
std::string Client::getResponse() const std::string Client::getResponse() const
{ {
std::string response = "HTTP/1.1 200 OK\r\nContent-Length: 32\r\n\r\nHello, World!"; std::string response = "HTTP/1.1 200 OK\r\nContent-Length: 32\r\n\r\nHello, World!";

View File

@ -19,11 +19,15 @@ class Client
~Client(); ~Client();
void request(); void request();
[[nodiscard]] std::string getResponse() const; [[nodiscard]] std::string getResponse() const;
private: private:
int parseHeaderforContentLength(const std::string &request);
int contentLength_{-1};
std::string requestBuffer_;
std::string header_;
std::string content_;
std::unique_ptr<Socket> client_socket_; std::unique_ptr<Socket> client_socket_;
const Server &server; const Server &server;
const ServerConfig &server_config; const ServerConfig &server_config;