85 lines
2.2 KiB
C++
85 lines
2.2 KiB
C++
|
|
#include "Webserv.hpp"
|
|
|
|
#define BUFSIZE 8192
|
|
#define MAX_HEADER_SIZE 42000 // arbitrary
|
|
|
|
void Webserv::_request(Client *client)
|
|
{
|
|
_read_request(client);
|
|
if (g_last_signal)
|
|
_handle_last_signal();
|
|
}
|
|
|
|
void Webserv::_read_request(Client *client) // Messy, Need refactoring
|
|
{
|
|
char buf[BUFSIZE];
|
|
ssize_t ret;
|
|
|
|
std::cerr << "call recv()" << "\n" ;
|
|
ret = ::recv(client->fd, buf, BUFSIZE, 0);
|
|
std::cerr << "recv() on fd(" << client->fd << ") returned = " << ret << "\n" ;
|
|
if (ret == -1)
|
|
{
|
|
std::perror("err recv()");
|
|
std::cerr << "client ptr =" << client << "\n"; // DEBUG
|
|
std::cerr << "client.fd =" << client->fd << "\n"; // DEBUG
|
|
_close_client(client->fd);
|
|
return ;
|
|
}
|
|
if (ret == 0)
|
|
{
|
|
_close_client(client->fd);
|
|
return ;
|
|
}
|
|
|
|
client->raw_request.append(buf, ret);
|
|
if (!client->header_complete)
|
|
{
|
|
if (client->raw_request.find(CRLF CRLF) != std::string::npos)
|
|
{
|
|
client->header_complete = true;
|
|
client->parse_request(); // TODO : split function to avoid useless parsing ?
|
|
client->assigned_server = _determine_process_server(client);
|
|
client->assigned_location = _determine_location(*client->assigned_server, client->get_path());
|
|
if (!client->get_headers("Content-Length").empty()
|
|
&& ::atoi(client->get_headers("Content-Length").c_str()) > (int)client->assigned_server->client_body_limit)
|
|
{
|
|
client->status = 413;
|
|
_epoll_update(client->fd, EPOLLOUT, EPOLL_CTL_MOD);
|
|
return;
|
|
}
|
|
}
|
|
else if (client->raw_request.size() > MAX_HEADER_SIZE)
|
|
{
|
|
client->status = 400;
|
|
_epoll_update(client->fd, EPOLLOUT, EPOLL_CTL_MOD);
|
|
return;
|
|
}
|
|
}
|
|
else if (client->header_complete)
|
|
{
|
|
client->read_body_size += ret;
|
|
if (client->read_body_size > client->assigned_server->client_body_limit)
|
|
{
|
|
client->status = 413;
|
|
_epoll_update(client->fd, EPOLLOUT, EPOLL_CTL_MOD);
|
|
return;
|
|
}
|
|
if ((int)client->read_body_size > ::atoi(client->get_headers("Content-Length").c_str()))
|
|
{
|
|
client->parse_request(); // reparse for the body
|
|
_epoll_update(client->fd, EPOLLOUT, EPOLL_CTL_MOD);
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
if (client->header_complete && client->get_headers("Content-Type").empty() && client->get_headers("Content-Length").empty() )
|
|
{
|
|
_epoll_update(client->fd, EPOLLOUT, EPOLL_CTL_MOD);
|
|
return;
|
|
}
|
|
}
|
|
|