client: allow buffer to be read in multiple epoll events
This commit is contained in:
parent
afc936a696
commit
c246bde4be
@ -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';
|
||||
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()
|
||||
{
|
||||
char buffer[1024] = {};
|
||||
char buffer[9] = {};
|
||||
ssize_t bytesRead = client_socket_->recv(buffer, sizeof(buffer) - 1);
|
||||
if (bytesRead < 0)
|
||||
{
|
||||
@ -28,13 +47,36 @@ void Client::request()
|
||||
}
|
||||
|
||||
buffer[bytesRead] = '\0'; // Null-terminate the buffer
|
||||
std::cout << "Received request:\n" << buffer << '\n';
|
||||
|
||||
// Handle the request (placeholder implementation)
|
||||
requestBuffer_ += buffer;
|
||||
if (header_.empty())
|
||||
{
|
||||
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());
|
||||
}
|
||||
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 response = "HTTP/1.1 200 OK\r\nContent-Length: 32\r\n\r\nHello, World!";
|
||||
|
||||
@ -19,11 +19,15 @@ class Client
|
||||
|
||||
~Client();
|
||||
|
||||
|
||||
void request();
|
||||
[[nodiscard]] std::string getResponse() const;
|
||||
|
||||
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_;
|
||||
const Server &server;
|
||||
const ServerConfig &server_config;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user