Files
webserv/src/Client/Client.cpp
2022-02-07 22:43:14 +03:00

267 lines
6.1 KiB
C++

#include "Client.hpp"
//-------------------------------------------------Constructors---------------------------------------
Client::Client()
{
allRead = false;
done = false;
this->_fd = -1;
this->_sended = 0;
_to_send_char = NULL;
}
Client::Client(char *str)
{
allRead = false;
done = false;
this->_fd = -1;
this->_buff = str;
this->_sended = 0;
_to_send_char = NULL;
}
Client::Client(char *str, ServerConfig *config)
{
_to_send_char = NULL;
allRead = false;
done = false;
this->_fd = -1;
this->_config = config;
this->_buff = str;
this->_sended = 0;
}
//-------------------------------------------------GET/SET---------------------------------------
Request Client::getRequest(void)
{
return (_request);
}
Response Client::getResponse(void)
{
return (_response);
}
char *Client::getStrToSend(void)
{
return (_to_send_char);
}
int Client::getFd(void)
{
return _fd;
}
unsigned int Client::getCounter(void) const
{
return _sended;
}
unsigned int Client::getRecvCounter(void) const
{
return _request.getRecved();
}
void Client::setRawData(char *str)
{
this->_buff = str;
}
void Client::setRawData(std::string &buf)
{
_stringBUF = buf;
}
void Client::setFd(int fd)
{
this->_fd = fd;
}
//-------------------------------------------------Parsing---------------------------------------
int Client::parseRequest(void)
{
// _request.setData(_buff);
_request.setData(_stringBUF);
_ret = _request.parseRequest();
return (_ret);
}
//-------------------------------------------------FILE---------------------------------------
//-------------------------------------------------SEND---------------------------------------
int Client::sendData(int fd, std::string data)
{
return (send(fd, data.c_str(), data.length(), 0));
}
//Возвращает истина, если запрос chunked.
bool Client::isChunked(void)
{
return (_request.getChunked());
}
// Возвращает истина, если отправлены все данные клиента.
bool Client::allSended(void)
{
if (_toSend.size() <= _sended)
done = true;
return (done);
}
bool Client::allRecved(void)
{
if (_request.getContentLength() == (_request.getRecved() - _request.getHeaderSize()))
return (true);
else
return (false);
}
// Функция увеличивает счетчик на количество BUFFERSIZE. Счетчик - количество байтов отправленных клиенту.
void Client::increaseCounter(void)
{
_sended += BUFFSIZE;
}
void Client::increaseRecvCounter(unsigned int n)
{
_request.increaseRecvCounter(n);
}
//Генерирует response. Далее респонс можно получить через функцию getStrToSend()
int Client::sendResponse(int fd)
{
_response.setData(_request, _config);
_response.generate();
_headerToSend = _response.getHeader();
_bodyToSend = _response.getBody();
_ret = sendData(fd, _headerToSend + _bodyToSend);
return (_ret);
}
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];
std::memcpy(_to_send_char, _toSend.c_str(), len + 1);
// DBOUT << "len = " << len << ENDL;
// DBOUT << "strlen = " << strlen(_to_send_char) << ENDL;
// DBOUT << "content_lenth = " << _request.getContentLength() << ENDL;
return (_toSend);
}
std::string Client::generateRespons(serverListen &reqData, std::vector<ServerConfig *> &configs)
{
size_t len;
location *tmp;
_config = Config::getConfig(configs, _request, reqData);
tmp = Config::getLocation(_config->getLocations(), _request.getURI());
_response.setData(_request, _config, tmp);
_response.generate2();
_headerToSend = _response.getHeader();
_bodyToSend = _response.getBody();
_toSend = _headerToSend + _bodyToSend;
len = _toSend.size();
response_len = len;
_to_send_char = new char[len + 1];
std::memcpy(_to_send_char, _toSend.c_str(), len + 1);
return (_toSend);
}
//-------------------------------------------------Error---------------------------------------
//-------------------------------------------------Other---------------------------------------
bool Client::readyToSend(void)
{
if (_request.ok())
return(_request.ok());
else
return false;
}
void Client::printClientInfo(void)
{
std::map<std::string, std::string> map;
std::map<std::string, std::string>::iterator it;
std::map<std::string, std::string>::iterator it1;
map = _request.getClientFields();
std::cout << BLUE << std::endl << "PARSED REQUEST" << ZERO_C << std::endl << std::endl;
std::cout << GREEN << "request method = " << _request.getMethod() << ZERO_C << std::endl;
std::cout << GREEN << "request URI = " << _request.getURI() << ZERO_C << std::endl;
std::cout << GREEN << "host = " << _request.getHost() << ZERO_C << std::endl;
std::cout << GREEN << "request query = " << _request.getQuery() << ZERO_C << std::endl;
std::cout << GREEN << "request http versioin = " << _request.getVersion() << ZERO_C << std::endl;
std::cout << GREEN << "content-length = " << _request.getContentLength() << ZERO_C << std::endl;
std::cout << GREEN << "connection type = " << _request.getConnection() << ZERO_C << std::endl;
std::cout << BLUE << std::endl << "RESPONSE" << ZERO_C << std::endl << std::endl;
std::cout << GREEN << _response.getHeader() << ZERO_C << std::endl;
}
bool Client::isEmpty(void)
{
if (!_request.ok() && _request.getHeaderSize() == 0
&& _request.getContentLength() == 0)
return (true);
else
return (false);
}
bool Client::TimeToDie(void)
{
struct timeval curTime;
gettimeofday(&curTime, NULL);
if ((curTime.tv_sec - _time.tv_sec) >= _request.getLifeTime())
return (true);
else
return (false);
}
void Client::updateTimeToDie(void)
{
gettimeofday(&_time, NULL);
}
void Client::clear(void)
{
_fd = -1;
_buff = NULL;
_ret = 200;
_request.clear();
_buff = NULL;
_config = NULL;
_bodyToSend = "";
_headerToSend = "";
_toSend = "";
if (_to_send_char)
delete[] _to_send_char;
}
Client::~Client()
{
DBOUT << "client destructor called" << ENDL;
}