diff --git a/webserv/client/Client.cpp b/webserv/client/Client.cpp index 49eda00..ac19a86 100644 --- a/webserv/client/Client.cpp +++ b/webserv/client/Client.cpp @@ -7,14 +7,33 @@ Client::Client(std::unique_ptr 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) - server.responseReady(client_socket_->getFd()); + 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!"; diff --git a/webserv/client/Client.hpp b/webserv/client/Client.hpp index a5e5286..e0b1e9d 100644 --- a/webserv/client/Client.hpp +++ b/webserv/client/Client.hpp @@ -11,19 +11,23 @@ class Client { public: Client(std::unique_ptr socket, Server &server, const ServerConfig &server_config); - + Client(const Client &other) = delete; // Disable copy constructor Client &operator=(const Client &other) = delete; // Disable copy assignment Client(Client &&other) noexcept = delete; // Move constructor Client &operator=(Client &&other) noexcept = delete; // Move assignment - + ~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 client_socket_; const Server &server; const ServerConfig &server_config;