Mercurial
annotate seobeo/s_websocket.c @ 142:893d87124d16
please work
| author | June Park <parkjune1995@gmail.com> |
|---|---|
| date | Fri, 09 Jan 2026 13:09:52 -0800 |
| parents | f236c895604e |
| children | 058de208e640 |
| rev | line source |
|---|---|
|
120
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
1 #include "seobeo/seobeo.h" |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
2 #include <time.h> |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
3 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
4 #define SEOBEO_WS_GUID "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
5 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
6 static void Seobeo_WebSocket_Parse_Url(const char *url, char **p_host, char **p_port, char **p_path, boolean *p_use_tls, Dowa_Arena *p_arena) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
7 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
8 if (!url) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
9 return; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
10 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
11 const char *start = url; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
12 *p_use_tls = FALSE; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
13 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
14 if (strncmp(url, "wss://", 6) == 0) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
15 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
16 *p_use_tls = TRUE; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
17 start = url + 6; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
18 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
19 else if (strncmp(url, "ws://", 5) == 0) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
20 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
21 *p_use_tls = FALSE; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
22 start = url + 5; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
23 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
24 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
25 const char *slash = strchr(start, '/'); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
26 const char *colon = strchr(start, ':'); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
27 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
28 if (colon && (!slash || colon < slash)) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
29 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
30 size_t host_len = colon - start; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
31 *p_host = Dowa_Arena_Allocate(p_arena, host_len + 1); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
32 memcpy(*p_host, start, host_len); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
33 (*p_host)[host_len] = '\0'; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
34 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
35 const char *port_start = colon + 1; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
36 size_t port_len = slash ? (slash - port_start) : strlen(port_start); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
37 *p_port = Dowa_Arena_Allocate(p_arena, port_len + 1); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
38 memcpy(*p_port, port_start, port_len); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
39 (*p_port)[port_len] = '\0'; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
40 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
41 else |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
42 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
43 size_t host_len = slash ? (slash - start) : strlen(start); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
44 *p_host = Dowa_Arena_Allocate(p_arena, host_len + 1); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
45 memcpy(*p_host, start, host_len); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
46 (*p_host)[host_len] = '\0'; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
47 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
48 *p_port = Dowa_Arena_Allocate(p_arena, 8); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
49 strcpy(*p_port, *p_use_tls ? "443" : "80"); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
50 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
51 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
52 if (slash) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
53 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
54 size_t path_len = strlen(slash); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
55 *p_path = Dowa_Arena_Allocate(p_arena, path_len + 1); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
56 strcpy(*p_path, slash); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
57 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
58 else |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
59 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
60 *p_path = Dowa_Arena_Allocate(p_arena, 2); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
61 strcpy(*p_path, "/"); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
62 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
63 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
64 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
65 static void Seobeo_WebSocket_Generate_Key(char *key_out, size_t key_size) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
66 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
67 static const char base64_chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
68 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
69 srand((unsigned int)time(NULL) ^ (unsigned int)getpid()); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
70 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
71 uint8 random_bytes[16]; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
72 for (int i = 0; i < 16; i++) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
73 random_bytes[i] = (uint8)(rand() % 256); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
74 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
75 int out_idx = 0; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
76 for (int i = 0; i < 16; i += 3) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
77 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
78 uint32 triple = (random_bytes[i] << 16) | |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
79 (i + 1 < 16 ? random_bytes[i + 1] << 8 : 0) | |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
80 (i + 2 < 16 ? random_bytes[i + 2] : 0); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
81 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
82 key_out[out_idx++] = base64_chars[(triple >> 18) & 0x3F]; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
83 key_out[out_idx++] = base64_chars[(triple >> 12) & 0x3F]; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
84 key_out[out_idx++] = base64_chars[(triple >> 6) & 0x3F]; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
85 key_out[out_idx++] = base64_chars[triple & 0x3F]; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
86 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
87 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
88 key_out[out_idx] = '\0'; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
89 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
90 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
91 Seobeo_WebSocket *Seobeo_WebSocket_Connect(const char *url) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
92 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
93 Seobeo_WebSocket *p_ws = malloc(sizeof(Seobeo_WebSocket)); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
94 if (!p_ws) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
95 return NULL; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
96 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
97 memset(p_ws, 0, sizeof(Seobeo_WebSocket)); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
98 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
99 p_ws->p_arena = Dowa_Arena_Create(1024 * 1024); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
100 if (!p_ws->p_arena) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
101 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
102 free(p_ws); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
103 return NULL; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
104 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
105 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
106 size_t url_len = strlen(url); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
107 p_ws->url = Dowa_Arena_Allocate(p_ws->p_arena, url_len + 1); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
108 strcpy(p_ws->url, url); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
109 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
110 Seobeo_WebSocket_Parse_Url(url, &p_ws->host, &p_ws->port, &p_ws->path, &p_ws->use_tls, p_ws->p_arena); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
111 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
112 p_ws->p_handle = Seobeo_Stream_Handle_Client_Create(p_ws->host, p_ws->port, p_ws->use_tls); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
113 if (!p_ws->p_handle || p_ws->p_handle->socket < 0) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
114 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
115 Seobeo_Log(SEOBEO_ERROR, "Failed to create socket connection\n"); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
116 if (p_ws->p_handle) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
117 Seobeo_Handle_Destroy(p_ws->p_handle); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
118 Dowa_Arena_Free(p_ws->p_arena); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
119 free(p_ws); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
120 return NULL; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
121 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
122 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
123 char ws_key[32]; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
124 Seobeo_WebSocket_Generate_Key(ws_key, sizeof(ws_key)); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
125 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
126 char handshake[2048]; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
127 int handshake_len = snprintf(handshake, sizeof(handshake), |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
128 "GET %s HTTP/1.1\r\n" |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
129 "Host: %s\r\n" |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
130 "Upgrade: websocket\r\n" |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
131 "Connection: Upgrade\r\n" |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
132 "Sec-WebSocket-Key: %s\r\n" |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
133 "Sec-WebSocket-Version: 13\r\n" |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
134 "\r\n", |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
135 p_ws->path, p_ws->host, ws_key); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
136 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
137 Seobeo_Handle_Queue(p_ws->p_handle, (uint8*)handshake, (uint32)handshake_len); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
138 if (Seobeo_Handle_Flush(p_ws->p_handle) < 0) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
139 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
140 Seobeo_Log(SEOBEO_ERROR, "Failed to send WebSocket handshake\n"); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
141 Seobeo_Handle_Destroy(p_ws->p_handle); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
142 Dowa_Arena_Free(p_ws->p_arena); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
143 free(p_ws); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
144 return NULL; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
145 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
146 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
147 while (1) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
148 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
149 int r = Seobeo_Handle_Read(p_ws->p_handle); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
150 if (r < 0) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
151 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
152 Seobeo_Log(SEOBEO_ERROR, "Failed to read handshake response\n"); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
153 Seobeo_Handle_Destroy(p_ws->p_handle); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
154 Dowa_Arena_Free(p_ws->p_arena); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
155 free(p_ws); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
156 return NULL; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
157 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
158 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
159 if (p_ws->p_handle->read_buffer_len >= 4 && |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
160 strstr((char*)p_ws->p_handle->read_buffer, "\r\n\r\n") != NULL) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
161 break; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
162 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
163 if (r == 0) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
164 continue; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
165 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
166 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
167 char *response = (char*)p_ws->p_handle->read_buffer; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
168 if (strstr(response, "HTTP/1.1 101") == NULL) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
169 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
170 Seobeo_Log(SEOBEO_ERROR, "WebSocket handshake failed: %s\n", response); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
171 Seobeo_Handle_Destroy(p_ws->p_handle); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
172 Dowa_Arena_Free(p_ws->p_arena); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
173 free(p_ws); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
174 return NULL; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
175 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
176 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
177 char *end_of_headers = strstr(response, "\r\n\r\n"); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
178 if (end_of_headers) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
179 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
180 size_t header_len = end_of_headers - response + 4; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
181 Seobeo_Handle_Consume(p_ws->p_handle, (uint32)header_len); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
182 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
183 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
184 p_ws->state = SEOBEO_WS_STATE_OPEN; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
185 p_ws->fragment_capacity = 4096; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
186 p_ws->fragment_buffer = malloc(p_ws->fragment_capacity); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
187 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
188 Seobeo_Log(SEOBEO_INFO, "WebSocket connected to %s\n", url); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
189 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
190 return p_ws; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
191 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
192 |
|
125
f236c895604e
[MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents:
121
diff
changeset
|
193 // Seobeo_WebSocket_Mask_Data moved to s_websocket_common.c |
|
120
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
194 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
195 static int32 Seobeo_WebSocket_Send_Frame(Seobeo_WebSocket *p_ws, Seobeo_WebSocket_Opcode opcode, |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
196 const uint8 *payload, size_t payload_length, boolean fin) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
197 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
198 if (!p_ws || p_ws->state != SEOBEO_WS_STATE_OPEN) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
199 return -1; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
200 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
201 uint8 frame[14]; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
202 size_t frame_len = 0; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
203 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
204 // Big endian |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
205 frame[0] = (fin ? 0x80 : 0x00) | (opcode & 0x0F); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
206 frame_len++; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
207 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
208 uint8 mask_key[4]; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
209 for (int i = 0; i < 4; i++) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
210 mask_key[i] = (uint8)(rand() % 256); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
211 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
212 // within 1 byte |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
213 if (payload_length < 126) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
214 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
215 frame[1] = 0x80 | (uint8)payload_length; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
216 frame_len++; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
217 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
218 // from now frame 1 is thrown away just keeping it 1 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
219 // within 4 bytes |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
220 else if (payload_length < MAX_INT_16) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
221 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
222 frame[1] = 0x80 | 126; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
223 frame[2] = (uint8)((payload_length >> 8) & 0xFF); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
224 frame[3] = (uint8)(payload_length & 0xFF); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
225 frame_len += 3; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
226 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
227 // within 8 bytes |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
228 else |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
229 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
230 frame[1] = 0x80 | 127; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
231 for (int i = 0; i < 8; i++) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
232 frame[2 + i] = (uint8)((payload_length >> (56 - i * 8)) & 0xFF); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
233 frame_len += 9; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
234 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
235 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
236 memcpy(frame + frame_len, mask_key, 4); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
237 frame_len += 4; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
238 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
239 Seobeo_Handle_Queue(p_ws->p_handle, frame, (uint32)frame_len); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
240 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
241 if (payload_length > 0) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
242 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
243 uint8 *masked_payload = malloc(payload_length); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
244 memcpy(masked_payload, payload, payload_length); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
245 Seobeo_WebSocket_Mask_Data(masked_payload, payload_length, mask_key); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
246 Seobeo_Handle_Queue(p_ws->p_handle, masked_payload, (uint32)payload_length); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
247 free(masked_payload); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
248 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
249 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
250 return Seobeo_Handle_Flush(p_ws->p_handle); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
251 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
252 |
|
121
7b1719fa918c
[Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
120
diff
changeset
|
253 static int32 Seobeo_WebSocket_Send_Fragmented(Seobeo_WebSocket *p_ws, Seobeo_WebSocket_Opcode opcode, |
|
7b1719fa918c
[Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
120
diff
changeset
|
254 const uint8 *payload, size_t total_length) |
|
120
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
255 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
256 if (!payload || total_length == 0) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
257 return -1; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
258 |
|
121
7b1719fa918c
[Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
120
diff
changeset
|
259 if (total_length <= MAX_FRAGMENT_SIZE) |
|
120
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
260 return Seobeo_WebSocket_Send_Frame(p_ws, opcode, payload, total_length, TRUE); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
261 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
262 size_t sent = 0; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
263 int32 result; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
264 |
|
121
7b1719fa918c
[Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
120
diff
changeset
|
265 result = Seobeo_WebSocket_Send_Frame(p_ws, opcode, payload, MAX_FRAGMENT_SIZE, FALSE); |
|
120
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
266 if (result < 0) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
267 return result; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
268 |
|
121
7b1719fa918c
[Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
120
diff
changeset
|
269 sent += MAX_FRAGMENT_SIZE; |
|
120
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
270 |
|
121
7b1719fa918c
[Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
120
diff
changeset
|
271 while (sent + MAX_FRAGMENT_SIZE < total_length) |
|
120
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
272 { |
|
121
7b1719fa918c
[Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
120
diff
changeset
|
273 result = Seobeo_WebSocket_Send_Frame(p_ws, SEOBEO_WS_OPCODE_CONTINUATION, payload + sent, MAX_FRAGMENT_SIZE, FALSE); |
|
120
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
274 if (result < 0) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
275 return result; |
|
121
7b1719fa918c
[Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
120
diff
changeset
|
276 sent += MAX_FRAGMENT_SIZE; |
|
120
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
277 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
278 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
279 size_t remaining = total_length - sent; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
280 return Seobeo_WebSocket_Send_Frame(p_ws, SEOBEO_WS_OPCODE_CONTINUATION, payload + sent, remaining, TRUE); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
281 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
282 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
283 int32 Seobeo_WebSocket_Send_Text(Seobeo_WebSocket *p_ws, const char *text) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
284 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
285 if (!text) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
286 return -1; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
287 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
288 return Seobeo_WebSocket_Send_Fragmented(p_ws, SEOBEO_WS_OPCODE_TEXT, (const uint8*)text, strlen(text)); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
289 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
290 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
291 int32 Seobeo_WebSocket_Send_Binary(Seobeo_WebSocket *p_ws, const uint8 *data, size_t length) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
292 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
293 if (!data) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
294 return -1; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
295 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
296 return Seobeo_WebSocket_Send_Fragmented(p_ws, SEOBEO_WS_OPCODE_BINARY, data, length); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
297 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
298 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
299 int32 Seobeo_WebSocket_Send_Ping(Seobeo_WebSocket *p_ws, const char *payload) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
300 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
301 size_t len = payload ? strlen(payload) : 0; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
302 return Seobeo_WebSocket_Send_Frame(p_ws, SEOBEO_WS_OPCODE_PING, (const uint8*)payload, len, TRUE); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
303 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
304 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
305 int32 Seobeo_WebSocket_Send_Pong(Seobeo_WebSocket *p_ws, const char *payload) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
306 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
307 size_t len = payload ? strlen(payload) : 0; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
308 return Seobeo_WebSocket_Send_Frame(p_ws, SEOBEO_WS_OPCODE_PONG, (const uint8*)payload, len, TRUE); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
309 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
310 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
311 Seobeo_WebSocket_Message *Seobeo_WebSocket_Receive(Seobeo_WebSocket *p_ws) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
312 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
313 if (!p_ws || p_ws->state == SEOBEO_WS_STATE_CLOSED) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
314 return NULL; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
315 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
316 int r = Seobeo_Handle_Read(p_ws->p_handle); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
317 if (r < 0) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
318 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
319 Seobeo_Log(SEOBEO_ERROR, "WebSocket read error\n"); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
320 p_ws->state = SEOBEO_WS_STATE_CLOSED; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
321 return NULL; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
322 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
323 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
324 if (r == -2) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
325 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
326 Seobeo_Log(SEOBEO_INFO, "WebSocket connection closed\n"); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
327 p_ws->state = SEOBEO_WS_STATE_CLOSED; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
328 return NULL; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
329 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
330 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
331 if (p_ws->p_handle->read_buffer_len < 2) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
332 return NULL; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
333 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
334 uint8 *buf = p_ws->p_handle->read_buffer; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
335 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
336 uint8 byte1 = buf[0]; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
337 uint8 byte2 = buf[1]; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
338 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
339 boolean fin = (byte1 & 0x80) != 0; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
340 Seobeo_WebSocket_Opcode opcode = (Seobeo_WebSocket_Opcode)(byte1 & 0x0F); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
341 boolean masked = (byte2 & 0x80) != 0; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
342 uint64 payload_len = byte2 & 0x7F; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
343 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
344 size_t header_len = 2; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
345 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
346 if (payload_len == 126) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
347 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
348 if (p_ws->p_handle->read_buffer_len < 4) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
349 return NULL; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
350 payload_len = (buf[2] << 8) | buf[3]; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
351 header_len += 2; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
352 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
353 else if (payload_len == 127) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
354 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
355 if (p_ws->p_handle->read_buffer_len < 10) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
356 return NULL; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
357 payload_len = 0; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
358 for (int i = 0; i < 8; i++) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
359 payload_len = (payload_len << 8) | buf[2 + i]; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
360 header_len += 8; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
361 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
362 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
363 uint8 mask_key[4] = {0}; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
364 if (masked) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
365 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
366 if (p_ws->p_handle->read_buffer_len < header_len + 4) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
367 return NULL; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
368 memcpy(mask_key, buf + header_len, 4); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
369 header_len += 4; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
370 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
371 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
372 if (p_ws->p_handle->read_buffer_len < header_len + payload_len) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
373 return NULL; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
374 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
375 uint8 *payload = NULL; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
376 if (payload_len > 0) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
377 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
378 payload = malloc(payload_len); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
379 memcpy(payload, buf + header_len, payload_len); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
380 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
381 if (masked) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
382 Seobeo_WebSocket_Mask_Data(payload, payload_len, mask_key); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
383 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
384 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
385 Seobeo_Handle_Consume(p_ws->p_handle, (uint32)(header_len + payload_len)); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
386 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
387 if (opcode == SEOBEO_WS_OPCODE_PING) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
388 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
389 Seobeo_WebSocket_Send_Pong(p_ws, (char*)payload); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
390 if (payload) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
391 free(payload); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
392 return NULL; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
393 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
394 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
395 if (opcode == SEOBEO_WS_OPCODE_PONG) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
396 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
397 if (payload) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
398 free(payload); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
399 return NULL; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
400 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
401 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
402 if (opcode == SEOBEO_WS_OPCODE_CLOSE) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
403 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
404 uint16 close_code = 1000; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
405 if (payload_len >= 2) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
406 close_code = (payload[0] << 8) | payload[1]; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
407 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
408 Seobeo_Log(SEOBEO_INFO, "WebSocket close received with code %d\n", close_code); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
409 p_ws->state = SEOBEO_WS_STATE_CLOSING; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
410 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
411 Seobeo_WebSocket_Send_Frame(p_ws, SEOBEO_WS_OPCODE_CLOSE, payload, payload_len, TRUE); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
412 p_ws->state = SEOBEO_WS_STATE_CLOSED; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
413 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
414 if (payload) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
415 free(payload); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
416 return NULL; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
417 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
418 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
419 if (opcode == SEOBEO_WS_OPCODE_CONTINUATION) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
420 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
421 if (p_ws->fragment_length + payload_len > p_ws->fragment_capacity) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
422 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
423 p_ws->fragment_capacity = (p_ws->fragment_length + payload_len) * 2; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
424 p_ws->fragment_buffer = realloc(p_ws->fragment_buffer, p_ws->fragment_capacity); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
425 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
426 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
427 if (payload_len > 0) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
428 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
429 memcpy(p_ws->fragment_buffer + p_ws->fragment_length, payload, payload_len); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
430 p_ws->fragment_length += payload_len; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
431 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
432 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
433 if (payload) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
434 free(payload); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
435 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
436 if (!fin) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
437 return NULL; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
438 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
439 Seobeo_WebSocket_Message *p_msg = malloc(sizeof(Seobeo_WebSocket_Message)); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
440 p_msg->opcode = p_ws->fragment_opcode; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
441 p_msg->data = malloc(p_ws->fragment_length); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
442 memcpy(p_msg->data, p_ws->fragment_buffer, p_ws->fragment_length); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
443 p_msg->length = p_ws->fragment_length; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
444 p_msg->is_final = TRUE; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
445 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
446 p_ws->fragment_length = 0; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
447 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
448 return p_msg; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
449 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
450 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
451 if (!fin) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
452 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
453 p_ws->fragment_opcode = opcode; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
454 p_ws->fragment_length = 0; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
455 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
456 if (payload_len > 0) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
457 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
458 if (payload_len > p_ws->fragment_capacity) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
459 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
460 p_ws->fragment_capacity = payload_len * 2; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
461 p_ws->fragment_buffer = realloc(p_ws->fragment_buffer, p_ws->fragment_capacity); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
462 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
463 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
464 memcpy(p_ws->fragment_buffer, payload, payload_len); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
465 p_ws->fragment_length = payload_len; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
466 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
467 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
468 if (payload) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
469 free(payload); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
470 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
471 return NULL; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
472 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
473 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
474 Seobeo_WebSocket_Message *p_msg = malloc(sizeof(Seobeo_WebSocket_Message)); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
475 p_msg->opcode = opcode; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
476 p_msg->data = payload; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
477 p_msg->length = payload_len; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
478 p_msg->is_final = fin; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
479 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
480 return p_msg; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
481 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
482 |
|
125
f236c895604e
[MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents:
121
diff
changeset
|
483 // Seobeo_WebSocket_Message_Destroy moved to s_websocket_common.c |
|
120
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
484 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
485 int32 Seobeo_WebSocket_Close(Seobeo_WebSocket *p_ws, uint16 code, const char *reason) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
486 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
487 if (!p_ws || p_ws->state == SEOBEO_WS_STATE_CLOSED) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
488 return -1; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
489 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
490 p_ws->state = SEOBEO_WS_STATE_CLOSING; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
491 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
492 size_t reason_len = reason ? strlen(reason) : 0; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
493 size_t payload_len = 2 + reason_len; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
494 uint8 *payload = malloc(payload_len); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
495 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
496 payload[0] = (uint8)((code >> 8) & 0xFF); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
497 payload[1] = (uint8)(code & 0xFF); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
498 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
499 if (reason_len > 0) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
500 memcpy(payload + 2, reason, reason_len); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
501 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
502 int32 result = Seobeo_WebSocket_Send_Frame(p_ws, SEOBEO_WS_OPCODE_CLOSE, payload, payload_len, TRUE); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
503 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
504 free(payload); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
505 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
506 p_ws->state = SEOBEO_WS_STATE_CLOSED; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
507 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
508 return result; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
509 } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
510 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
511 void Seobeo_WebSocket_Destroy(Seobeo_WebSocket *p_ws) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
512 { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
513 if (!p_ws) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
514 return; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
515 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
516 if (p_ws->state == SEOBEO_WS_STATE_OPEN) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
517 Seobeo_WebSocket_Close(p_ws, 1000, "Normal closure"); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
518 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
519 if (p_ws->p_handle) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
520 Seobeo_Handle_Destroy(p_ws->p_handle); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
521 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
522 if (p_ws->fragment_buffer) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
523 free(p_ws->fragment_buffer); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
524 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
525 if (p_ws->p_arena) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
526 Dowa_Arena_Free(p_ws->p_arena); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
527 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
528 free(p_ws); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
529 } |