From 833458e293b0a36201d05957936d67bd5def77ca Mon Sep 17 00:00:00 2001 From: adjoly Date: Tue, 27 May 2025 18:39:43 +0200 Subject: [PATCH] =?UTF-8?q?=E3=80=8C=F0=9F=8F=97=EF=B8=8F=E3=80=8D=20wip:?= =?UTF-8?q?=20working=20remade=20mainloop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- includes/server/PfdManager.hpp | 7 +- includes/server/Server.hpp | 20 ++++-- src/server/Server.cpp | 128 ++++----------------------------- src/server/ServerHandle.cpp | 112 +++++++++++++++++++++++++++++ 4 files changed, 147 insertions(+), 120 deletions(-) create mode 100644 src/server/ServerHandle.cpp diff --git a/includes/server/PfdManager.hpp b/includes/server/PfdManager.hpp index aeb2af9..0558963 100644 --- a/includes/server/PfdManager.hpp +++ b/includes/server/PfdManager.hpp @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/27 17:01:01 by adjoly #+# #+# */ -/* Updated: 2025/05/27 17:59:37 by adjoly ### ########.fr */ +/* Updated: 2025/05/27 18:12:13 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -82,8 +82,9 @@ class PfdManager { } } - static struct pollfd *data(void) { return _pfd_vec.data(); } - static size_t size(void) { return _pfd_vec.size(); } + static struct pollfd * data(void) { return _pfd_vec.data(); } + static size_t size(void) { return _pfd_vec.size(); } + static std::vector *vec(void) { return &_pfd_vec; } static void clear(void) { for (auto it = range(_pfd_vec)) { diff --git a/includes/server/Server.hpp b/includes/server/Server.hpp index 1bef48a..303abd2 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/05/27 17:43:21 by adjoly ### ########.fr */ +/* Updated: 2025/05/27 18:38:04 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,9 +16,11 @@ #include #include #include -#include #include +#include +#include #include +#include namespace webserv { namespace server { @@ -74,11 +76,21 @@ class Server { Client *_getClient(int); config::Config - *_conf; // Pointer to the configuration class (with all config in) + * _conf; // Pointer to the configuration class (with all config in) Logger *_log; // Pointer to the log class - std::vector _fds_server; // The fds of the sockets + std::vector _fds_server; // The fds of the sockets // std::vector _client_fds; // A vector of all the poll fd std::vector _client_data; // vector of all the client sockaddr_in + + /** + * @brief Can be used to handle a pollfd that is a server + */ + void _handle_srv(size_t i); + + /** + * @brief Can be used to handle pollfd taht is a client + */ + void _handle_client(size_t *i); }; }; // namespace server diff --git a/src/server/Server.cpp b/src/server/Server.cpp index c85b577..00d2b30 100644 --- a/src/server/Server.cpp +++ b/src/server/Server.cpp @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/11 16:11:40 by adjoly #+# #+# */ -/* Updated: 2025/05/27 18:03:35 by adjoly ### ########.fr */ +/* Updated: 2025/05/27 18:39:00 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -30,11 +31,10 @@ #include #include - using namespace webserv::server; std::vector PfdManager::_pfd_vec; -std::vector PfdManager::_pfd_type; +std::vector PfdManager::_pfd_type; extern int _sig; @@ -123,116 +123,18 @@ void Server::_run(void) { continue; } - size_t i = 0; - for (auto it = range(_fds_server), i++) { - if (PfdManager::at(i).revents & POLLIN) { - struct sockaddr_in client_addr; - socklen_t addrlen = sizeof(client_addr); - int client_fd = - accept((*it), (struct sockaddr *)&client_addr, &addrlen); - - if (client_fd < 0) { - if (errno == EAGAIN || errno == EWOULDBLOCK) { - continue; - } - std::stringstream str; - str << "Accept failed: "; - str << strerror(errno); - _log->error(str.str()); - continue; - } - config::Server *conf_srv = _conf->getServer(i); - if (conf_srv == not_nullptr) { - _log->warn( - "where the f does he come from"); // does can't actually - // happen but just in - // case - close(client_fd); - continue; - } - - struct pollfd pfd; - pfd.fd = client_fd; - pfd.events = POLLIN | POLLOUT; - pfd.revents = 0; - PfdManager::append(pfd, CLIENT); - Client *new_client = new Client(pfd.fd, conf_srv); - if (new_client == NULL) { - continue; - } - _client_data.push_back(new_client); - _log->debug("client pushed"); - } - } - - for (size_t i = _fds_server.size(); i < PfdManager::size(); ++i) { - if (PfdManager::at(i).revents & POLLERR) { - _log->debug("pollerr"); - close(PfdManager::at(i).fd); - PfdManager::remove(PfdManager::at(i).fd); - delete _client_data[i - _fds_server.size()]; - _client_data.erase(_client_data.begin() + i); - } else if (PfdManager::at(i).revents & POLLIN) { - _log->debug("pollin"); - Client *client = _getClient(PfdManager::at(i).fd); - if (client == not_nullptr) { - _log->error("client does not exist"); - continue; - } - try { - client->parse(); - } catch (std::exception &e) { - _log->error(e.what()); - _client_data.erase(std::find(_client_data.begin(), - _client_data.end(), client)); - delete client; - // for (auto it = range(_client_fds)) { - // if (_client_fds[i].fd == (*it).fd) { - // _log->debug("client fds erased"); - // close(it.base()->fd); - // _client_fds.erase(it); - // break; - // } - // } - close(PfdManager::at(i).fd); - PfdManager::remove(PfdManager::at(i).fd); - _log->debug("client removed"); - i--; - } - } else if (PfdManager::at(i).revents & POLLOUT) { - std::stringstream str; - str << PfdManager::at(i).fd; - _log->debug("pollout = " + str.str()); - Client *client = _getClient(PfdManager::at(i).fd); - - if (client == not_nullptr) { - _log->error("client does not exist"); - continue; - } - if (client->requestParsed() == true && - !client->isReadyToClose()) { - client->answer(); - continue; - } - - if (client->isReadyToClose()) { - _client_data.erase(std::find(_client_data.begin(), - _client_data.end(), client)); - delete client; - // for (auto it = range(_client_fds)) { - // if (_client_fds[i].fd == (*it).fd) { - // _log->debug("client fds erased"); - // close(it.base()->fd); - // _client_fds.erase(it); - // break; - // } - // } - close(PfdManager::at(i).fd); - PfdManager::remove(PfdManager::at(i).fd); - _log->debug("client removed"); - - i--; - } + for (size_t i = 0; i < PfdManager::size(); ++i) { + pfd_type type = PfdManager::getType(PfdManager::at(i).fd); + switch (type) { + case SRV: + _handle_srv(i); + break; + case CLIENT: + _handle_client(&i); + break; + case RES: + _log->warn("not handling resource for now"); + break; } } } diff --git a/src/server/ServerHandle.cpp b/src/server/ServerHandle.cpp new file mode 100644 index 0000000..c809b78 --- /dev/null +++ b/src/server/ServerHandle.cpp @@ -0,0 +1,112 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ServerHandle.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/05/27 18:22:48 by adjoly #+# #+# */ +/* Updated: 2025/05/27 18:38:28 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include +#include + +using namespace webserv::server; + +void Server::_handle_srv(size_t i) { + if (PfdManager::at(i).revents & POLLIN) { + struct sockaddr_in client_addr; + socklen_t addrlen = sizeof(client_addr); + int client_fd = accept(PfdManager::at(i).fd, + (struct sockaddr *)&client_addr, &addrlen); + + if (client_fd < 0) { + if (errno == EAGAIN || errno == EWOULDBLOCK) { + return; + } + std::stringstream str; + str << "Accept failed: "; + str << strerror(errno); + _log->error(str.str()); + return; + } + config::Server *conf_srv = _conf->getServer(i); + if (conf_srv == not_nullptr) { + _log->warn("where the f does he come from"); // does can't + // actually happen + // but just in case + close(client_fd); + return; + } + + struct pollfd pfd; + pfd.fd = client_fd; + pfd.events = POLLIN | POLLOUT; + pfd.revents = 0; + PfdManager::append(pfd, CLIENT); + Client *new_client = new Client(pfd.fd, conf_srv); + if (new_client == NULL) { + return; + } + _client_data.push_back(new_client); + _log->debug("client pushed"); + } +} + +void Server::_handle_client(size_t *i) { + if (PfdManager::getType(PfdManager::at(*i).fd)) { + if (PfdManager::at(*i).revents & POLLERR) { + _log->debug("pollerr"); + close(PfdManager::at(*i).fd); + PfdManager::remove(PfdManager::at(*i).fd); + delete _client_data[*i - _fds_server.size()]; + _client_data.erase(_client_data.begin() + *i); + } else if (PfdManager::at(*i).revents & POLLIN) { + _log->debug("pollin"); + Client *client = _getClient(PfdManager::at(*i).fd); + if (client == not_nullptr) { + _log->error("client does not exist"); + return ; + } + try { + client->parse(); + } catch (std::exception &e) { + _log->error(e.what()); + _client_data.erase(std::find(_client_data.begin(), + _client_data.end(), client)); + delete client; + close(PfdManager::at(*i).fd); + PfdManager::remove(PfdManager::at(*i).fd); + _log->debug("client removed"); + i--; + } + } else if (PfdManager::at(*i).revents & POLLOUT) { + std::stringstream str; + str << PfdManager::at(*i).fd; + _log->debug("pollout = " + str.str()); + Client *client = _getClient(PfdManager::at(*i).fd); + + if (client == not_nullptr) { + _log->error("client does not exist"); + return; + } + if (client->requestParsed() == true && !client->isReadyToClose()) { + client->answer(); + return; + } + + if (client->isReadyToClose()) { + _client_data.erase(std::find(_client_data.begin(), + _client_data.end(), client)); + delete client; + close(PfdManager::at(*i).fd); + PfdManager::remove(PfdManager::at(*i).fd); + _log->debug("client removed"); + i--; + } + } + } +}