Mercurial
annotate seobeo/seobeo.h @ 272:41a49c29a28f
polish JRPG conversation experience
Integrate desktop conversations into the utility panel, simplify the mobile frame, add modal destinations and a reusable Zenbu composer lab, and preserve explicit conversation resume behavior.
Co-authored-by: Copilot <[email protected]>
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Fri, 07 Aug 2026 16:05:29 -0700 |
| parents | 04fee26ecce0 |
| children |
| rev | line source |
|---|---|
|
1
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
1 #ifndef SEOBEO_SERVER_H |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
2 #define SEOBEO_SERVER_H |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
3 |
|
19
875bb6e10db7
[Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents:
18
diff
changeset
|
4 /** |
|
875bb6e10db7
[Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents:
18
diff
changeset
|
5 * Seobeo |
|
875bb6e10db7
[Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents:
18
diff
changeset
|
6 * ------ |
|
875bb6e10db7
[Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents:
18
diff
changeset
|
7 * |
|
875bb6e10db7
[Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents:
18
diff
changeset
|
8 * Library for starting TCP, UDP server and serving static file or path. |
|
875bb6e10db7
[Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents:
18
diff
changeset
|
9 */ |
|
1
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
10 |
| 96 | 11 #include "seobeo/seobeo_internal.h" |
|
250
745fd127b2a1
[seobeo] Add bounded worker interface
MrJuneJune <me@mrjunejune.com>
parents:
244
diff
changeset
|
12 #include "seobeo/seobeo_worker.h" |
|
64
a30944e5719e
Added vibe coded markdown to html script since it is useful for me. Updated Dowa so that it can be compiled without dirnet for windows.
June Park <parkjune1995@gmail.com>
parents:
36
diff
changeset
|
13 |
| 96 | 14 #include <stdarg.h> |
|
1
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
15 #include <unistd.h> |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
16 #include <errno.h> |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
17 #include <string.h> |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
18 #include <sys/types.h> |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
19 #include <sys/socket.h> |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
20 #include <netinet/in.h> |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
21 #include <netdb.h> |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
22 #include <arpa/inet.h> |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
23 #include <sys/wait.h> |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
24 #include <signal.h> |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
25 #include <fcntl.h> |
|
7
114cad94008f
[Seobeo] Updated to support thread and edge server calls.
June Park <parkjune1995@gmail.com>
parents:
6
diff
changeset
|
26 #include <pthread.h> |
|
1
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
27 |
|
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
28 |
|
4
0b3b4f5887bb
[Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents:
3
diff
changeset
|
29 #define INITIAL_BUFFER_CAPACITY 4096 |
|
257
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
251
diff
changeset
|
30 #define SEOBEO_SSE_RETRY_NONE -1 |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
251
diff
changeset
|
31 #define SEOBEO_SSE_EVENT_TOO_LARGE -2 |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
251
diff
changeset
|
32 #define SEOBEO_SSE_INVALID_EVENT -3 |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
251
diff
changeset
|
33 #define SEOBEO_SSE_BACKPRESSURE -4 |
|
4
0b3b4f5887bb
[Seobeo] Updated so that it create socket for both server and clients.
June Park <parkjune1995@gmail.com>
parents:
3
diff
changeset
|
34 |
|
6
1e61008b9980
[Seobeo] Updated seobeo so that API is more opinionated. Added my webpage./build.sh
June Park <parkjune1995@gmail.com>
parents:
5
diff
changeset
|
35 // HTTP STATUS CODE |
|
1e61008b9980
[Seobeo] Updated seobeo so that API is more opinionated. Added my webpage./build.sh
June Park <parkjune1995@gmail.com>
parents:
5
diff
changeset
|
36 #define HTTP_OK 200 |
|
1e61008b9980
[Seobeo] Updated seobeo so that API is more opinionated. Added my webpage./build.sh
June Park <parkjune1995@gmail.com>
parents:
5
diff
changeset
|
37 #define HTTP_CREATED 201 |
|
223
0e7b9464248d
[hg-web] Add browser route regression coverage
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
38 #define HTTP_NO_CONTENT 204 |
|
6
1e61008b9980
[Seobeo] Updated seobeo so that API is more opinionated. Added my webpage./build.sh
June Park <parkjune1995@gmail.com>
parents:
5
diff
changeset
|
39 #define HTTP_MOVED_PERMANENTLY 301 |
|
1e61008b9980
[Seobeo] Updated seobeo so that API is more opinionated. Added my webpage./build.sh
June Park <parkjune1995@gmail.com>
parents:
5
diff
changeset
|
40 #define HTTP_FOUND 302 |
|
1e61008b9980
[Seobeo] Updated seobeo so that API is more opinionated. Added my webpage./build.sh
June Park <parkjune1995@gmail.com>
parents:
5
diff
changeset
|
41 #define HTTP_BAD_REQUEST 400 |
|
1e61008b9980
[Seobeo] Updated seobeo so that API is more opinionated. Added my webpage./build.sh
June Park <parkjune1995@gmail.com>
parents:
5
diff
changeset
|
42 #define HTTP_UNAUTHORIZED 401 |
|
1e61008b9980
[Seobeo] Updated seobeo so that API is more opinionated. Added my webpage./build.sh
June Park <parkjune1995@gmail.com>
parents:
5
diff
changeset
|
43 #define HTTP_FORBIDDEN 403 |
|
1e61008b9980
[Seobeo] Updated seobeo so that API is more opinionated. Added my webpage./build.sh
June Park <parkjune1995@gmail.com>
parents:
5
diff
changeset
|
44 #define HTTP_NOT_FOUND 404 |
|
244
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
45 #define HTTP_PAYLOAD_TOO_LARGE 413 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
46 #define HTTP_UNPROCESSABLE_CONTENT 422 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
47 #define HTTP_TOO_MANY_REQUESTS 429 |
|
b8aa08503378
[tools] Add sandboxed online LaTeX editor
MrJuneJune <me@mrjunejune.com>
parents:
223
diff
changeset
|
48 #define HTTP_SERVICE_UNAVAILABLE 503 |
|
6
1e61008b9980
[Seobeo] Updated seobeo so that API is more opinionated. Added my webpage./build.sh
June Park <parkjune1995@gmail.com>
parents:
5
diff
changeset
|
49 #define HTTP_INTERNAL_ERROR 500 |
|
1e61008b9980
[Seobeo] Updated seobeo so that API is more opinionated. Added my webpage./build.sh
June Park <parkjune1995@gmail.com>
parents:
5
diff
changeset
|
50 |
|
79
5710108c949e
[Seobeo] Added Redirect logic.
June Park <parkjune1995@gmail.com>
parents:
78
diff
changeset
|
51 #define CREATE_REDIRECT_HANDLER(name, target_url) \ |
|
5710108c949e
[Seobeo] Added Redirect logic.
June Park <parkjune1995@gmail.com>
parents:
78
diff
changeset
|
52 Seobeo_Request_Entry* GetRedirect##name(Seobeo_Request_Entry *req, Dowa_Arena *arena) \ |
|
5710108c949e
[Seobeo] Added Redirect logic.
June Park <parkjune1995@gmail.com>
parents:
78
diff
changeset
|
53 { \ |
|
5710108c949e
[Seobeo] Added Redirect logic.
June Park <parkjune1995@gmail.com>
parents:
78
diff
changeset
|
54 Seobeo_Request_Entry *resp = NULL; \ |
|
5710108c949e
[Seobeo] Added Redirect logic.
June Park <parkjune1995@gmail.com>
parents:
78
diff
changeset
|
55 Dowa_HashMap_Push_Arena(resp, "status", "301", arena); \ |
|
5710108c949e
[Seobeo] Added Redirect logic.
June Park <parkjune1995@gmail.com>
parents:
78
diff
changeset
|
56 Dowa_HashMap_Push_Arena(resp, "content-type", "text/plain", arena); \ |
|
5710108c949e
[Seobeo] Added Redirect logic.
June Park <parkjune1995@gmail.com>
parents:
78
diff
changeset
|
57 Dowa_HashMap_Push_Arena(resp, "Body", "", arena); \ |
|
5710108c949e
[Seobeo] Added Redirect logic.
June Park <parkjune1995@gmail.com>
parents:
78
diff
changeset
|
58 Dowa_HashMap_Push_Arena(resp, "Location", target_url, arena); \ |
|
5710108c949e
[Seobeo] Added Redirect logic.
June Park <parkjune1995@gmail.com>
parents:
78
diff
changeset
|
59 return resp; \ |
|
5710108c949e
[Seobeo] Added Redirect logic.
June Park <parkjune1995@gmail.com>
parents:
78
diff
changeset
|
60 } |
|
5710108c949e
[Seobeo] Added Redirect logic.
June Park <parkjune1995@gmail.com>
parents:
78
diff
changeset
|
61 |
|
36
84672efec192
[Zenbu] WIP fixing issues regarding to using edge only. I think there is a problem where socket closes before sending back the info.
MrJuneJune <me@mrjunejune.com>
parents:
19
diff
changeset
|
62 extern volatile sig_atomic_t stop_server; |
|
84672efec192
[Zenbu] WIP fixing issues regarding to using edge only. I think there is a problem where socket closes before sending back the info.
MrJuneJune <me@mrjunejune.com>
parents:
19
diff
changeset
|
63 |
|
3
2758f5527d2b
[Seobeo] Working on simple TCP server and client logic.
June Park <parkjune1995@gmail.com>
parents:
1
diff
changeset
|
64 // --- TCP --- // |
|
19
875bb6e10db7
[Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents:
18
diff
changeset
|
65 // --- Generate a Server Handle. ---// |
|
66
a0f0ad5e42eb
[Misc] taking out capital P stuff.
June Park <parkjune1995@gmail.com>
parents:
64
diff
changeset
|
66 extern Seobeo_Handle *Seobeo_Stream_Handle_Server_Create(const char *host, const char* port); |
|
19
875bb6e10db7
[Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents:
18
diff
changeset
|
67 // --- Generate a Client Handle. ---// |
|
66
a0f0ad5e42eb
[Misc] taking out capital P stuff.
June Park <parkjune1995@gmail.com>
parents:
64
diff
changeset
|
68 extern Seobeo_Handle *Seobeo_Stream_Handle_Client_Create(const char *host, const char* port, boolean use_tls); |
|
19
875bb6e10db7
[Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents:
18
diff
changeset
|
69 // --- Generate a Client Handle from given Server Handle. ---// |
|
66
a0f0ad5e42eb
[Misc] taking out capital P stuff.
June Park <parkjune1995@gmail.com>
parents:
64
diff
changeset
|
70 extern Seobeo_Handle *Seobeo_Stream_Handle_Server_Accept(Seobeo_Handle *p_server_handle); |
|
6
1e61008b9980
[Seobeo] Updated seobeo so that API is more opinionated. Added my webpage./build.sh
June Park <parkjune1995@gmail.com>
parents:
5
diff
changeset
|
71 |
|
1e61008b9980
[Seobeo] Updated seobeo so that API is more opinionated. Added my webpage./build.sh
June Park <parkjune1995@gmail.com>
parents:
5
diff
changeset
|
72 // --- Web --- // |
|
19
875bb6e10db7
[Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents:
18
diff
changeset
|
73 /* Generate HTTP 1.1 Header value with given content_types and length. */ |
|
875bb6e10db7
[Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents:
18
diff
changeset
|
74 extern void Seobeo_Web_Header_Generate(void *buffer, int status, const char *content_type, const int content_length); |
|
183
a8976a008a9d
[BenchMark] Added bun bench mark to test seoboe vs other popular benchmarks.
MrJuneJune <me@mrjunejune.com>
parents:
163
diff
changeset
|
75 /* Generate HTTP 1.1 Header with keep-alive option. */ |
|
a8976a008a9d
[BenchMark] Added bun bench mark to test seoboe vs other popular benchmarks.
MrJuneJune <me@mrjunejune.com>
parents:
163
diff
changeset
|
76 extern void Seobeo_Web_Header_Generate_KeepAlive(void *buffer, int status, const char *content_type, const int content_length, boolean keep_alive); |
|
19
875bb6e10db7
[Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents:
18
diff
changeset
|
77 /* Start a Generic HTTP static file server with given folder. It will store folder into memory. */ |
|
875bb6e10db7
[Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents:
18
diff
changeset
|
78 extern int Seobeo_Web_Server_Start(const char *folder_path, const char *port, Seobeo_ServerMode mode, int thread_count); |
|
251
117c4d53c9a4
[ui] Add HTML-first Web Component system
MrJuneJune <me@mrjunejune.com>
parents:
250
diff
changeset
|
79 /* Start a web server bound to a specific host. Pass NULL to bind all interfaces. */ |
|
117c4d53c9a4
[ui] Add HTML-first Web Component system
MrJuneJune <me@mrjunejune.com>
parents:
250
diff
changeset
|
80 extern int Seobeo_Web_Server_Start_On(const char *host, const char *folder_path, const char *port, Seobeo_ServerMode mode, int thread_count); |
|
260
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
81 /* Request a running server to stop and return from its start function. */ |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
82 extern void Seobeo_Web_Server_Stop(void); |
|
19
875bb6e10db7
[Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents:
18
diff
changeset
|
83 /* Generic HTTP GET Rquest to given host and port with path. It will mimic chrome. */ |
|
875bb6e10db7
[Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents:
18
diff
changeset
|
84 extern int Seobeo_Web_Client_Get(const char *host, const char *port, const char *path); |
|
119
c39582f937e5
[Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents:
96
diff
changeset
|
85 |
|
c39582f937e5
[Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents:
96
diff
changeset
|
86 // --- HTTP Client (curl-like API) --- // |
|
c39582f937e5
[Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents:
96
diff
changeset
|
87 /* Create a new HTTP client request with the given URL. */ |
|
c39582f937e5
[Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents:
96
diff
changeset
|
88 extern Seobeo_Client_Request *Seobeo_Client_Request_Create(const char *url); |
|
c39582f937e5
[Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents:
96
diff
changeset
|
89 /* Set HTTP method (GET, POST, PUT, DELETE, etc.). Default is GET. */ |
|
c39582f937e5
[Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents:
96
diff
changeset
|
90 extern void Seobeo_Client_Request_Set_Method(Seobeo_Client_Request *p_req, const char *method); |
|
c39582f937e5
[Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents:
96
diff
changeset
|
91 /* Add a header using key-value pairs (stored in HashMap). */ |
|
c39582f937e5
[Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents:
96
diff
changeset
|
92 extern void Seobeo_Client_Request_Add_Header_Map(Seobeo_Client_Request *p_req, const char *key, const char *value); |
|
c39582f937e5
[Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents:
96
diff
changeset
|
93 /* Add a header as a string "Key: Value" (stored in Array). */ |
|
c39582f937e5
[Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents:
96
diff
changeset
|
94 extern void Seobeo_Client_Request_Add_Header_Array(Seobeo_Client_Request *p_req, const char *header); |
|
c39582f937e5
[Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents:
96
diff
changeset
|
95 /* Set request body with given data and length. */ |
|
c39582f937e5
[Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents:
96
diff
changeset
|
96 extern void Seobeo_Client_Request_Set_Body(Seobeo_Client_Request *p_req, const char *body, size_t length); |
|
c39582f937e5
[Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents:
96
diff
changeset
|
97 /* Enable/disable following redirects with max redirect count. Default is FALSE with 10 max. */ |
|
c39582f937e5
[Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents:
96
diff
changeset
|
98 extern void Seobeo_Client_Request_Set_Follow_Redirects(Seobeo_Client_Request *p_req, boolean follow, int32 max_redirects); |
|
221
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
186
diff
changeset
|
99 /* Set the maximum idle time for HTTP response reads. Zero disables the timeout. */ |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
186
diff
changeset
|
100 extern void Seobeo_Client_Request_Set_Timeout_Milliseconds(Seobeo_Client_Request *p_req, int32 timeout_ms); |
|
119
c39582f937e5
[Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents:
96
diff
changeset
|
101 /* Set download path to save response body to file instead of memory. */ |
|
c39582f937e5
[Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents:
96
diff
changeset
|
102 extern void Seobeo_Client_Request_Set_Download_Path(Seobeo_Client_Request *p_req, const char *path); |
|
c39582f937e5
[Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents:
96
diff
changeset
|
103 /* Execute the HTTP request and return response. */ |
|
c39582f937e5
[Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents:
96
diff
changeset
|
104 extern Seobeo_Client_Response *Seobeo_Client_Request_Execute(Seobeo_Client_Request *p_req); |
|
c39582f937e5
[Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents:
96
diff
changeset
|
105 /* Destroy request and free all resources. */ |
|
c39582f937e5
[Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents:
96
diff
changeset
|
106 extern void Seobeo_Client_Request_Destroy(Seobeo_Client_Request *p_req); |
|
c39582f937e5
[Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents:
96
diff
changeset
|
107 /* Destroy response and free all resources. */ |
|
c39582f937e5
[Seobeo Client] Added client side logic which will be used for all my other calls instead of curl.
June Park <parkjune1995@gmail.com>
parents:
96
diff
changeset
|
108 extern void Seobeo_Client_Response_Destroy(Seobeo_Client_Response *p_resp); |
|
120
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
109 |
|
147
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
125
diff
changeset
|
110 // --- HTTP Web related helper functions --- // |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
125
diff
changeset
|
111 extern void Seobeo_Url_Decode(char *dst, const char *src); |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
125
diff
changeset
|
112 |
|
120
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
113 /** |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
114 * WebSocket Client API |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
115 * ------ |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
116 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
117 * # Overview |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
118 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
119 * A clean, easy-to-use WebSocket client library following RFC 6455. It will auto handle over 64 bits long data into a continous stream. |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
120 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
121 * ## Examples |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
122 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
123 * ### 1. Simple Text Echo |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
124 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
125 * ```c |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
126 * // Connect to WebSocket server |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
127 * Seobeo_WebSocket *p_ws = Seobeo_WebSocket_Connect("wss://echo.websocket.org"); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
128 * if (!p_ws) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
129 * { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
130 * printf("Failed to connect\n"); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
131 * return; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
132 * } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
133 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
134 * // Send text message |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
135 * const char *message = "Hello, WebSocket!"; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
136 * Seobeo_WebSocket_Send_Text(p_ws, message); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
137 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
138 * // Receive echo response |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
139 * Seobeo_WebSocket_Message *p_msg = Seobeo_WebSocket_Receive(p_ws); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
140 * if (p_msg && p_msg->opcode == SEOBEO_WS_OPCODE_TEXT) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
141 * { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
142 * printf("Received: %.*s\n", (int)p_msg->length, (char*)p_msg->data); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
143 * Seobeo_WebSocket_Message_Destroy(p_msg); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
144 * } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
145 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
146 * // Close connection |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
147 * Seobeo_WebSocket_Close(p_ws, 1000, "Normal closure"); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
148 * Seobeo_WebSocket_Destroy(p_ws); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
149 * ``` |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
150 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
151 * ### 2. Binary Data Transfer |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
152 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
153 * ```c |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
154 * Seobeo_WebSocket *p_ws = Seobeo_WebSocket_Connect("wss://example.com/data"); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
155 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
156 * // Send binary data |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
157 * uint8 data[] = {0x01, 0x02, 0x03, 0xAA, 0xBB, 0xCC}; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
158 * Seobeo_WebSocket_Send_Binary(p_ws, data, sizeof(data)); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
159 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
160 * // Receive binary response |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
161 * Seobeo_WebSocket_Message *p_msg = Seobeo_WebSocket_Receive(p_ws); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
162 * if (p_msg && p_msg->opcode == SEOBEO_WS_OPCODE_BINARY) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
163 * { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
164 * printf("Received %zu bytes\n", p_msg->length); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
165 * // Process binary data... |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
166 * Seobeo_WebSocket_Message_Destroy(p_msg); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
167 * } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
168 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
169 * Seobeo_WebSocket_Destroy(p_ws); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
170 * ``` |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
171 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
172 * ### 3. Chat Application |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
173 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
174 * ```c |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
175 * Seobeo_WebSocket *p_ws = Seobeo_WebSocket_Connect("wss://chat.example.com"); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
176 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
177 * // Send chat message |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
178 * Seobeo_WebSocket_Send_Text(p_ws, "Hello everyone!"); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
179 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
180 * // Continuous receive loop |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
181 * while (1) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
182 * { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
183 * Seobeo_WebSocket_Message *p_msg = Seobeo_WebSocket_Receive(p_ws); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
184 * if (p_msg) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
185 * { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
186 * if (p_msg->opcode == SEOBEO_WS_OPCODE_TEXT) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
187 * { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
188 * printf("Chat: %.*s\n", (int)p_msg->length, (char*)p_msg->data); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
189 * } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
190 * Seobeo_WebSocket_Message_Destroy(p_msg); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
191 * } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
192 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
193 * usleep(10000); // 10ms sleep to avoid busy waiting |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
194 * } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
195 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
196 * Seobeo_WebSocket_Destroy(p_ws); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
197 * ``` |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
198 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
199 * ### 4. Ping/Pong Keep-Alive |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
200 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
201 * ```c |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
202 * Seobeo_WebSocket *p_ws = Seobeo_WebSocket_Connect("wss://api.example.com"); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
203 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
204 * // Send ping to keep connection alive |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
205 * Seobeo_WebSocket_Send_Ping(p_ws, "keep-alive"); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
206 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
207 * // Server will automatically receive pong responses |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
208 * // (pong responses are handled internally) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
209 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
210 * Seobeo_WebSocket_Destroy(p_ws); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
211 * ``` |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
212 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
213 * ### 5. Handling Different Message Types |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
214 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
215 * ```c |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
216 * Seobeo_WebSocket *p_ws = Seobeo_WebSocket_Connect("wss://example.com"); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
217 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
218 * while (1) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
219 * { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
220 * Seobeo_WebSocket_Message *p_msg = Seobeo_WebSocket_Receive(p_ws); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
221 * if (p_msg) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
222 * { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
223 * switch (p_msg->opcode) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
224 * { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
225 * case SEOBEO_WS_OPCODE_TEXT: |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
226 * printf("Text: %.*s\n", (int)p_msg->length, (char*)p_msg->data); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
227 * break; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
228 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
229 * case SEOBEO_WS_OPCODE_BINARY: |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
230 * printf("Binary: %zu bytes\n", p_msg->length); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
231 * break; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
232 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
233 * default: |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
234 * printf("Unknown opcode: 0x%X\n", p_msg->opcode); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
235 * break; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
236 * } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
237 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
238 * Seobeo_WebSocket_Message_Destroy(p_msg); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
239 * } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
240 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
241 * usleep(10000); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
242 * } |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
243 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
244 * Seobeo_WebSocket_Destroy(p_ws); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
245 * ``` |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
246 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
247 * ### 6. Graceful Shutdown |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
248 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
249 * ```c |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
250 * Seobeo_WebSocket *p_ws = Seobeo_WebSocket_Connect("wss://example.com"); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
251 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
252 * // Do work... |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
253 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
254 * // Close with custom status code and reason |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
255 * Seobeo_WebSocket_Close(p_ws, 1000, "Client shutting down"); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
256 * Seobeo_WebSocket_Destroy(p_ws); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
257 * ``` |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
258 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
259 * ## WebSocket Close Codes |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
260 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
261 * Common close status codes (RFC 6455): |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
262 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
263 * - **1000**: Normal closure |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
264 * - **1001**: Going away (e.g., server shutdown, browser navigation) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
265 * - **1002**: Protocol error |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
266 * - **1003**: Unsupported data type |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
267 * - **1006**: Abnormal closure (no close frame received) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
268 * - **1007**: Invalid frame payload data |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
269 * - **1008**: Policy violation |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
270 * - **1009**: Message too big |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
271 * - **1010**: Mandatory extension missing |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
272 * - **1011**: Internal server error |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
273 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
274 * ## Building |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
275 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
276 * ### Build the library: |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
277 * ```bash |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
278 * bazel build //seobeo:seobeo_client |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
279 * ``` |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
280 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
281 * ### Build and run the WebSocket test: |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
282 * ```bash |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
283 * bazel test //seobeo:seobeo_websocket_test |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
284 * ``` |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
285 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
286 * ## Message Structure |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
287 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
288 * ```c |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
289 * typedef struct { |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
290 * Seobeo_WebSocket_Opcode opcode; // Message type |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
291 * uint8 *data; // Message payload |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
292 * size_t length; // Payload length |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
293 * boolean is_final; // Final fragment flag |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
294 * } Seobeo_WebSocket_Message; |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
295 * ``` |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
296 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
297 * ## Protocol Details |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
298 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
299 * The implementation follows RFC 6455 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
300 * |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
301 * 1. **Handshake**: HTTP Upgrade request with `Sec-WebSocket-Key` |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
302 * 2. **Frame Format**: Proper FIN, opcode, mask, and payload length handling |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
303 * 3. **Masking**: All client-to-server frames are masked (required by RFC) |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
304 * 4. **Fragmentation**: Handles fragmented messages across multiple frames |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
305 * 5. **Control Frames**: Proper handling of ping, pong, and close frames |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
306 */ |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
307 |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
308 /* Connect to WebSocket server with given URL (ws:// or wss://). */ |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
309 extern Seobeo_WebSocket *Seobeo_WebSocket_Connect(const char *url); |
|
163
058de208e640
[Config] Adding os ignore files.
June Park <parkjune1995@gmail.com>
parents:
125
diff
changeset
|
310 /* Connect to WebSocket server with custom headers. Headers should be newline-separated "Key: Value" pairs. */ |
|
058de208e640
[Config] Adding os ignore files.
June Park <parkjune1995@gmail.com>
parents:
125
diff
changeset
|
311 extern Seobeo_WebSocket *Seobeo_WebSocket_Connect_With_Headers(const char *url, const char *headers); |
|
120
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
312 /* Send text message over WebSocket. */ |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
313 extern 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:
119
diff
changeset
|
314 /* Send binary message over WebSocket. */ |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
315 extern 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:
119
diff
changeset
|
316 /* Send ping frame (for keep-alive). */ |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
317 extern 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:
119
diff
changeset
|
318 /* Send pong frame (usually in response to ping). */ |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
319 extern 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:
119
diff
changeset
|
320 /* Receive a message from WebSocket. Returns NULL if no message available or on error. */ |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
321 extern Seobeo_WebSocket_Message *Seobeo_WebSocket_Receive(Seobeo_WebSocket *p_ws); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
322 /* Destroy received message. */ |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
323 extern void Seobeo_WebSocket_Message_Destroy(Seobeo_WebSocket_Message *p_msg); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
324 /* Close WebSocket connection with status code and optional reason. */ |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
325 extern 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:
119
diff
changeset
|
326 /* Destroy WebSocket and free all resources. */ |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
327 extern void Seobeo_WebSocket_Destroy(Seobeo_WebSocket *p_ws); |
|
cbbf78b17cfa
[Seobeo][Websocket] Created Web socket client logic.
June Park <parkjune1995@gmail.com>
parents:
119
diff
changeset
|
328 |
|
121
7b1719fa918c
[Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
120
diff
changeset
|
329 // --- WebSocket Server API --- // |
|
7b1719fa918c
[Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
120
diff
changeset
|
330 /* Initialize WebSocket server routing system. Call before registering routes. */ |
|
7b1719fa918c
[Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
120
diff
changeset
|
331 extern void Seobeo_WebSocket_Server_Init(); |
|
7b1719fa918c
[Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
120
diff
changeset
|
332 /* Register a WebSocket route handler for a specific path. */ |
|
7b1719fa918c
[Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
120
diff
changeset
|
333 extern 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:
120
diff
changeset
|
334 /* Send text message to specific WebSocket client. */ |
|
7b1719fa918c
[Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
120
diff
changeset
|
335 extern 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:
120
diff
changeset
|
336 /* Send binary message to specific WebSocket client. */ |
|
7b1719fa918c
[Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
120
diff
changeset
|
337 extern 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:
120
diff
changeset
|
338 /* Broadcast text message to all connected WebSocket clients. */ |
|
125
f236c895604e
[MrJuneJune] Added web socket for chat to this.
June Park <parkjune1995@gmail.com>
parents:
121
diff
changeset
|
339 extern 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:
120
diff
changeset
|
340 /* Broadcast binary message to all connected WebSocket clients. */ |
|
7b1719fa918c
[Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
120
diff
changeset
|
341 extern void Seobeo_WebSocket_Server_Broadcast_Binary(const uint8 *data, size_t length); |
|
7b1719fa918c
[Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
120
diff
changeset
|
342 /* Close WebSocket connection with status code and reason. */ |
|
7b1719fa918c
[Seobeo] Added web socket server.
June Park <parkjune1995@gmail.com>
parents:
120
diff
changeset
|
343 extern 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:
120
diff
changeset
|
344 |
|
72
4532ce6d9eb8
[Seobeo] Added router to the server logic. Few dowa string manipulation logics.
June Park <parkjune1995@gmail.com>
parents:
66
diff
changeset
|
345 /* Initialize the router system (called automatically by Seobeo_Web_Server_Start) */ |
|
175
71ad34a8bc9a
[HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents:
173
diff
changeset
|
346 extern void Seobeo_Router_Init(); |
|
72
4532ce6d9eb8
[Seobeo] Added router to the server logic. Few dowa string manipulation logics.
June Park <parkjune1995@gmail.com>
parents:
66
diff
changeset
|
347 /* Register an API route handler. Call before starting server. */ |
|
175
71ad34a8bc9a
[HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents:
173
diff
changeset
|
348 extern void Seobeo_Router_Register(const char *method, const char *path_pattern, Seobeo_Route_Handler handler); |
|
71ad34a8bc9a
[HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents:
173
diff
changeset
|
349 /* Register a streaming route handler. Handler receives client handle for direct streaming. */ |
|
71ad34a8bc9a
[HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents:
173
diff
changeset
|
350 extern void Seobeo_Router_Register_Stream(const char *method, const char *path_pattern, Seobeo_Stream_Handler handler); |
|
260
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
351 /* Register an SSE route for a specific HTTP method. */ |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
352 extern void Seobeo_Router_Register_SSE_Method(const char *method, const char *path_pattern, Seobeo_SSE_Handler handler); |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
353 /* Register a GET SSE route for compatibility. */ |
|
257
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
251
diff
changeset
|
354 extern void Seobeo_Router_Register_SSE(const char *path_pattern, Seobeo_SSE_Handler handler); |
|
72
4532ce6d9eb8
[Seobeo] Added router to the server logic. Few dowa string manipulation logics.
June Park <parkjune1995@gmail.com>
parents:
66
diff
changeset
|
355 /* Clean up router resources */ |
|
175
71ad34a8bc9a
[HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents:
173
diff
changeset
|
356 extern void Seobeo_Router_Destroy(); |
|
72
4532ce6d9eb8
[Seobeo] Added router to the server logic. Few dowa string manipulation logics.
June Park <parkjune1995@gmail.com>
parents:
66
diff
changeset
|
357 /* Find matching route handler (internal use) */ |
|
175
71ad34a8bc9a
[HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents:
173
diff
changeset
|
358 extern Seobeo_Route_Handler Seobeo_Router_Find_Handler(const char *method, const char *path, Seobeo_Request_Entry **pp_request_map, Dowa_Arena *p_arena); |
|
72
4532ce6d9eb8
[Seobeo] Added router to the server logic. Few dowa string manipulation logics.
June Park <parkjune1995@gmail.com>
parents:
66
diff
changeset
|
359 /* Send HTTP response from response map (internal use) */ |
|
175
71ad34a8bc9a
[HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents:
173
diff
changeset
|
360 extern void Seobeo_Router_Send_Response(Seobeo_Handle *p_handle, Seobeo_Request_Entry *p_response_map, Dowa_Arena *p_arena); |
|
183
a8976a008a9d
[BenchMark] Added bun bench mark to test seoboe vs other popular benchmarks.
MrJuneJune <me@mrjunejune.com>
parents:
163
diff
changeset
|
361 /* Send HTTP response with keep-alive option */ |
| 186 | 362 extern void Seobeo_Router_Send_Response_KeepAlive(Seobeo_Handle *p_handle, Seobeo_Request_Entry *p_response_map, Dowa_Arena *p_arena, boolean keep_alive); |
|
175
71ad34a8bc9a
[HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents:
173
diff
changeset
|
363 extern char *Seobeo_Web_LoadFile(const char *file_path, size_t *p_file_size); |
| 186 | 364 /* Being a proxy and keeping the client open */ |
|
175
71ad34a8bc9a
[HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents:
173
diff
changeset
|
365 extern Seobeo_Stream_Handler Seobeo_Router_Find_Stream_Handler(const char *method, const char *path, Seobeo_Request_Entry **pp_request_map, Dowa_Arena *p_arena); |
|
257
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
251
diff
changeset
|
366 extern Seobeo_SSE_Handler Seobeo_Router_Find_SSE_Handler(const char *method, const char *path, Seobeo_Request_Entry **pp_request_map, Dowa_Arena *p_arena); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
251
diff
changeset
|
367 |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
251
diff
changeset
|
368 /* Start an SSE response and send its required HTTP headers. */ |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
251
diff
changeset
|
369 extern int32 Seobeo_SSE_Start(Seobeo_SSE_Stream *p_stream, Seobeo_Handle *p_handle); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
251
diff
changeset
|
370 /* Send one SSE record. retry_ms may be SEOBEO_SSE_RETRY_NONE. */ |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
251
diff
changeset
|
371 extern int32 Seobeo_SSE_Send(Seobeo_SSE_Stream *p_stream, const Seobeo_SSE_Event *p_event); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
251
diff
changeset
|
372 /* Send a data-only SSE record. */ |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
251
diff
changeset
|
373 extern int32 Seobeo_SSE_Send_Data(Seobeo_SSE_Stream *p_stream, const char *data); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
251
diff
changeset
|
374 /* Send a comment/heartbeat record. */ |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
251
diff
changeset
|
375 extern int32 Seobeo_SSE_Send_Comment(Seobeo_SSE_Stream *p_stream, const char *comment); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
251
diff
changeset
|
376 /* Flush queued SSE bytes. Returns 1 when the socket would block. */ |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
251
diff
changeset
|
377 extern int32 Seobeo_SSE_Flush(Seobeo_SSE_Stream *p_stream); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
251
diff
changeset
|
378 /* Return TRUE while the stream can still accept records. */ |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
251
diff
changeset
|
379 extern boolean Seobeo_SSE_Is_Open(const Seobeo_SSE_Stream *p_stream); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
251
diff
changeset
|
380 /* Retain a stream before storing it beyond the connection callback. */ |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
251
diff
changeset
|
381 extern boolean Seobeo_SSE_Retain(Seobeo_SSE_Stream *p_stream); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
251
diff
changeset
|
382 /* Release a previously retained stream. */ |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
251
diff
changeset
|
383 extern void Seobeo_SSE_Release(Seobeo_SSE_Stream *p_stream); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
251
diff
changeset
|
384 /* Stop accepting records. The router retains ownership of the handle. */ |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
251
diff
changeset
|
385 extern void Seobeo_SSE_Close(Seobeo_SSE_Stream *p_stream); |
|
264
04fee26ecce0
add authenticated JRPG conversation platform
MrJuneJune <me@mrjunejune.com>
parents:
260
diff
changeset
|
386 /* |
|
04fee26ecce0
add authenticated JRPG conversation platform
MrJuneJune <me@mrjunejune.com>
parents:
260
diff
changeset
|
387 * Register a callback invoked when the client disconnects (handle detached). |
|
04fee26ecce0
add authenticated JRPG conversation platform
MrJuneJune <me@mrjunejune.com>
parents:
260
diff
changeset
|
388 * The callback is called AFTER g_sse_mutex is released and may safely acquire |
|
04fee26ecce0
add authenticated JRPG conversation platform
MrJuneJune <me@mrjunejune.com>
parents:
260
diff
changeset
|
389 * other locks. The stream pointer remains valid for the callback's duration |
|
04fee26ecce0
add authenticated JRPG conversation platform
MrJuneJune <me@mrjunejune.com>
parents:
260
diff
changeset
|
390 * (the caller's retained reference keeps it alive). |
|
04fee26ecce0
add authenticated JRPG conversation platform
MrJuneJune <me@mrjunejune.com>
parents:
260
diff
changeset
|
391 * cb may be NULL to clear a previously registered callback. |
|
04fee26ecce0
add authenticated JRPG conversation platform
MrJuneJune <me@mrjunejune.com>
parents:
260
diff
changeset
|
392 */ |
|
04fee26ecce0
add authenticated JRPG conversation platform
MrJuneJune <me@mrjunejune.com>
parents:
260
diff
changeset
|
393 extern void Seobeo_SSE_Set_Detach_Callback( |
|
04fee26ecce0
add authenticated JRPG conversation platform
MrJuneJune <me@mrjunejune.com>
parents:
260
diff
changeset
|
394 Seobeo_SSE_Stream *p_stream, |
|
04fee26ecce0
add authenticated JRPG conversation platform
MrJuneJune <me@mrjunejune.com>
parents:
260
diff
changeset
|
395 void (*cb)(Seobeo_SSE_Stream *, void *), |
|
04fee26ecce0
add authenticated JRPG conversation platform
MrJuneJune <me@mrjunejune.com>
parents:
260
diff
changeset
|
396 void *ctx); |
|
72
4532ce6d9eb8
[Seobeo] Added router to the server logic. Few dowa string manipulation logics.
June Park <parkjune1995@gmail.com>
parents:
66
diff
changeset
|
397 |
|
5
3e12bf044589
Fixed Dowa hashmap to recursively add files into memory.
June Park <parkjune1995@gmail.com>
parents:
4
diff
changeset
|
398 // --- Helper functions --- // |
|
19
875bb6e10db7
[Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents:
18
diff
changeset
|
399 /* Destroy handle. It will handle all NULL poointers. */ |
|
66
a0f0ad5e42eb
[Misc] taking out capital P stuff.
June Park <parkjune1995@gmail.com>
parents:
64
diff
changeset
|
400 extern void Seobeo_Handle_Destroy(Seobeo_Handle *p_handle); |
|
19
875bb6e10db7
[Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents:
18
diff
changeset
|
401 /* Write to socket from write_buffer in the handle. */ |
|
257
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
251
diff
changeset
|
402 extern int32 Seobeo_Handle_Flush(Seobeo_Handle *p_handle); |
|
19
875bb6e10db7
[Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents:
18
diff
changeset
|
403 /* Write to socket with given data source, if the data source is bigger than the write buffer for handle then we just directly write from the data source. */ |
|
257
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
251
diff
changeset
|
404 extern int32 Seobeo_Handle_Queue(Seobeo_Handle *p_handle, const uint8 *data, uint32 data_size); |
|
19
875bb6e10db7
[Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents:
18
diff
changeset
|
405 /* Read to socket from read_buffer in the handle. */ |
|
257
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
251
diff
changeset
|
406 extern int32 Seobeo_Handle_Read(Seobeo_Handle *p_handle); |
|
19
875bb6e10db7
[Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents:
18
diff
changeset
|
407 /* Move to read_buffer to front and we already consumed the given amount in the handle. */ |
|
66
a0f0ad5e42eb
[Misc] taking out capital P stuff.
June Park <parkjune1995@gmail.com>
parents:
64
diff
changeset
|
408 extern void Seobeo_Handle_Consume(Seobeo_Handle *p_handle, uint32 consumed); |
|
19
875bb6e10db7
[Seobeo] Chaning Function naming to be easily readable.
June Park <parkjune1995@gmail.com>
parents:
18
diff
changeset
|
409 /* Assign IP4 or IP6 to sockaddr. TODO: Maybe create my own struct for this? */ |
| 96 | 410 extern void *Seobeo_Get_IP4_Or_IP6(struct sockaddr *sa); |
| 411 /* Logging */ | |
| 412 typedef enum { | |
| 413 SEOBEO_INFO = 0, | |
| 414 SEOBEO_WARNING, | |
| 415 SEOBEO_ERROR, | |
| 416 SEOBEO_DEBUG, | |
| 417 } Seobeo_Log_Level; | |
| 418 extern int Seobeo_Log(Seobeo_Log_Level level, const char *format, ...); | |
|
1
adcfad6e86fb
Updated naming and separated out some logic within seobeo.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
419 #endif |