+ MethodType renamed to http_method, and moved to utils.hpp + operator= overload for Client moved to Client.cpp
50 lines
1.1 KiB
C++
50 lines
1.1 KiB
C++
|
|
#include "Webserv.hpp"
|
|
|
|
#define MAX_EVENTS 42 // arbitrary
|
|
#define TIMEOUT 3000
|
|
|
|
void Webserv::run()
|
|
{
|
|
std::cerr << "Server started\n";
|
|
struct epoll_event events[MAX_EVENTS];
|
|
int nfds;
|
|
int i;
|
|
int count_loop = 0;
|
|
|
|
g_run = true;
|
|
while (g_run)
|
|
{
|
|
std::cerr << ++count_loop << "----loop epoll()\n";
|
|
nfds = ::epoll_wait(_epfd, events, MAX_EVENTS, TIMEOUT);
|
|
if (nfds == -1)
|
|
{
|
|
std::perror("err epoll_wait()");
|
|
throw std::runtime_error("Epoll wait");
|
|
}
|
|
else if (nfds == 0)
|
|
{
|
|
if (!_clients.empty())
|
|
{
|
|
std::cerr << "Timeout " << TIMEOUT << "ms\n";
|
|
_close_all_clients();
|
|
}
|
|
}
|
|
i = 0;
|
|
while (i < nfds)
|
|
{
|
|
// TODO : handle EPOLLERR and EPOLLHUP
|
|
if ((std::find(_listen_sockets.begin(), _listen_sockets.end(), events[i].data.fd) != _listen_sockets.end())
|
|
&& (events[i].events & EPOLLIN))
|
|
_accept_connection(events[i].data.fd);
|
|
else if (events[i].events & EPOLLIN)
|
|
_request( &(*std::find(_clients.begin(), _clients.end(), events[i].data.fd)) );
|
|
else if (events[i].events & EPOLLOUT)
|
|
_response( &(*std::find(_clients.begin(), _clients.end(), events[i].data.fd)) );
|
|
++i;
|
|
if (!g_run)
|
|
break;
|
|
}
|
|
}
|
|
}
|