refactor(server): change functions signature
This commit is contained in:
@@ -31,14 +31,14 @@ typedef struct cws_server {
|
|||||||
cws_config_s *config;
|
cws_config_s *config;
|
||||||
} cws_server_s;
|
} cws_server_s;
|
||||||
|
|
||||||
cws_server_ret cws_server_setup(cws_config_s *config, cws_server_s *server);
|
cws_server_ret cws_server_setup(cws_server_s *server, cws_config_s *config);
|
||||||
|
|
||||||
cws_server_ret cws_server_loop(cws_server_s *server);
|
cws_server_ret cws_server_start(cws_server_s *server);
|
||||||
|
|
||||||
void cws_server_shutdown(cws_server_s *server);
|
void cws_server_shutdown(cws_server_s *server);
|
||||||
|
|
||||||
int cws_server_handle_new_client(int server_fd);
|
int cws_server_handle_new_client(int server_fd);
|
||||||
|
|
||||||
int cws_server_accept_client(int server_fd, struct sockaddr_storage *their_sa, socklen_t *theirsa_size);
|
int cws_server_accept_client(int server_fd, struct sockaddr_storage *their_sa);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ void *cws_worker_loop(void *arg);
|
|||||||
|
|
||||||
void cws_server_close_client(int epfd, int client_fd);
|
void cws_server_close_client(int epfd, int client_fd);
|
||||||
|
|
||||||
cws_server_ret cws_epoll_add(int epfd, int sockfd, uint32_t events);
|
cws_server_ret cws_epoll_add(int epfd, int sockfd);
|
||||||
|
|
||||||
cws_server_ret cws_epoll_del(int epfd, int sockfd);
|
cws_server_ret cws_epoll_del(int epfd, int sockfd);
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
#define _XOPEN_SOURCE 1
|
||||||
|
|
||||||
#include "http/http.h"
|
#include "http/http.h"
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#define _XOPEN_SOURCE 700
|
#define _XOPEN_SOURCE 1
|
||||||
|
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -32,13 +32,13 @@ int main(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
cws_server_s server;
|
cws_server_s server;
|
||||||
cws_server_ret ret = cws_server_setup(config, &server);
|
cws_server_ret ret = cws_server_setup(&server, config);
|
||||||
if (ret != CWS_SERVER_OK) {
|
if (ret != CWS_SERVER_OK) {
|
||||||
CWS_LOG_ERROR("Unable to setup web server");
|
CWS_LOG_ERROR("Unable to setup web server");
|
||||||
}
|
}
|
||||||
|
|
||||||
CWS_LOG_INFO("Running cws on http://%s:%s...", config->hostname, config->port);
|
CWS_LOG_INFO("Running cws on http://%s:%s...", config->hostname, config->port);
|
||||||
ret = cws_server_loop(&server);
|
ret = cws_server_start(&server);
|
||||||
if (ret != CWS_SERVER_OK) {
|
if (ret != CWS_SERVER_OK) {
|
||||||
CWS_LOG_ERROR("Unable to start web server");
|
CWS_LOG_ERROR("Unable to start web server");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,13 +38,13 @@ static cws_server_ret cws_server_setup_epoll(int server_fd, int *epfd_out) {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
cws_epoll_add(epfd, server_fd, EPOLLIN);
|
cws_epoll_add(epfd, server_fd);
|
||||||
*epfd_out = epfd;
|
*epfd_out = epfd;
|
||||||
|
|
||||||
return CWS_SERVER_OK;
|
return CWS_SERVER_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
cws_server_ret cws_server_setup(cws_config_s *config, cws_server_s *server) {
|
cws_server_ret cws_server_setup(cws_server_s *server, cws_config_s *config) {
|
||||||
if (!config || !config->hostname || !config->port) {
|
if (!config || !config->hostname || !config->port) {
|
||||||
return CWS_SERVER_CONFIG;
|
return CWS_SERVER_CONFIG;
|
||||||
}
|
}
|
||||||
@@ -103,7 +103,7 @@ cws_server_ret cws_server_setup(cws_config_s *config, cws_server_s *server) {
|
|||||||
return CWS_SERVER_OK;
|
return CWS_SERVER_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
cws_server_ret cws_server_loop(cws_server_s *server) {
|
cws_server_ret cws_server_start(cws_server_s *server) {
|
||||||
struct epoll_event events[128];
|
struct epoll_event events[128];
|
||||||
memset(events, 0, sizeof(events));
|
memset(events, 0, sizeof(events));
|
||||||
int client_fd = 0;
|
int client_fd = 0;
|
||||||
@@ -141,10 +141,9 @@ cws_server_ret cws_server_loop(cws_server_s *server) {
|
|||||||
|
|
||||||
int cws_server_handle_new_client(int server_fd) {
|
int cws_server_handle_new_client(int server_fd) {
|
||||||
struct sockaddr_storage their_sa;
|
struct sockaddr_storage their_sa;
|
||||||
socklen_t theirsa_size = sizeof their_sa;
|
|
||||||
char ip[INET_ADDRSTRLEN];
|
char ip[INET_ADDRSTRLEN];
|
||||||
|
|
||||||
int client_fd = cws_server_accept_client(server_fd, &their_sa, &theirsa_size);
|
int client_fd = cws_server_accept_client(server_fd, &their_sa);
|
||||||
if (client_fd < 0) {
|
if (client_fd < 0) {
|
||||||
return client_fd;
|
return client_fd;
|
||||||
}
|
}
|
||||||
@@ -155,8 +154,9 @@ int cws_server_handle_new_client(int server_fd) {
|
|||||||
return client_fd;
|
return client_fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cws_server_accept_client(int server_fd, struct sockaddr_storage *their_sa, socklen_t *theirsa_size) {
|
int cws_server_accept_client(int server_fd, struct sockaddr_storage *their_sa) {
|
||||||
const int client_fd = accept(server_fd, (struct sockaddr *)their_sa, theirsa_size);
|
socklen_t theirsa_size = sizeof(struct sockaddr_storage);
|
||||||
|
const int client_fd = accept(server_fd, (struct sockaddr *)their_sa, &theirsa_size);
|
||||||
|
|
||||||
if (client_fd == -1) {
|
if (client_fd == -1) {
|
||||||
if (errno != EWOULDBLOCK) {
|
if (errno != EWOULDBLOCK) {
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ static int cws_worker_setup_epoll(cws_worker_s *worker) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = cws_epoll_add(worker->epfd, worker->pipefd[0], EPOLLIN);
|
ret = cws_epoll_add(worker->epfd, worker->pipefd[0]);
|
||||||
if (ret != CWS_SERVER_OK) {
|
if (ret != CWS_SERVER_OK) {
|
||||||
sock_close(worker->epfd);
|
sock_close(worker->epfd);
|
||||||
sock_close(worker->pipefd[0]);
|
sock_close(worker->pipefd[0]);
|
||||||
@@ -34,6 +34,41 @@ static int cws_worker_setup_epoll(cws_worker_s *worker) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static size_t cws_read_data(int sockfd, string_s **str) {
|
||||||
|
size_t total_bytes = 0;
|
||||||
|
ssize_t bytes_read;
|
||||||
|
|
||||||
|
if (*str == NULL) {
|
||||||
|
*str = string_new("", 4096);
|
||||||
|
}
|
||||||
|
|
||||||
|
char tmp[4096];
|
||||||
|
memset(tmp, 0, sizeof(tmp));
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
bytes_read = recv(sockfd, tmp, sizeof(tmp), 0);
|
||||||
|
|
||||||
|
if (bytes_read == -1) {
|
||||||
|
if (errno == EAGAIN || errno == EWOULDBLOCK) {
|
||||||
|
break;
|
||||||
|
} else if (errno == ECONNRESET) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
CWS_LOG_ERROR("recv(): %s", strerror(errno));
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
} else if (bytes_read == 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
total_bytes += bytes_read;
|
||||||
|
string_append(*str, tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
return total_bytes;
|
||||||
|
}
|
||||||
|
|
||||||
cws_worker_s **cws_worker_new(size_t workers_num, cws_config_s *config) {
|
cws_worker_s **cws_worker_new(size_t workers_num, cws_config_s *config) {
|
||||||
cws_worker_s **workers = malloc(sizeof(cws_worker_s) * workers_num);
|
cws_worker_s **workers = malloc(sizeof(cws_worker_s) * workers_num);
|
||||||
if (workers == NULL) {
|
if (workers == NULL) {
|
||||||
@@ -113,7 +148,7 @@ void *cws_worker_loop(void *arg) {
|
|||||||
int client_fd;
|
int client_fd;
|
||||||
read(worker->pipefd[0], &client_fd, sizeof(int));
|
read(worker->pipefd[0], &client_fd, sizeof(int));
|
||||||
cws_fd_set_nonblocking(client_fd);
|
cws_fd_set_nonblocking(client_fd);
|
||||||
cws_epoll_add(worker->epfd, client_fd, EPOLLIN | EPOLLET);
|
cws_epoll_add(worker->epfd, client_fd);
|
||||||
} else {
|
} else {
|
||||||
/* Handle client data */
|
/* Handle client data */
|
||||||
int client_fd = events[i].data.fd;
|
int client_fd = events[i].data.fd;
|
||||||
@@ -130,9 +165,9 @@ void cws_server_close_client(int epfd, int client_fd) {
|
|||||||
sock_close(client_fd);
|
sock_close(client_fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
cws_server_ret cws_epoll_add(int epfd, int sockfd, uint32_t events) {
|
cws_server_ret cws_epoll_add(int epfd, int sockfd) {
|
||||||
struct epoll_event event;
|
struct epoll_event event;
|
||||||
event.events = events;
|
event.events = EPOLLIN | EPOLLET;
|
||||||
event.data.fd = sockfd;
|
event.data.fd = sockfd;
|
||||||
const int status = epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd, &event);
|
const int status = epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd, &event);
|
||||||
|
|
||||||
@@ -155,43 +190,7 @@ cws_server_ret cws_epoll_del(int epfd, int sockfd) {
|
|||||||
return CWS_SERVER_OK;
|
return CWS_SERVER_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static size_t cws_read_data(int sockfd, string_s **str) {
|
|
||||||
size_t total_bytes = 0;
|
|
||||||
ssize_t bytes_read;
|
|
||||||
|
|
||||||
if (*str == NULL) {
|
|
||||||
*str = string_new("", 4096);
|
|
||||||
}
|
|
||||||
|
|
||||||
char tmp[4096];
|
|
||||||
memset(tmp, 0, sizeof(tmp));
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
bytes_read = recv(sockfd, tmp, sizeof(tmp), 0);
|
|
||||||
|
|
||||||
if (bytes_read == -1) {
|
|
||||||
if (errno == EAGAIN || errno == EWOULDBLOCK) {
|
|
||||||
break;
|
|
||||||
} else if (errno == ECONNRESET) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
CWS_LOG_ERROR("recv(): %s", strerror(errno));
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
} else if (bytes_read == 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
total_bytes += bytes_read;
|
|
||||||
string_append(*str, tmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
return total_bytes;
|
|
||||||
}
|
|
||||||
|
|
||||||
cws_server_ret cws_server_handle_client_data(int epfd, int client_fd) {
|
cws_server_ret cws_server_handle_client_data(int epfd, int client_fd) {
|
||||||
/* Read data from socket */
|
|
||||||
string_s *data;
|
string_s *data;
|
||||||
size_t total_bytes = cws_read_data(client_fd, &data);
|
size_t total_bytes = cws_read_data(client_fd, &data);
|
||||||
if (total_bytes <= 0) {
|
if (total_bytes <= 0) {
|
||||||
@@ -203,7 +202,6 @@ cws_server_ret cws_server_handle_client_data(int epfd, int client_fd) {
|
|||||||
return CWS_SERVER_CLIENT_DISCONNECTED_ERROR;
|
return CWS_SERVER_CLIENT_DISCONNECTED_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Parse HTTP request */
|
|
||||||
cws_http_s *request = cws_http_parse(data, client_fd);
|
cws_http_s *request = cws_http_parse(data, client_fd);
|
||||||
string_free(data);
|
string_free(data);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user