diff --git a/includes/requests/Cgi.hpp b/includes/requests/Cgi.hpp index e0ce139..5d61120 100644 --- a/includes/requests/Cgi.hpp +++ b/includes/requests/Cgi.hpp @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/03/24 14:17:34 by adjoly #+# #+# */ -/* Updated: 2025/04/24 14:24:09 by adjoly ### ########.fr */ +/* Updated: 2025/04/25 13:40:10 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -28,7 +28,7 @@ class Cgi { std::string getEnv(std::string &); void setEnv(std::string &, std::string); - void process(void); + void process(void); protected: private: diff --git a/includes/server/Client.hpp b/includes/server/Client.hpp index 4155ff1..af899c4 100644 --- a/includes/server/Client.hpp +++ b/includes/server/Client.hpp @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/14 14:14:39 by adjoly #+# #+# */ -/* Updated: 2025/04/25 13:20:13 by adjoly ### ########.fr */ +/* Updated: 2025/04/25 14:33:54 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,7 +15,7 @@ #include #include #include -#include +#include #include namespace webserv { @@ -23,13 +23,20 @@ namespace server { class Client { public: - Client(); Client(struct pollfd *, sockaddr_in, config::Config *); void parse(void); virtual ~Client(void); void answer(void); + struct pollfd *getPollfd(void) const { return _pfd; } + + bool operator==(int fd) { + if (fd != _pfd->fd) + return false; + return true; + } + private: void _getRequest(std::string); @@ -38,7 +45,7 @@ class Client { http::IRequest *_request; // http::Response *_response; config::Server *_conf; - config::Config *_Gconf; + config::Config *_Gconf; }; } // namespace server diff --git a/includes/server/Server.hpp b/includes/server/Server.hpp index a6ccb96..d1e0e22 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/25 13:23:08 by adjoly ### ########.fr */ +/* Updated: 2025/04/25 14:52:50 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -44,7 +44,7 @@ class Server { /** * @brief Used to handle client request * - * @param The fd of the client + * @param the position in the _client_data */ bool _handle_client(Client *); @@ -78,6 +78,8 @@ class Server { return false; } + Client *_getClient(int); + config::Config *_conf; // Pointer to the configuration class (with all config in) Logger *_log; // Pointer to the log class diff --git a/src/server/Client.cpp b/src/server/Client.cpp index 1bbb2b5..fe0ac7b 100644 --- a/src/server/Client.cpp +++ b/src/server/Client.cpp @@ -6,16 +6,15 @@ /* By: mmoussou #include +#include -using namespace server; - -Client::Client(void) {} +using namespace webserv::server; Client::Client(struct pollfd *pfd, sockaddr_in socket, config::Config *conf) : _pfd(pfd), _client_addr(socket), _Gconf(conf) { @@ -26,6 +25,8 @@ void Client::parse(void) { std::string received_data; char buffer[BUFFER_SIZE]; ssize_t bytes_received; + + do { std::memset(buffer, 0, BUFFER_SIZE); bytes_received = recv(_pfd->fd, buffer, BUFFER_SIZE - 1, 0); @@ -82,5 +83,6 @@ void Client::answer(void) { Client::~Client(void) { log("➖", "Client", "destructor called"); + delete _pfd; delete (http::Get *)(this->_request); } diff --git a/src/server/Server.cpp b/src/server/Server.cpp index 0d0658a..db25e65 100644 --- a/src/server/Server.cpp +++ b/src/server/Server.cpp @@ -6,10 +6,11 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/11 16:11:40 by adjoly #+# #+# */ -/* Updated: 2025/04/25 13:09:33 by adjoly ### ########.fr */ +/* Updated: 2025/04/25 14:54:42 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ +#include "cppeleven.hpp" #include #include #include @@ -32,6 +33,15 @@ using namespace webserv::server; extern int _sig; +Client *Server::_getClient(int fd) { + for (auto it = range(_client_data)) { + if (*(*it) == fd) { + return *it; + } + } + return not_nullptr; +} + std::string convertIPToString(const struct in_addr *addr) { unsigned int ip = ntohl(addr->s_addr); std::stringstream ss; @@ -92,7 +102,6 @@ void Server::_run(void) { fd.fd = *it; fd.events = POLLIN; _client_fds.push_back(fd); - _client_data.push_back(NULL); _log->debug("new socket in poll"); } @@ -122,27 +131,31 @@ void Server::_run(void) { continue; } - pollfd pfd; + struct pollfd pfd; pfd.fd = client_fd; pfd.events = POLLIN | POLLOUT; pfd.revents = 0; _client_fds.push_back(pfd); - auto itpfd = _client_fds.end() - 1; - Client *new_client = new Client(itpfd, client_addr, _conf); + struct pollfd *ppfd = _client_fds.data() + _client_fds.size() -1; + Client *new_client = new Client(ppfd, client_addr, _conf); _client_data.push_back(new_client); } for (size_t i = _fds_server.size(); i < _client_fds.size(); ++i) { - if (_client_fds[i].revents & POLLERR) { - if (_handle_client(_client_fds[i])) { + Client *client = _getClient(_client_fds[i].fd); + if (client == not_nullptr) { + _log->error("client does not exist"); + continue; + } + if (_client_fds[i].revents & POLLIN) { + if (_handle_client(client)) { close(_client_fds[i].fd); _client_fds.erase(_client_fds.begin() + i); delete _client_data[i]; _client_data.erase(_client_data.begin() + i); i--; } - } else if (_client_fds[i].revents & POLLIN) {} - else if() + } } } } diff --git a/src/server/ServerUtils.cpp b/src/server/ServerUtils.cpp index 28e6849..cc583b0 100644 --- a/src/server/ServerUtils.cpp +++ b/src/server/ServerUtils.cpp @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/17 11:58:42 by adjoly #+# #+# */ -/* Updated: 2025/04/25 13:23:13 by adjoly ### ########.fr */ +/* Updated: 2025/04/25 14:53:17 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -84,7 +84,6 @@ bool Server::_handle_client(Client *client) { try { client->parse(); client->answer(); - } catch (std::runtime_error &e) { _log->error(e.what()); return false; @@ -92,3 +91,5 @@ bool Server::_handle_client(Client *client) { return true; } + +