44
55namespace http {
66
7- void HttpServer::InternalHandle (int connection_sd) {
7+ void HttpServer::Worker::HandleConnection (int connection_sd) {
88 char buffer[opts_.max_http_request_size ];
99
1010 int bytes_read = 1 ;
@@ -17,9 +17,6 @@ void HttpServer::InternalHandle(int connection_sd) {
1717 }
1818 if (bytes_read == 0 ) break ;
1919
20- VLOG (1 ) << " Received " << bytes_read << " bytes" ;
21- VLOG (1 ) << buffer;
22-
2320 // Parse the http request
2421 request::HttpRequest request;
2522 request.ParseFromString (buffer);
@@ -34,8 +31,66 @@ void HttpServer::InternalHandle(int connection_sd) {
3431 close (connection_sd);
3532}
3633
34+ void HttpServer::Worker::Stop () {
35+ stopped_ = true ;
36+ thread_.join ();
37+ }
38+
39+ void HttpServer::Worker::Initialize () {
40+ epoll_fd_ = epoll_create1 (0 );
41+ thread_ = std::thread ([this ]() {
42+ struct epoll_event events[MAX_EPOLL_EVENTS];
43+ int num_events;
44+ while (!stopped_) {
45+ num_events = epoll_wait (epoll_fd_, events, MAX_EPOLL_EVENTS, EPOLL_TIMEOUT_MS);
46+ for (int i = 0 ; i < num_events; ++i) {
47+ // Client hang up
48+ if (events[i].events & EPOLLHUP) {
49+ close (events[i].data .fd );
50+ continue ;
51+ }
52+
53+ // Error
54+ if ((events[i].events & EPOLLERR) || !(events[i].events & EPOLLIN)) {
55+ LOG (ERROR) << " Error caught with fd " << events[i].data .fd ;
56+ continue ;
57+ }
58+
59+ HandleConnection (events[i].data .fd );
60+ }
61+ }
62+
63+ });
64+ }
65+
66+ void HttpServer::Worker::AddConnection (int connection_sd) {
67+ struct epoll_event event;
68+ event.data .fd = connection_sd;
69+ event.events = EPOLLIN;
70+
71+ epoll_ctl (epoll_fd_, EPOLL_CTL_ADD, connection_sd, &event);
72+ }
73+
3774void HttpServer::Handle (int connection_sd) {
38- executor_.Execute (std::bind (&HttpServer::InternalHandle, this , connection_sd));
75+ auto &worker = workers_[current_worker_idx_++];
76+ worker->AddConnection (connection_sd);
77+ if (current_worker_idx_ >= workers_.size ()) current_worker_idx_ = 0 ;
78+ }
79+
80+ void HttpServer::Initialize () {
81+ Server::Initialize ();
82+ for (auto &worker : workers_) {
83+ worker->Initialize ();
84+ }
85+ }
86+
87+ response::HttpResponse HttpServer::Worker::HandleRequest (
88+ const request::HttpRequest &request
89+ ) const {
90+ response::HttpResponse response;
91+ response.status_code = response::HTTP_200_OK;
92+ response.body = " ok" ;
93+ return response;
3994}
4095
4196} // namespace http
0 commit comments