#include "Webserv.hpp" #define BUFSIZE 8192 #define MAX_HEADER_SIZE 42000 #define MAX_BODY_SIZE 500000 // test macro, replace with server config void Webserv::_request(Client *client) { _read_request(client); if (g_last_signal) _handle_last_signal(); } void Webserv::_read_request(Client *client) { 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 ? // TODO : determine server here for body size limit if (!client->get_headers("Content-Length").empty() && ::atoi(client->get_headers("Content-Length").c_str()) > MAX_BODY_SIZE) { 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 > MAX_BODY_SIZE) { 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; } }