From b243ca893b94ab82c94406f42411728c26629e4d Mon Sep 17 00:00:00 2001 From: 3lswear Date: Sat, 5 Feb 2022 15:06:28 +0300 Subject: [PATCH] feat: done boolean + response to char * --- src/Client/Client.cpp | 22 +++++++++++++++---- src/Client/Client.hpp | 6 +++++- src/Server/Server.cpp | 50 +++++++++++++++++++++++-------------------- 3 files changed, 50 insertions(+), 28 deletions(-) diff --git a/src/Client/Client.cpp b/src/Client/Client.cpp index cda7671..34cbd61 100644 --- a/src/Client/Client.cpp +++ b/src/Client/Client.cpp @@ -5,6 +5,7 @@ Client::Client() { allRead = false; + done = false; this->_fd = -1; this->_sended = 0; } @@ -12,6 +13,7 @@ Client::Client() Client::Client(char *str) { allRead = false; + done = false; this->_fd = -1; this->_buff = str; this->_sended = 0; @@ -21,6 +23,7 @@ Client::Client(char *str) Client::Client(char *str, ServerConfig *config) { allRead = false; + done = false; this->_fd = -1; this->_config = config; this->_buff = str; @@ -40,9 +43,9 @@ Response Client::getResponse(void) return (_response); } -std::string Client::getStrToSend(void) +char *Client::getStrToSend(void) { - return (_toSend); + return (_to_send_char); } int Client::getFd(void) @@ -98,8 +101,8 @@ bool Client::isChunked(void) bool Client::allSended(void) { if (_toSend.size() <= _sended) - return (true); - return (false); + done = true; + return (done); } bool Client::allRecved(void) @@ -134,12 +137,21 @@ int Client::sendResponse(int fd) std::string Client::generateRespons(void) { + size_t len; + _response.setData(_request, _config); _response.generate(); _headerToSend = _response.getHeader(); _bodyToSend = _response.getBody(); _toSend = _headerToSend + _bodyToSend; + + len = _toSend.size(); + response_len = len; + /* _to_send_char = new char[len + 1]; */ + _to_send_char = (char *)malloc(sizeof(char) * (len + 1)); + std::memcpy(_to_send_char, _toSend.c_str(), len + 1); + return (_toSend); } @@ -222,8 +234,10 @@ void Client::clear(void) _bodyToSend = ""; _headerToSend = ""; _toSend = ""; + free(_to_send_char); } Client::~Client() { + DBOUT << "client destructor called" << ENDL; } diff --git a/src/Client/Client.hpp b/src/Client/Client.hpp index 2fd09f7..32927ed 100644 --- a/src/Client/Client.hpp +++ b/src/Client/Client.hpp @@ -6,6 +6,7 @@ #include "ServerConfig.hpp" #include "Request.hpp" #include "Response.hpp" +#include class Client { @@ -25,6 +26,7 @@ private: std::string _bodyToSend; std::string _headerToSend; std::string _toSend; + char *_to_send_char; std::map _errorCode; public: @@ -39,11 +41,13 @@ public: int serverfd; size_t readn; size_t left; + bool done; + size_t response_len; public: Request getRequest(void); Response getResponse(void); - std::string getStrToSend(void); + char *getStrToSend(void); unsigned int getCounter(void) const; void setRawData(char *); void setFd(int); diff --git a/src/Server/Server.cpp b/src/Server/Server.cpp index e65cf92..46214a8 100644 --- a/src/Server/Server.cpp +++ b/src/Server/Server.cpp @@ -59,22 +59,25 @@ void Server::readConfig(void) void Server::sendData(Client &client, int fd) { - std::string tmp = client.getStrToSend(); - unsigned int size_diff = tmp.size() - client.getCounter(); - + /* std::string tmp = client.getStrToSend(); */ + char *tmp = client.getStrToSend(); + size_t size_diff = client.response_len - client.getCounter(); + size_t send_len; if (size_diff < BUFFSIZE) - { - tmp = tmp.substr(client.getCounter(), size_diff); - } + send_len = size_diff; else - tmp = tmp.substr(client.getCounter(), BUFFSIZE); + send_len = BUFFSIZE; /* std::cout << YELLO << tmp << RESET << std::endl; */ /* std::cout << GREEN << client.getCounter() << RESET << std::endl; */ - send(fd, tmp.c_str(), tmp.size(), 0); + if (send(fd, tmp + client.getCounter(), send_len, MSG_NOSIGNAL) < 0) + { + DBOUT << RED << "SEND FAILED !@!!!" << ENDL; + client.done = true; + } client.increaseCounter(); } @@ -86,7 +89,7 @@ void Server::readSocket(Client &client, int fd) int bytes_read; char buf[BUFFSIZE + 1] = {0}; - std::cout << TURQ << "IN readSocket" << RESET << std::endl; + DBOUT << TURQ << "IN readSocket" << RESET << std::endl; bytes_read = recv(fd, buf, BUFFSIZE, 0); if (bytes_read == 0) { @@ -107,7 +110,7 @@ void Server::readSocket(Client &client, int fd) std::cerr << "contentLength " << client.getRequest().getContentLength() << std::endl; std::cerr << "allRead " << client.allRead << std::endl; - std::cout << BLUE << "status is " << Response::getReasonPhrase(status) << RESET << std::endl; + DBOUT << BLUE << "status is " << Response::getReasonPhrase(status) << RESET << std::endl; bzero(buf, BUFFSIZE); } @@ -142,19 +145,18 @@ void Server::start(void) { Socket server_sock(AF_INET, SOCK_STREAM, 0, _port, "127.0.0.1"); std::map client_map; - std::map::iterator client_it; int fd; int ready_num = 0; unsigned int client_events = EPOLLIN; - unsigned int server_events = EPOLLIN | EPOLLOUT; + unsigned int server_events = EPOLLIN; _epoll_fd = epoll_create(1337); checkError(server_sock.init(MAX_CLIENT), "Socket init"); setNonBlock(server_sock.getSocketFd()); setNonBlock(_epoll_fd); - std::cerr << YELLO << "adding server_sock..." << RESET << std::endl; + DBOUT << YELLO << "adding server_sock..." << ENDL; add_to_epoll_list(server_sock.getSocketFd(), server_events); while (1) { @@ -169,8 +171,8 @@ void Server::start(void) fd = _events[i].data.fd; unsigned int events = _events[i].events; - DBOUT << "FD is " << fd << ENDL; - print_epoll_events(events); + /* DBOUT << "FD is " << fd << ENDL; */ + /* print_epoll_events(events); */ if (fd == server_sock.getSocketFd()) { @@ -183,15 +185,18 @@ void Server::start(void) } else { - std::cout << TURQ << "IN FOR LOOP" << RESET << std::endl; + /* DBOUT << TURQ << "IN FOR LOOP" << RESET << std::endl; */ /* _client--; */ - client_map[fd]; + /* client_map[fd]; */ + /* client_map.insert(std::make_pair(fd, Client())); */ if (events & EPOLLIN) { DBOUT << GREEN << "doing readSocket" << ENDL; readSocket(client_map[fd], fd); if (client_map[fd].readyToSend()) { + client_map[fd].generateRespons(); + struct epoll_event ev; ev.events = EPOLLOUT; @@ -202,14 +207,14 @@ void Server::start(void) } else if (events & EPOLLOUT) { - DBOUT << GREEN << "doing sendData" << ENDL; - client_map[fd].printClientInfo(); - client_map[fd].generateRespons(); + /* DBOUT << GREEN << "doing sendData" << ENDL; */ + /* client_map[fd].printClientInfo(); */ sendData(client_map[fd], fd); - if ((client_map[fd].readyToSend() && client_map[fd].allSended())) + if (client_map[fd].allSended()) { epoll_ctl(_epoll_fd, EPOLL_CTL_DEL, fd, NULL); close(fd); + client_map[fd].clear(); client_map.erase(fd); DBOUT << RED << "deleting client " @@ -219,11 +224,10 @@ void Server::start(void) } } } - ready_num = 0; } close(server_sock.getSocketFd()); - std::cerr << "end;" << std::endl; + DBOUT << RED << "end;" << ENDL; }