mirror of
https://github.com/3lswear/webserv.git
synced 2025-10-29 13:27:59 +03:00
feat: done boolean + response to char *
This commit is contained in:
@@ -5,6 +5,7 @@
|
|||||||
Client::Client()
|
Client::Client()
|
||||||
{
|
{
|
||||||
allRead = false;
|
allRead = false;
|
||||||
|
done = false;
|
||||||
this->_fd = -1;
|
this->_fd = -1;
|
||||||
this->_sended = 0;
|
this->_sended = 0;
|
||||||
}
|
}
|
||||||
@@ -12,6 +13,7 @@ Client::Client()
|
|||||||
Client::Client(char *str)
|
Client::Client(char *str)
|
||||||
{
|
{
|
||||||
allRead = false;
|
allRead = false;
|
||||||
|
done = false;
|
||||||
this->_fd = -1;
|
this->_fd = -1;
|
||||||
this->_buff = str;
|
this->_buff = str;
|
||||||
this->_sended = 0;
|
this->_sended = 0;
|
||||||
@@ -21,6 +23,7 @@ Client::Client(char *str)
|
|||||||
Client::Client(char *str, ServerConfig *config)
|
Client::Client(char *str, ServerConfig *config)
|
||||||
{
|
{
|
||||||
allRead = false;
|
allRead = false;
|
||||||
|
done = false;
|
||||||
this->_fd = -1;
|
this->_fd = -1;
|
||||||
this->_config = config;
|
this->_config = config;
|
||||||
this->_buff = str;
|
this->_buff = str;
|
||||||
@@ -40,9 +43,9 @@ Response Client::getResponse(void)
|
|||||||
return (_response);
|
return (_response);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Client::getStrToSend(void)
|
char *Client::getStrToSend(void)
|
||||||
{
|
{
|
||||||
return (_toSend);
|
return (_to_send_char);
|
||||||
}
|
}
|
||||||
|
|
||||||
int Client::getFd(void)
|
int Client::getFd(void)
|
||||||
@@ -98,8 +101,8 @@ bool Client::isChunked(void)
|
|||||||
bool Client::allSended(void)
|
bool Client::allSended(void)
|
||||||
{
|
{
|
||||||
if (_toSend.size() <= _sended)
|
if (_toSend.size() <= _sended)
|
||||||
return (true);
|
done = true;
|
||||||
return (false);
|
return (done);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Client::allRecved(void)
|
bool Client::allRecved(void)
|
||||||
@@ -134,12 +137,21 @@ int Client::sendResponse(int fd)
|
|||||||
|
|
||||||
std::string Client::generateRespons(void)
|
std::string Client::generateRespons(void)
|
||||||
{
|
{
|
||||||
|
size_t len;
|
||||||
|
|
||||||
_response.setData(_request, _config);
|
_response.setData(_request, _config);
|
||||||
_response.generate();
|
_response.generate();
|
||||||
_headerToSend = _response.getHeader();
|
_headerToSend = _response.getHeader();
|
||||||
_bodyToSend = _response.getBody();
|
_bodyToSend = _response.getBody();
|
||||||
_toSend = _headerToSend + _bodyToSend;
|
_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);
|
return (_toSend);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -222,8 +234,10 @@ void Client::clear(void)
|
|||||||
_bodyToSend = "";
|
_bodyToSend = "";
|
||||||
_headerToSend = "";
|
_headerToSend = "";
|
||||||
_toSend = "";
|
_toSend = "";
|
||||||
|
free(_to_send_char);
|
||||||
}
|
}
|
||||||
|
|
||||||
Client::~Client()
|
Client::~Client()
|
||||||
{
|
{
|
||||||
|
DBOUT << "client destructor called" << ENDL;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
#include "ServerConfig.hpp"
|
#include "ServerConfig.hpp"
|
||||||
#include "Request.hpp"
|
#include "Request.hpp"
|
||||||
#include "Response.hpp"
|
#include "Response.hpp"
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
class Client
|
class Client
|
||||||
{
|
{
|
||||||
@@ -25,6 +26,7 @@ private:
|
|||||||
std::string _bodyToSend;
|
std::string _bodyToSend;
|
||||||
std::string _headerToSend;
|
std::string _headerToSend;
|
||||||
std::string _toSend;
|
std::string _toSend;
|
||||||
|
char *_to_send_char;
|
||||||
std::map<std::string, std::string> _errorCode;
|
std::map<std::string, std::string> _errorCode;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -39,11 +41,13 @@ public:
|
|||||||
int serverfd;
|
int serverfd;
|
||||||
size_t readn;
|
size_t readn;
|
||||||
size_t left;
|
size_t left;
|
||||||
|
bool done;
|
||||||
|
size_t response_len;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Request getRequest(void);
|
Request getRequest(void);
|
||||||
Response getResponse(void);
|
Response getResponse(void);
|
||||||
std::string getStrToSend(void);
|
char *getStrToSend(void);
|
||||||
unsigned int getCounter(void) const;
|
unsigned int getCounter(void) const;
|
||||||
void setRawData(char *);
|
void setRawData(char *);
|
||||||
void setFd(int);
|
void setFd(int);
|
||||||
|
|||||||
@@ -59,22 +59,25 @@ void Server::readConfig(void)
|
|||||||
|
|
||||||
void Server::sendData(Client &client, int fd)
|
void Server::sendData(Client &client, int fd)
|
||||||
{
|
{
|
||||||
std::string tmp = client.getStrToSend();
|
/* std::string tmp = client.getStrToSend(); */
|
||||||
unsigned int size_diff = tmp.size() - client.getCounter();
|
char *tmp = client.getStrToSend();
|
||||||
|
size_t size_diff = client.response_len - client.getCounter();
|
||||||
|
size_t send_len;
|
||||||
|
|
||||||
if (size_diff < BUFFSIZE)
|
if (size_diff < BUFFSIZE)
|
||||||
{
|
send_len = size_diff;
|
||||||
tmp = tmp.substr(client.getCounter(), size_diff);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
tmp = tmp.substr(client.getCounter(), BUFFSIZE);
|
send_len = BUFFSIZE;
|
||||||
|
|
||||||
/* std::cout << YELLO << tmp << RESET << std::endl; */
|
/* std::cout << YELLO << tmp << RESET << std::endl; */
|
||||||
/* std::cout << GREEN << client.getCounter() << 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();
|
client.increaseCounter();
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -86,7 +89,7 @@ void Server::readSocket(Client &client, int fd)
|
|||||||
int bytes_read;
|
int bytes_read;
|
||||||
char buf[BUFFSIZE + 1] = {0};
|
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);
|
bytes_read = recv(fd, buf, BUFFSIZE, 0);
|
||||||
if (bytes_read == 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 << "contentLength " << client.getRequest().getContentLength() << std::endl;
|
||||||
std::cerr << "allRead " << client.allRead << 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);
|
bzero(buf, BUFFSIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -142,19 +145,18 @@ void Server::start(void)
|
|||||||
{
|
{
|
||||||
Socket server_sock(AF_INET, SOCK_STREAM, 0, _port, "127.0.0.1");
|
Socket server_sock(AF_INET, SOCK_STREAM, 0, _port, "127.0.0.1");
|
||||||
std::map<int, Client> client_map;
|
std::map<int, Client> client_map;
|
||||||
std::map<int, Client>::iterator client_it;
|
|
||||||
int fd;
|
int fd;
|
||||||
int ready_num = 0;
|
int ready_num = 0;
|
||||||
|
|
||||||
unsigned int client_events = EPOLLIN;
|
unsigned int client_events = EPOLLIN;
|
||||||
unsigned int server_events = EPOLLIN | EPOLLOUT;
|
unsigned int server_events = EPOLLIN;
|
||||||
|
|
||||||
_epoll_fd = epoll_create(1337);
|
_epoll_fd = epoll_create(1337);
|
||||||
checkError(server_sock.init(MAX_CLIENT), "Socket init");
|
checkError(server_sock.init(MAX_CLIENT), "Socket init");
|
||||||
setNonBlock(server_sock.getSocketFd());
|
setNonBlock(server_sock.getSocketFd());
|
||||||
setNonBlock(_epoll_fd);
|
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);
|
add_to_epoll_list(server_sock.getSocketFd(), server_events);
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
@@ -169,8 +171,8 @@ void Server::start(void)
|
|||||||
fd = _events[i].data.fd;
|
fd = _events[i].data.fd;
|
||||||
unsigned int events = _events[i].events;
|
unsigned int events = _events[i].events;
|
||||||
|
|
||||||
DBOUT << "FD is " << fd << ENDL;
|
/* DBOUT << "FD is " << fd << ENDL; */
|
||||||
print_epoll_events(events);
|
/* print_epoll_events(events); */
|
||||||
|
|
||||||
if (fd == server_sock.getSocketFd())
|
if (fd == server_sock.getSocketFd())
|
||||||
{
|
{
|
||||||
@@ -183,15 +185,18 @@ void Server::start(void)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::cout << TURQ << "IN FOR LOOP" << RESET << std::endl;
|
/* DBOUT << TURQ << "IN FOR LOOP" << RESET << std::endl; */
|
||||||
/* _client--; */
|
/* _client--; */
|
||||||
client_map[fd];
|
/* client_map[fd]; */
|
||||||
|
/* client_map.insert(std::make_pair(fd, Client())); */
|
||||||
if (events & EPOLLIN)
|
if (events & EPOLLIN)
|
||||||
{
|
{
|
||||||
DBOUT << GREEN << "doing readSocket" << ENDL;
|
DBOUT << GREEN << "doing readSocket" << ENDL;
|
||||||
readSocket(client_map[fd], fd);
|
readSocket(client_map[fd], fd);
|
||||||
if (client_map[fd].readyToSend())
|
if (client_map[fd].readyToSend())
|
||||||
{
|
{
|
||||||
|
client_map[fd].generateRespons();
|
||||||
|
|
||||||
struct epoll_event ev;
|
struct epoll_event ev;
|
||||||
|
|
||||||
ev.events = EPOLLOUT;
|
ev.events = EPOLLOUT;
|
||||||
@@ -202,14 +207,14 @@ void Server::start(void)
|
|||||||
}
|
}
|
||||||
else if (events & EPOLLOUT)
|
else if (events & EPOLLOUT)
|
||||||
{
|
{
|
||||||
DBOUT << GREEN << "doing sendData" << ENDL;
|
/* DBOUT << GREEN << "doing sendData" << ENDL; */
|
||||||
client_map[fd].printClientInfo();
|
/* client_map[fd].printClientInfo(); */
|
||||||
client_map[fd].generateRespons();
|
|
||||||
sendData(client_map[fd], fd);
|
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);
|
epoll_ctl(_epoll_fd, EPOLL_CTL_DEL, fd, NULL);
|
||||||
close(fd);
|
close(fd);
|
||||||
|
client_map[fd].clear();
|
||||||
client_map.erase(fd);
|
client_map.erase(fd);
|
||||||
DBOUT << RED <<
|
DBOUT << RED <<
|
||||||
"deleting client "
|
"deleting client "
|
||||||
@@ -219,11 +224,10 @@ void Server::start(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ready_num = 0;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
close(server_sock.getSocketFd());
|
close(server_sock.getSocketFd());
|
||||||
std::cerr << "end;" << std::endl;
|
DBOUT << RED << "end;" << ENDL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user