aboutsummaryrefslogtreecommitdiff
path: root/websocksy.c
diff options
context:
space:
mode:
authorcbdev <cb@cbcdn.com>2019-05-17 19:41:14 +0200
committercbdev <cb@cbcdn.com>2019-05-17 19:41:14 +0200
commitd28b5eb2960e80d80e967a3f01ce70e1fa457808 (patch)
treef19f22d441f9e66c9c17476477707e65d5e425cc /websocksy.c
parent10874eb2195d3e6ceed8e8a76aaf4455e41c8683 (diff)
downloadwebsocksy-d28b5eb2960e80d80e967a3f01ce70e1fa457808.tar.gz
websocksy-d28b5eb2960e80d80e967a3f01ce70e1fa457808.tar.bz2
websocksy-d28b5eb2960e80d80e967a3f01ce70e1fa457808.zip
Split out websocket handling, HTTP header processing
Diffstat (limited to 'websocksy.c')
-rw-r--r--websocksy.c142
1 files changed, 12 insertions, 130 deletions
diff --git a/websocksy.c b/websocksy.c
index cc5b9e0..f193ae6 100644
--- a/websocksy.c
+++ b/websocksy.c
@@ -10,6 +10,7 @@
#include <fcntl.h>
#include "websocksy.h"
+#include "ws_proto.c"
/* TODO
* - TLS
@@ -17,9 +18,6 @@
* - Prevent http overrun
*/
-static size_t socks = 0;
-static websocket* sock = NULL;
-
static volatile sig_atomic_t shutdown_requested = 0;
void signal_handler(int signum){
@@ -121,122 +119,14 @@ int network_socket(char* host, char* port, int socktype, int listener){
return fd;
}
-int ws_close(websocket* ws){
- size_t p;
-
- if(ws->fd >= 0){
- close(ws->fd);
- ws->fd = -1;
- }
-
- for(p = 0; p < ws->protocols; p++){
- if(ws->protocol[p].fd >= 0){
- close(ws->protocol[p].fd);
- ws->protocol[p].fd = -1;
- free(ws->protocol[p].name);
- ws->protocol[p].name = NULL;
- }
- }
-
- ws->read_buffer_offset = 0;
-
- return 0;
-}
-
-int ws_accept(int listen_fd){
- size_t n = 0;
-
- websocket ws = {
- .fd = accept(listen_fd, NULL, NULL)
- };
-
- //try to find a slot to occupy
- for(n = 0; n < socks; n++){
- if(sock[n].fd == -1){
- break;
- }
- }
-
- //none found, need to extend
- if(n == socks){
- sock = realloc(sock, (socks + 1) * sizeof(websocket));
- if(!sock){
- close(ws.fd);
- fprintf(stderr, "Failed to allocate memory\n");
- shutdown_requested = 1;
- return 1;
- }
- socks++;
- }
-
- sock[n] = ws;
-
- return 0;
-}
-
-int ws_data(websocket* ws){
- ssize_t bytes_read, u, bytes_left = sizeof(ws->read_buffer) - ws->read_buffer_offset;
-
- bytes_read = recv(ws->fd, ws->read_buffer + ws->read_buffer_offset, bytes_left - 1, 0);
- if(bytes_read < 0){
- fprintf(stderr, "Failed to receive from websocket: %s\n", strerror(errno));
- ws_close(ws);
- return 0;
- }
- else if(bytes_read == 0){
- //client closed connection
- ws_close(ws);
- return 0;
- }
-
- //terminate new data
- ws->read_buffer[ws->read_buffer_offset + bytes_read] = 0;
-
- switch(ws->state){
- case ws_new:
- case ws_http:
- //scan for newline, handle line
- for(u = 0; u < bytes_read - 1; u++){
- if(!strncmp((char*) ws->read_buffer + ws->read_buffer_offset + u, "\r\n", 2)){
- //terminate line
- ws->read_buffer[ws->read_buffer_offset + u] = 0;
-
- fprintf(stderr, "Line: %s\n", ws->read_buffer);
-
- //remove from buffer
- bytes_read -= (u + 2);
- memmove(ws->read_buffer, ws->read_buffer + ws->read_buffer_offset + u + 2, bytes_read);
- ws->read_buffer_offset = 0;
-
- //restart from the beginning
- u = -1;
- }
- }
- break;
- //case ws_rfc6455:
- //TODO parse websocket encap, forward to peer
- }
-
- //update read buffer offset
- ws->read_buffer_offset = bytes_read;
-
- //disconnect spammy clients
- if(sizeof(ws->read_buffer) - ws->read_buffer_offset < 2){
- fprintf(stderr, "Disconnecting misbehaving client\n");
- ws_close(ws);
- return 0;
- }
- return 0;
-}
-
-int ws_peer_data(websocket* ws, size_t proto){
+int ws_peer_data(websocket* ws){
//TODO
return -1;
}
int main(int argc, char** argv){
fd_set read_fds;
- size_t n, p;
+ size_t n;
int listen_fd = -1, status, max_fd;
if(args_parse(argc - 1, argv + 1)){
@@ -263,13 +153,11 @@ int main(int argc, char** argv){
if(max_fd < sock[n].fd){
max_fd = sock[n].fd;
}
-
- for(p = 0; p < sock[n].protocols; p++){
- if(sock[n].protocol[p].fd >= 0){
- FD_SET(sock[n].protocol[p].fd, &read_fds);
- if(max_fd < sock[n].protocol[p].fd){
- max_fd = sock[n].protocol[p].fd;
- }
+
+ if(sock[n].peer >= 0){
+ FD_SET(sock[n].peer, &read_fds);
+ if(max_fd < sock[n].peer){
+ max_fd = sock[n].peer;
}
}
}
@@ -301,11 +189,9 @@ int main(int argc, char** argv){
}
}
- for(p = 0; p < sock[n].protocols; p++){
- if(sock[n].protocol[p].fd >= 0 && FD_ISSET(sock[n].protocol[p].fd, &read_fds)){
- if(ws_peer_data(sock + n, p)){
- break;
- }
+ if(sock[n].peer >= 0 && FD_ISSET(sock[n].peer, &read_fds)){
+ if(ws_peer_data(sock + n)){
+ break;
}
}
}
@@ -314,11 +200,7 @@ int main(int argc, char** argv){
}
//cleanup
- for(n = 0; n < socks; n++){
- ws_close(sock + n);
- }
- free(sock);
- socks = 0;
+ ws_cleanup();
close(listen_fd);
return 0;
}