Mercurial
annotate seobeo/tests/seobeo_sse_server_test.c @ 279:b3b547563ec7
Add Google connector service and agent wiki
Implement the C/Seobeo Google Drive and Gmail connector with encrypted OAuth storage, Zenbu authentication, browser testing, AI tool discovery, chunked HTTP decoding, and Bazel coverage. Consolidate repository guidance into progressive wiki documentation and enforce arena-first allocation for new first-party C code.
Co-authored-by: Copilot <[email protected]>
Copilot-Session: 84c338fd-0939-4bb3-b7f3-1062eb213e5d
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Mon, 17 Aug 2026 22:22:36 -0700 |
| parents | 1f9877b637e9 |
| children |
| rev | line source |
|---|---|
|
257
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
1 #include "seobeo/seobeo.h" |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
2 |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
3 #include <assert.h> |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
4 #include <errno.h> |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
5 #include <stdio.h> |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
6 #include <stdlib.h> |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
7 #include <string.h> |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
8 #include <sys/socket.h> |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
9 #include <sys/wait.h> |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
10 #include <unistd.h> |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
11 |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
12 static int reserve_port(void) |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
13 { |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
14 int socket_fd = socket(AF_INET, SOCK_STREAM, 0); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
15 assert(socket_fd >= 0); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
16 struct sockaddr_in address = { |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
17 .sin_family = AF_INET, |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
18 .sin_addr.s_addr = htonl(INADDR_LOOPBACK), |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
19 .sin_port = 0, |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
20 }; |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
21 assert(bind( |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
22 socket_fd, |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
23 (struct sockaddr *)&address, |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
24 sizeof(address)) == 0); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
25 socklen_t length = sizeof(address); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
26 assert(getsockname( |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
27 socket_fd, |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
28 (struct sockaddr *)&address, |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
29 &length) == 0); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
30 int port = ntohs(address.sin_port); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
31 close(socket_fd); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
32 return port; |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
33 } |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
34 |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
35 static int connect_to(int port) |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
36 { |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
37 int socket_fd = socket(AF_INET, SOCK_STREAM, 0); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
38 if (socket_fd < 0) |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
39 return -1; |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
40 struct timeval timeout = { |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
41 .tv_sec = 3, |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
42 }; |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
43 setsockopt( |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
44 socket_fd, |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
45 SOL_SOCKET, |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
46 SO_RCVTIMEO, |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
47 &timeout, |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
48 sizeof(timeout)); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
49 struct sockaddr_in address = { |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
50 .sin_family = AF_INET, |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
51 .sin_addr.s_addr = htonl(INADDR_LOOPBACK), |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
52 .sin_port = htons((uint16)port), |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
53 }; |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
54 if (connect( |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
55 socket_fd, |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
56 (struct sockaddr *)&address, |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
57 sizeof(address)) != 0) |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
58 { |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
59 close(socket_fd); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
60 return -1; |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
61 } |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
62 return socket_fd; |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
63 } |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
64 |
|
260
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
65 static void send_request( |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
66 int socket_fd, |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
67 const char *method, |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
68 const char *path, |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
69 const char *body) |
|
257
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
70 { |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
71 char request[512]; |
|
260
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
72 size_t body_length = body ? strlen(body) : 0; |
|
257
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
73 int length = snprintf( |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
74 request, |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
75 sizeof(request), |
|
260
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
76 "%s %s HTTP/1.1\r\n" |
|
257
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
77 "Host: 127.0.0.1\r\n" |
|
260
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
78 "Content-Length: %zu\r\n" |
|
257
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
79 "Connection: keep-alive\r\n" |
|
260
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
80 "\r\n" |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
81 "%s", |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
82 method, |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
83 path, |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
84 body_length, |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
85 body ? body : ""); |
|
257
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
86 assert(length > 0 && (size_t)length < sizeof(request)); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
87 assert(send(socket_fd, request, (size_t)length, 0) == length); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
88 } |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
89 |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
90 static size_t receive_until( |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
91 int socket_fd, |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
92 char *buffer, |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
93 size_t capacity, |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
94 const char *needle) |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
95 { |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
96 size_t used = 0; |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
97 while (used + 1 < capacity) |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
98 { |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
99 ssize_t amount = recv( |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
100 socket_fd, |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
101 buffer + used, |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
102 capacity - used - 1, |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
103 0); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
104 assert(amount > 0); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
105 used += (size_t)amount; |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
106 buffer[used] = '\0'; |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
107 if (strstr(buffer, needle)) |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
108 return used; |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
109 } |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
110 assert(FALSE && "response exceeded test buffer"); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
111 return 0; |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
112 } |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
113 |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
114 static pid_t start_server( |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
115 const char *binary, |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
116 const char *port) |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
117 { |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
118 pid_t pid = fork(); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
119 assert(pid >= 0); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
120 if (pid == 0) |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
121 { |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
122 execl(binary, binary, port, NULL); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
123 _exit(127); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
124 } |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
125 |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
126 int numeric_port = atoi(port); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
127 for (int attempt = 0; attempt < 100; attempt++) |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
128 { |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
129 int socket_fd = connect_to(numeric_port); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
130 if (socket_fd >= 0) |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
131 { |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
132 close(socket_fd); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
133 return pid; |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
134 } |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
135 usleep(20000); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
136 } |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
137 kill(pid, SIGTERM); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
138 waitpid(pid, NULL, 0); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
139 assert(FALSE && "SSE test server did not start"); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
140 return -1; |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
141 } |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
142 |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
143 int main(int argc, char **argv) |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
144 { |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
145 assert(argc == 2); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
146 int port = reserve_port(); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
147 char port_text[16]; |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
148 snprintf(port_text, sizeof(port_text), "%d", port); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
149 pid_t server = start_server(argv[1], port_text); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
150 |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
151 int event_socket = connect_to(port); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
152 assert(event_socket >= 0); |
|
260
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
153 send_request(event_socket, "GET", "/events", NULL); |
|
257
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
154 char events[4096] = {0}; |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
155 receive_until( |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
156 event_socket, |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
157 events, |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
158 sizeof(events), |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
159 "data: later\n\n"); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
160 assert(strstr(events, "HTTP/1.1 200 OK\r\n")); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
161 assert(strstr(events, "Content-Type: text/event-stream\r\n")); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
162 assert(strstr(events, "data: connected\n\n")); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
163 |
|
260
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
164 int post_socket = connect_to(port); |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
165 assert(post_socket >= 0); |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
166 send_request( |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
167 post_socket, |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
168 "POST", |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
169 "/events/builds", |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
170 "deploy=release"); |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
171 char post_events[4096] = {0}; |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
172 receive_until( |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
173 post_socket, |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
174 post_events, |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
175 sizeof(post_events), |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
176 "data: topic=builds body=deploy=release\n\n"); |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
177 assert(strstr(post_events, "HTTP/1.1 200 OK\r\n")); |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
178 assert(strstr(post_events, "Content-Type: text/event-stream\r\n")); |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
179 |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
180 int wrong_method_socket = connect_to(port); |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
181 assert(wrong_method_socket >= 0); |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
182 send_request( |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
183 wrong_method_socket, |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
184 "PUT", |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
185 "/events/builds", |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
186 NULL); |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
187 char wrong_method[1024] = {0}; |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
188 receive_until( |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
189 wrong_method_socket, |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
190 wrong_method, |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
191 sizeof(wrong_method), |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
192 "\r\n\r\n"); |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
193 assert(strstr(wrong_method, "HTTP/1.1 404 Not Found\r\n")); |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
194 |
|
257
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
195 int health_socket = connect_to(port); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
196 assert(health_socket >= 0); |
|
260
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
197 send_request(health_socket, "GET", "/health", NULL); |
|
257
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
198 assert(shutdown(health_socket, SHUT_WR) == 0); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
199 char health[1024] = {0}; |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
200 receive_until(health_socket, health, sizeof(health), "\r\n\r\nok"); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
201 assert(strstr(health, "HTTP/1.1 200 OK\r\n")); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
202 |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
203 close(health_socket); |
|
260
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
204 close(wrong_method_socket); |
|
1f9877b637e9
Add Copilot-powered cyberpunk JRPG chat
MrJuneJune <mrjunejune@users.noreply.github.com>
parents:
257
diff
changeset
|
205 close(post_socket); |
|
257
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
206 close(event_socket); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
207 kill(server, SIGTERM); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
208 waitpid(server, NULL, 0); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
209 printf("Seobeo SSE server integration test passed\n"); |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
210 return 0; |
|
609d3c6aff4e
[seobeo] Add persistent SSE streams
MrJuneJune <me@mrjunejune.com>
parents:
diff
changeset
|
211 } |