From 5fa656c4532f17ad35594f9820b22ff8d4dfbddb Mon Sep 17 00:00:00 2001 From: y-syo Date: Sun, 13 Apr 2025 11:54:26 +0200 Subject: [PATCH] =?UTF-8?q?=E3=80=8C=E2=9C=A8=E3=80=8D=20feat(src/server.c?= =?UTF-8?q?pp):=20handle=5Fclient=20:D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- includes/webserv.hpp | 4 ++- src/server.cpp | 61 +++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 60 insertions(+), 5 deletions(-) diff --git a/includes/webserv.hpp b/includes/webserv.hpp index a519920..43b7042 100644 --- a/includes/webserv.hpp +++ b/includes/webserv.hpp @@ -6,7 +6,7 @@ /* By: mmoussou #include +#define BUFFER_SIZE 4096 + namespace webserv { } //-namespace webserv diff --git a/src/server.cpp b/src/server.cpp index b405c4b..7f8efc9 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/11 16:11:40 by adjoly #+# #+# */ -/* Updated: 2025/04/12 18:53:45 by mmoussou ### ########.fr */ +/* Updated: 2025/04/13 11:53:40 by mmoussou ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,12 +17,64 @@ #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)); +} + void Server::_handle_client(int fd) { (void) 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 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); } void Server::_setup(void) { @@ -46,7 +98,8 @@ void Server::_setup(void) { } } -void Server::_run(void) { +void Server::_run(void) +{ struct pollfd fd; fd.fd = _fd_server; @@ -81,13 +134,13 @@ void Server::_run(void) { _client_fds.push_back(client_pollfd); ++nbr_client; - // if (nbr_client ) TODO do we need a max client probably not :D + // if (nbr_client) TODO do we need a max client probably not :D } for (int i = 1; i <= nbr_client; ) { if (_client_fds[i].revents & POLLIN) { - _handle_client(i); + _handle_client(_client_fds[i].fd); close(_client_fds[i].fd); _client_fds[i] = _client_fds[nbr_client--]; _client_fds.pop_back();