From 49fcb87395df441f90446b0d91db5e1a866df335 Mon Sep 17 00:00:00 2001 From: adjoly Date: Thu, 17 Apr 2025 18:22:05 +0200 Subject: [PATCH] =?UTF-8?q?=E3=80=8C=F0=9F=8F=97=EF=B8=8F=E3=80=8D=20wip:?= =?UTF-8?q?=20main=20loop=20should=20be=20working?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- includes/server/Server.hpp | 6 +-- src/server/Server.cpp | 81 +++++++++++++++++++------------------- 2 files changed, 43 insertions(+), 44 deletions(-) diff --git a/includes/server/Server.hpp b/includes/server/Server.hpp index 2744e75..86d3fba 100644 --- a/includes/server/Server.hpp +++ b/includes/server/Server.hpp @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/11 17:45:43 by adjoly #+# #+# */ -/* Updated: 2025/04/17 11:48:36 by adjoly ### ########.fr */ +/* Updated: 2025/04/17 18:08:38 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -41,9 +41,9 @@ class Server { /** * @brief Used to handle client request * - * @param The number of the client fd + * @param The fd of the client */ - void _handle_client(Client); + void _handle_client(int, sockaddr_in, config::Config *, struct pollfd); /** * @brief Can be used to fill the vector passed as parameters with all the diff --git a/src/server/Server.cpp b/src/server/Server.cpp index 9def9c2..315c7d6 100644 --- a/src/server/Server.cpp +++ b/src/server/Server.cpp @@ -6,64 +6,40 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/11 16:11:40 by adjoly #+# #+# */ -/* Updated: 2025/04/17 14:35:01 by adjoly ### ########.fr */ +/* Updated: 2025/04/17 18:21:34 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ #include +#include #include #include +#include #include #include -#include #include #include #include using namespace webserv; -std::string getMethod(std::string &data) { - return (data.substr(0, data.substr(0, 4).find_last_not_of(" ") + 1)); +std::string convertIPToString(const struct in_addr *addr) { + unsigned int ip = ntohl(addr->s_addr); + std::stringstream ss; + ss << ((ip >> 24) & 0xFF) << "." << ((ip >> 16) & 0xFF) << "." + << ((ip >> 8) & 0xFF) << "." << (ip & 0xFF); + return ss.str(); } -void Server::_handle_client(int fd) { - std::string received_data; - char buffer[BUFFER_SIZE]; - ssize_t bytes_received; - do { - std::memset(buffer, 0, BUFFER_SIZE); - bytes_received = recv(fd, buffer, BUFFER_SIZE - 1, 0); - if (bytes_received == -1) { - _log->error("failed to receive request"); - continue; - } - received_data += std::string(buffer, bytes_received); - } while (buffer[bytes_received]); +std::string convertPortToString(const struct sockaddr_in *sa) { + int port = ntohs(sa->sin_port); + std::stringstream ss; + ss << port; + return ss.str(); +} - std::string response; - - if (getMethod(received_data) == "GET") { - _log->info("get request received"); - http::Get request(received_data); - - response = request.execute().str(); - } else if (getMethod(received_data) == "DELETE") { - _log->info("delete request received"); - http::Delete request(received_data); - - response = request.execute().str(); - } else if (getMethod(received_data) == "POST") { - _log->info("post request received"); - http::Post request(received_data); - - response = request.execute().str(); - } else { - response = "HTTP/1.1 501 Not Implemented\r\nContent-Type: " - "text/html\r\n\r\n

501 Not " - "Implemented

"; - } - - send(fd, response.c_str(), response.length(), 0); +std::string getMethod(std::string &data) { + return (data.substr(0, data.substr(0, 4).find_last_not_of(" ") + 1)); } int Server::_fillHostsPorts(std::vector &hosts, @@ -106,9 +82,32 @@ void Server::_run(void) { it != _fds_server.end(); it++, nbr_client++) { fd.fd = *it; fd.events = POLLIN; + _client_fds.push_back(fd); } while (727) { + int ret = poll(_client_fds.data(), nbr_client, -1); + if (ret < 0) { + _log->error("poll failed :("); + continue; + } + + for (int i = 0; i < nbr_client; i++) { + if (_client_fds[i].revents & POLLIN) { + struct sockaddr_in client_addr; + socklen_t addrlen = sizeof(client_addr); + int client_fd = + accept(_client_fds[i].fd, (struct sockaddr *)&client_addr, + &addrlen); + if (client_fd < 0) { + _log->error("accept failed with : " + + convertIPToString(&client_addr.sin_addr) + ":" + + convertPortToString(&client_addr)); + continue ; + } + _handle_client(client_fd, client_addr, _conf, _client_fds[i]); + } + } } }