From 49cc88def2f9edea59e79ca37f41400ad870579e Mon Sep 17 00:00:00 2001 From: Aargh Rai Date: Wed, 27 May 2026 17:13:14 +0530 Subject: went through all, but comms is working --- src/server/base64.c | 27 +++++++++++++++++++++++++++ src/server/comms.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/server/ws_key.c | 28 ++++++++++++++++++++++++++++ 3 files changed, 107 insertions(+) create mode 100644 src/server/base64.c create mode 100644 src/server/comms.c create mode 100644 src/server/ws_key.c (limited to 'src/server') diff --git a/src/server/base64.c b/src/server/base64.c new file mode 100644 index 0000000..3400cfb --- /dev/null +++ b/src/server/base64.c @@ -0,0 +1,27 @@ +static const char b64[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789+/"; + +void base64_encode( + const unsigned char *in, + size_t len, + char *out +) { + size_t i, j = 0; + + for (i = 0; i < len; i += 3) { + unsigned v = in[i] << 16; + + if (i + 1 < len) v |= in[i + 1] << 8; + if (i + 2 < len) v |= in[i + 2]; + + out[j++] = b64[(v >> 18) & 63]; + out[j++] = b64[(v >> 12) & 63]; + + out[j++] = (i + 1 < len) ? b64[(v >> 6) & 63] : '='; + out[j++] = (i + 2 < len) ? b64[v & 63] : '='; + } + + out[j] = 0; +} diff --git a/src/server/comms.c b/src/server/comms.c new file mode 100644 index 0000000..7b8001b --- /dev/null +++ b/src/server/comms.c @@ -0,0 +1,52 @@ +#include + +struct str { + char msg[126]; + int len; +}; + +void set_output(struct str* output, char* msg) { + int i = 0; + while (msg[i] != 0) { + assert(i < 126); + output->msg[i] = msg[i]; + i++; + } + output->len = i; +} + +struct strs { + struct str* data; + int capacity; + int count; +}; + +struct strs init_strs() { + return (struct strs) { + .data = malloc(sizeof(struct str) * 10), + .count = 0, + .capacity = 10, + }; +} +void add_str(struct strs* strs, char* str) { + if (strs->count + 1 > strs->capacity) { + strs->capacity += 30; + strs->data = realloc(strs->data, sizeof(struct str) * strs->capacity); + } + + struct str item; + set_output(&item, str); + + strs->data[strs->count] = item; + strs->count++; +} + +struct strs handle_input(char* payload, int len) { + printf("Message: %.*s\n", len, payload); + struct strs output = init_strs(); + + add_str(&output, "nigga"); + add_str(&output, "nigga2"); + + return output; +} diff --git a/src/server/ws_key.c b/src/server/ws_key.c new file mode 100644 index 0000000..ca66b81 --- /dev/null +++ b/src/server/ws_key.c @@ -0,0 +1,28 @@ +static const char *GUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; + +void websocket_accept_key(const char *client_key, char *output) { + char buf[256]; + snprintf(buf, sizeof(buf), "%s%s", client_key, GUID); + + unsigned char hash[SHA_DIGEST_LENGTH]; + SHA1((unsigned char *)buf, strlen(buf), hash); + base64_encode(hash, SHA_DIGEST_LENGTH, output); +} + +char *find_websocket_key(char *req) { + char *p = strstr(req, "Sec-WebSocket-Key:"); + + if (!p) return NULL; + + p += strlen("Sec-WebSocket-Key:"); + + while (*p == ' ') p++; + + static char key[128]; + int i = 0; + while (*p && *p != '\r' && *p != '\n') + key[i++] = *p++; + + key[i] = 0; + return key; +} -- cgit v1.2.3