summaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
Diffstat (limited to 'src/server')
-rw-r--r--src/server/base64.c27
-rw-r--r--src/server/comms.c52
-rw-r--r--src/server/ws_key.c28
3 files changed, 107 insertions, 0 deletions
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 <assert.h>
+
+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;
+}