annotate seobeo/s_websocket_server.c @ 279:b3b547563ec7

Add Google connector service and agent wiki Implement the C/Seobeo Google Drive and Gmail connector with encrypted OAuth storage, Zenbu authentication, browser testing, AI tool discovery, chunked HTTP decoding, and Bazel coverage. Consolidate repository guidance into progressive wiki documentation and enforce arena-first allocation for new first-party C code. Co-authored-by: Copilot <[email protected]> Copilot-Session: 84c338fd-0939-4bb3-b7f3-1062eb213e5d
author MrJuneJune <me@mrjunejune.com>
date Mon, 17 Aug 2026 22:22:36 -0700
parents 043018c0f2f8
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
121
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
1 #include "seobeo/seobeo.h"
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
2 #include <time.h>
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
3
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
4 #ifndef SEOBEO_NO_SSL
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
5 #include <openssl/sha.h>
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
6 #include <openssl/bio.h>
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
7 #include <openssl/evp.h>
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
8 #include <openssl/buffer.h>
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
9 #endif
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
10
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
11 #define SEOBEO_WS_GUID "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
12
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
13 static Seobeo_WebSocket_Server_Route *g_ws_routes = NULL;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
14 static Seobeo_WebSocket_Server_Connection *g_ws_connections = NULL;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
15
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
16 void Seobeo_WebSocket_Server_Init()
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
17 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
18 Dowa_Array_Reserve(g_ws_routes, 10);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
19 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
20
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
21 void Seobeo_WebSocket_Server_Register(const char *path, Seobeo_WebSocket_Server_Handler handler, void *p_user_data)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
22 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
23 Seobeo_WebSocket_Server_Route route = {0};
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
24 route.path = strdup(path);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
25 route.handler = handler;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
26 route.p_user_data = p_user_data;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
27
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
28 Dowa_Array_Push(g_ws_routes, route);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
29 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
30
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
31 static void Seobeo_WebSocket_Server_Compute_Accept_Key(const char *client_key, char *accept_key, size_t accept_key_size)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
32 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
33 #ifdef SEOBEO_NO_SSL
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
34 snprintf(accept_key, accept_key_size, "dGhlIHNhbXBsZSBub25jZQ==");
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
35 (void)client_key;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
36 #else
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
37 char concatenated[256];
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
38 snprintf(concatenated, sizeof(concatenated), "%s%s", client_key, SEOBEO_WS_GUID);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
39
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
40 unsigned char hash[SHA_DIGEST_LENGTH];
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
41 SHA1((unsigned char*)concatenated, strlen(concatenated), hash);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
42
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
43 BIO *b64 = BIO_new(BIO_f_base64());
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
44 BIO *bio = BIO_new(BIO_s_mem());
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
45 bio = BIO_push(b64, bio);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
46 BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
47 BIO_write(bio, hash, SHA_DIGEST_LENGTH);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
48 BIO_flush(bio);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
49
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
50 BUF_MEM *buffer_ptr;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
51 BIO_get_mem_ptr(bio, &buffer_ptr);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
52
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
53 size_t copy_len = buffer_ptr->length < accept_key_size - 1 ? buffer_ptr->length : accept_key_size - 1;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
54 memcpy(accept_key, buffer_ptr->data, copy_len);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
55 accept_key[copy_len] = '\0';
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
56
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
57 BIO_free_all(bio);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
58 #endif
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
59 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
60
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
61 boolean Seobeo_WebSocket_Server_Handle_Upgrade(Seobeo_Handle *p_handle, Seobeo_Request_Entry *p_req_map, const char *path)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
62 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
63 void *p_upgrade_kv = Dowa_HashMap_Get_Ptr(p_req_map, "Upgrade");
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
64 if (!p_upgrade_kv)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
65 return FALSE;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
66
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
67 const char *upgrade_value = ((Seobeo_Request_Entry*)p_upgrade_kv)->value;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
68 if (strcasecmp(upgrade_value, "websocket") != 0)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
69 return FALSE;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
70
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
71 void *p_connection_kv = Dowa_HashMap_Get_Ptr(p_req_map, "Connection");
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
72 if (!p_connection_kv)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
73 return FALSE;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
74
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
75 const char *connection_value = ((Seobeo_Request_Entry*)p_connection_kv)->value;
143
276bb3555034 Should work now.
June Park <parkjune1995@gmail.com>
parents: 142
diff changeset
76 if (!strcasestr(connection_value, "upgrade"))
121
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
77 return FALSE;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
78
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
79 void *p_key_kv = Dowa_HashMap_Get_Ptr(p_req_map, "Sec-WebSocket-Key");
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
80 if (!p_key_kv)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
81 return FALSE;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
82
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
83 const char *client_key = ((Seobeo_Request_Entry*)p_key_kv)->value;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
84
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
85 char accept_key[64];
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
86 Seobeo_WebSocket_Server_Compute_Accept_Key(client_key, accept_key, sizeof(accept_key));
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
87
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
88 char response[512];
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
89 int response_len = snprintf(response, sizeof(response),
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
90 "HTTP/1.1 101 Switching Protocols\r\n"
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
91 "Upgrade: websocket\r\n"
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
92 "Connection: Upgrade\r\n"
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
93 "Sec-WebSocket-Accept: %s\r\n"
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
94 "\r\n",
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
95 accept_key);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
96
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
97 Seobeo_Handle_Queue(p_handle, (uint8*)response, (uint32)response_len);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
98 if (Seobeo_Handle_Flush(p_handle) < 0)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
99 return FALSE;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
100
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
101 Seobeo_WebSocket_Server_Connection *p_conn = malloc(sizeof(Seobeo_WebSocket_Server_Connection));
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
102 memset(p_conn, 0, sizeof(Seobeo_WebSocket_Server_Connection));
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
103
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
104 p_conn->p_handle = p_handle;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
105 p_conn->is_active = TRUE;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
106 p_conn->fragment_capacity = 4096;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
107 p_conn->fragment_buffer = malloc(p_conn->fragment_capacity);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
108
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
109 char client_id[64];
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
110 snprintf(client_id, sizeof(client_id), "client_%p", (void*)p_handle);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
111 p_conn->client_id = strdup(client_id);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
112
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
113 p_conn->next = g_ws_connections;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
114 g_ws_connections = p_conn;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
115
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
116 Seobeo_Log(SEOBEO_INFO, "WebSocket upgraded on path: %s\n", path);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
117
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
118 Seobeo_WebSocket_Server_Handle_Connection(p_conn);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
119
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
120 return TRUE;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
121 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
122
125
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 121
diff changeset
123 // Seobeo_WebSocket_Unmask_Data removed - using Seobeo_WebSocket_Mask_Data from s_websocket_common.c (XOR is symmetric)
121
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
124
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
125 static int32 Seobeo_WebSocket_Server_Send_Frame(Seobeo_WebSocket_Server_Connection *p_conn, Seobeo_WebSocket_Opcode opcode, const uint8 *payload, size_t payload_length, boolean fin)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
126 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
127 if (!p_conn || !p_conn->is_active)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
128 return -1;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
129
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
130 uint8 frame[14];
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
131 size_t frame_len = 0;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
132
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
133 frame[0] = (fin ? 0x80 : 0x00) | (opcode & 0x0F);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
134 frame_len++;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
135
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
136 // within 1 byte, so max chunk would be 125 bytes
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
137 if (payload_length < 126)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
138 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
139 frame[1] = (uint8)payload_length;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
140 frame_len++;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
141 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
142 // from now frame 1 is thrown away just keeping it 1
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
143 // within 4 bytes
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
144 else if (payload_length < MAX_INT_16)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
145 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
146 frame[1] = 126;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
147 frame[2] = (uint8)((payload_length >> 8) & 0xFF);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
148 frame[3] = (uint8)(payload_length & 0xFF);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
149 frame_len += 3;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
150 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
151 else
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
152 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
153 frame[1] = 127;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
154 for (int i = 0; i < 8; i++)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
155 frame[2 + i] = (uint8)((payload_length >> (56 - i * 8)) & 0xFF);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
156 frame_len += 9;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
157 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
158
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
159 Seobeo_Handle_Queue(p_conn->p_handle, frame, (uint32)frame_len);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
160
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
161 if (payload_length > 0)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
162 Seobeo_Handle_Queue(p_conn->p_handle, payload, (uint32)payload_length);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
163
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
164 return Seobeo_Handle_Flush(p_conn->p_handle);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
165 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
166
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
167 static int32 Seobeo_WebSocket_Server_Send_Fragmented(Seobeo_WebSocket_Server_Connection *p_conn, Seobeo_WebSocket_Opcode opcode,
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
168 const uint8 *payload, size_t total_length)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
169 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
170 if (!payload || total_length == 0)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
171 return -1;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
172
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
173 if (total_length <= MAX_FRAGMENT_SIZE)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
174 return Seobeo_WebSocket_Server_Send_Frame(p_conn, opcode, payload, total_length, TRUE);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
175
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
176 size_t sent = 0;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
177 int32 result;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
178
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
179 result = Seobeo_WebSocket_Server_Send_Frame(p_conn, opcode, payload, MAX_FRAGMENT_SIZE, FALSE);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
180 if (result < 0)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
181 return result;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
182
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
183 sent += MAX_FRAGMENT_SIZE;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
184
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
185 while (sent + MAX_FRAGMENT_SIZE < total_length)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
186 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
187 result = Seobeo_WebSocket_Server_Send_Frame(p_conn, SEOBEO_WS_OPCODE_CONTINUATION, payload + sent, MAX_FRAGMENT_SIZE, FALSE);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
188 if (result < 0)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
189 return result;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
190 sent += MAX_FRAGMENT_SIZE;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
191 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
192
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
193 size_t remaining = total_length - sent;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
194 return Seobeo_WebSocket_Server_Send_Frame(p_conn, SEOBEO_WS_OPCODE_CONTINUATION, payload + sent, remaining, TRUE);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
195 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
196
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
197 int32 Seobeo_WebSocket_Server_Send_Text(Seobeo_WebSocket_Server_Connection *p_conn, const char *text)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
198 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
199 if (!text)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
200 return -1;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
201
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
202 return Seobeo_WebSocket_Server_Send_Fragmented(p_conn, SEOBEO_WS_OPCODE_TEXT, (const uint8*)text, strlen(text));
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
203 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
204
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
205 int32 Seobeo_WebSocket_Server_Send_Binary(Seobeo_WebSocket_Server_Connection *p_conn, const uint8 *data, size_t length)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
206 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
207 if (!data)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
208 return -1;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
209
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
210 return Seobeo_WebSocket_Server_Send_Fragmented(p_conn, SEOBEO_WS_OPCODE_BINARY, data, length);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
211 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
212
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
213 static Seobeo_WebSocket_Message *Seobeo_WebSocket_Server_Receive_Frame(Seobeo_WebSocket_Server_Connection *p_conn)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
214 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
215 if (!p_conn || !p_conn->is_active)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
216 return NULL;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
217
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
218 int r = Seobeo_Handle_Read(p_conn->p_handle);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
219 if (r < 0)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
220 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
221 Seobeo_Log(SEOBEO_ERROR, "WebSocket server read error\n");
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
222 p_conn->is_active = FALSE;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
223 return NULL;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
224 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
225
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
226 if (r == -2)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
227 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
228 Seobeo_Log(SEOBEO_INFO, "WebSocket client disconnected\n");
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
229 p_conn->is_active = FALSE;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
230 return NULL;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
231 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
232
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
233 if (p_conn->p_handle->read_buffer_len < 2)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
234 return NULL;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
235
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
236 uint8 *buf = p_conn->p_handle->read_buffer;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
237
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
238 uint8 byte1 = buf[0];
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
239 uint8 byte2 = buf[1];
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
240
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
241 boolean fin = (byte1 & 0x80) != 0;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
242 Seobeo_WebSocket_Opcode opcode = (Seobeo_WebSocket_Opcode)(byte1 & 0x0F);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
243 boolean masked = (byte2 & 0x80) != 0;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
244 uint64 payload_len = byte2 & 0x7F;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
245
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
246 size_t header_len = 2;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
247
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
248 if (payload_len == 126)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
249 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
250 if (p_conn->p_handle->read_buffer_len < 4)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
251 return NULL;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
252 payload_len = (buf[2] << 8) | buf[3];
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
253 header_len += 2;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
254 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
255 else if (payload_len == 127)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
256 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
257 if (p_conn->p_handle->read_buffer_len < 10)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
258 return NULL;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
259 payload_len = 0;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
260 for (int i = 0; i < 8; i++)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
261 payload_len = (payload_len << 8) | buf[2 + i];
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
262 header_len += 8;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
263 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
264
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
265 uint8 mask_key[4] = {0};
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
266 if (masked)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
267 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
268 if (p_conn->p_handle->read_buffer_len < header_len + 4)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
269 return NULL;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
270 memcpy(mask_key, buf + header_len, 4);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
271 header_len += 4;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
272 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
273
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
274 if (p_conn->p_handle->read_buffer_len < header_len + payload_len)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
275 return NULL;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
276
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
277 uint8 *payload = NULL;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
278 if (payload_len > 0)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
279 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
280 payload = malloc(payload_len);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
281 memcpy(payload, buf + header_len, payload_len);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
282
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
283 if (masked)
125
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 121
diff changeset
284 Seobeo_WebSocket_Mask_Data(payload, payload_len, mask_key);
121
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
285 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
286
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
287 Seobeo_Handle_Consume(p_conn->p_handle, (uint32)(header_len + payload_len));
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
288
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
289 if (opcode == SEOBEO_WS_OPCODE_PING)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
290 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
291 Seobeo_WebSocket_Server_Send_Frame(p_conn, SEOBEO_WS_OPCODE_PONG, payload, payload_len, TRUE);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
292 if (payload)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
293 free(payload);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
294 return NULL;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
295 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
296
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
297 if (opcode == SEOBEO_WS_OPCODE_PONG)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
298 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
299 if (payload)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
300 free(payload);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
301 return NULL;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
302 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
303
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
304 if (opcode == SEOBEO_WS_OPCODE_CLOSE)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
305 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
306 uint16 close_code = 1000;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
307 if (payload_len >= 2)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
308 close_code = (payload[0] << 8) | payload[1];
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
309
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
310 Seobeo_Log(SEOBEO_INFO, "WebSocket close received from client with code %d\n", close_code);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
311
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
312 Seobeo_WebSocket_Server_Send_Frame(p_conn, SEOBEO_WS_OPCODE_CLOSE, payload, payload_len, TRUE);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
313 p_conn->is_active = FALSE;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
314
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
315 if (payload)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
316 free(payload);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
317 return NULL;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
318 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
319
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
320 if (opcode == SEOBEO_WS_OPCODE_CONTINUATION)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
321 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
322 if (p_conn->fragment_length + payload_len > p_conn->fragment_capacity)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
323 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
324 p_conn->fragment_capacity = (p_conn->fragment_length + payload_len) * 2;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
325 p_conn->fragment_buffer = realloc(p_conn->fragment_buffer, p_conn->fragment_capacity);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
326 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
327
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
328 if (payload_len > 0)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
329 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
330 memcpy(p_conn->fragment_buffer + p_conn->fragment_length, payload, payload_len);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
331 p_conn->fragment_length += payload_len;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
332 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
333
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
334 if (payload)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
335 free(payload);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
336
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
337 if (!fin)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
338 return NULL;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
339
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
340 Seobeo_WebSocket_Message *p_msg = malloc(sizeof(Seobeo_WebSocket_Message));
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
341 p_msg->opcode = p_conn->fragment_opcode;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
342 p_msg->data = malloc(p_conn->fragment_length);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
343 memcpy(p_msg->data, p_conn->fragment_buffer, p_conn->fragment_length);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
344 p_msg->length = p_conn->fragment_length;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
345 p_msg->is_final = TRUE;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
346
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
347 p_conn->fragment_length = 0;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
348
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
349 return p_msg;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
350 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
351
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
352 if (!fin)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
353 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
354 p_conn->fragment_opcode = opcode;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
355 p_conn->fragment_length = 0;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
356
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
357 if (payload_len > 0)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
358 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
359 if (payload_len > p_conn->fragment_capacity)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
360 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
361 p_conn->fragment_capacity = payload_len * 2;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
362 p_conn->fragment_buffer = realloc(p_conn->fragment_buffer, p_conn->fragment_capacity);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
363 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
364
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
365 memcpy(p_conn->fragment_buffer, payload, payload_len);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
366 p_conn->fragment_length = payload_len;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
367 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
368
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
369 if (payload)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
370 free(payload);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
371
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
372 return NULL;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
373 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
374
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
375 Seobeo_WebSocket_Message *p_msg = malloc(sizeof(Seobeo_WebSocket_Message));
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
376 p_msg->opcode = opcode;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
377 p_msg->data = payload;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
378 p_msg->length = payload_len;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
379 p_msg->is_final = fin;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
380
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
381 return p_msg;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
382 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
383
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
384 void Seobeo_WebSocket_Server_Handle_Connection(Seobeo_WebSocket_Server_Connection *p_conn)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
385 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
386 if (!g_ws_routes)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
387 return;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
388
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
389 size_t route_count = Dowa_Array_Length(g_ws_routes);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
390 if (route_count == 0)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
391 return;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
392
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
393 Seobeo_WebSocket_Server_Handler handler = g_ws_routes[0].handler;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
394 void *p_user_data = g_ws_routes[0].p_user_data;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
395
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
396 while (p_conn->is_active)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
397 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
398 Seobeo_WebSocket_Message *p_msg = Seobeo_WebSocket_Server_Receive_Frame(p_conn);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
399 if (p_msg)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
400 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
401 if (handler)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
402 handler(p_conn, p_msg, p_user_data);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
403
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
404 Seobeo_WebSocket_Message_Destroy(p_msg);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
405 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
406
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
407 usleep(1000);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
408 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
409
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
410 Seobeo_WebSocket_Server_Connection_Destroy(p_conn);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
411 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
412
125
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 121
diff changeset
413 void Seobeo_WebSocket_Server_Broadcast_Text(const char *text, Seobeo_WebSocket_Server_Connection *origin_p_conn)
121
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
414 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
415 if (!text)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
416 return;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
417
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
418 Seobeo_WebSocket_Server_Connection *p_conn = g_ws_connections;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
419 while (p_conn)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
420 {
125
f236c895604e [MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents: 121
diff changeset
421 if (p_conn->is_active && p_conn != origin_p_conn)
121
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
422 Seobeo_WebSocket_Server_Send_Text(p_conn, text);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
423
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
424 p_conn = p_conn->next;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
425 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
426 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
427
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
428 void Seobeo_WebSocket_Server_Broadcast_Binary(const uint8 *data, size_t length)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
429 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
430 if (!data)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
431 return;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
432
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
433 Seobeo_WebSocket_Server_Connection *p_conn = g_ws_connections;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
434 while (p_conn)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
435 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
436 if (p_conn->is_active)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
437 Seobeo_WebSocket_Server_Send_Binary(p_conn, data, length);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
438
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
439 p_conn = p_conn->next;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
440 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
441 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
442
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
443 void Seobeo_WebSocket_Server_Connection_Close(Seobeo_WebSocket_Server_Connection *p_conn, uint16 code, const char *reason)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
444 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
445 if (!p_conn || !p_conn->is_active)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
446 return;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
447
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
448 size_t reason_len = reason ? strlen(reason) : 0;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
449 size_t payload_len = 2 + reason_len;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
450 uint8 *payload = malloc(payload_len);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
451
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
452 payload[0] = (uint8)((code >> 8) & 0xFF);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
453 payload[1] = (uint8)(code & 0xFF);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
454
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
455 if (reason_len > 0)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
456 memcpy(payload + 2, reason, reason_len);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
457
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
458 Seobeo_WebSocket_Server_Send_Frame(p_conn, SEOBEO_WS_OPCODE_CLOSE, payload, payload_len, TRUE);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
459
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
460 free(payload);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
461
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
462 p_conn->is_active = FALSE;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
463 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
464
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
465 void Seobeo_WebSocket_Server_Connection_Destroy(Seobeo_WebSocket_Server_Connection *p_conn)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
466 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
467 if (!p_conn)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
468 return;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
469
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
470 if (p_conn->is_active)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
471 Seobeo_WebSocket_Server_Connection_Close(p_conn, 1000, "Server closing connection");
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
472
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
473 if (p_conn->p_handle)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
474 Seobeo_Handle_Destroy(p_conn->p_handle);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
475
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
476 if (p_conn->client_id)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
477 free(p_conn->client_id);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
478
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
479 if (p_conn->fragment_buffer)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
480 free(p_conn->fragment_buffer);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
481
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
482 Seobeo_WebSocket_Server_Connection **pp = &g_ws_connections;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
483 while (*pp)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
484 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
485 if (*pp == p_conn)
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
486 {
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
487 *pp = p_conn->next;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
488 break;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
489 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
490 pp = &(*pp)->next;
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
491 }
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
492
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
493 free(p_conn);
7b1719fa918c [Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
494 }