annotate seobeo/snapshot_creator.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 7eb79fd91c7e
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
67
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
1 #include "seobeo/snapshot_creator.h"
126
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
2 #include "seobeo/seobeo_internal.h"
67
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
3 #include <stdio.h>
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
4 #include <stdlib.h>
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
5 #include <string.h>
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
6 #include <sys/stat.h>
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
7 #include <unistd.h>
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
8
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
9 static void path_to_filename(const char *path, char *filename, size_t max_len)
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
10 {
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
11 if (strcmp(path, "/") == 0)
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
12 {
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
13 snprintf(filename, max_len, "root.snapshot");
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
14 return;
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
15 }
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
16
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
17 const char *p = path;
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
18 if (*p == '/')
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
19 p++;
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
20
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
21 char *out = filename;
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
22 size_t remaining = max_len - 1;
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
23
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
24 while (*p && remaining > 0)
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
25 {
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
26 if (*p == '/')
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
27 {
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
28 *out++ = '_';
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
29 remaining--;
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
30 }
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
31 else
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
32 {
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
33 *out++ = *p;
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
34 remaining--;
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
35 }
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
36 p++;
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
37 }
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
38
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
39 snprintf(out, remaining, ".snapshot");
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
40 }
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
41
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
42 // Helper: Create directory recursively
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
43 static int create_directory(const char *path)
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
44 {
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
45 char tmp[1024];
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
46 char *p = NULL;
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
47 size_t len;
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
48
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
49 snprintf(tmp, sizeof(tmp), "%s", path);
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
50 len = strlen(tmp);
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
51 if (tmp[len - 1] == '/')
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
52 {
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
53 tmp[len - 1] = 0;
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
54 }
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
55
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
56 for (p = tmp + 1; *p; p++)
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
57 {
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
58 if (*p == '/')
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
59 {
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
60 *p = 0;
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
61 mkdir(tmp, 0755);
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
62 *p = '/';
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
63 }
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
64 }
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
65 return mkdir(tmp, 0755);
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
66 }
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
67
126
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
68 // Helper: Build full HTTP response from Seobeo_Client_Response
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
69 static char* build_full_response(Seobeo_Client_Response *p_resp, size_t *len_out)
67
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
70 {
126
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
71 if (!p_resp)
67
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
72 return NULL;
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
73
126
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
74 // Calculate total response size
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
75 size_t status_line_len = 100; // "HTTP/1.1 200 OK\r\n"
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
76 size_t headers_len = 0;
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
77 size_t body_len = p_resp->body_length;
67
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
78
126
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
79 // Estimate header size
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
80 if (p_resp->headers)
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
81 {
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
82 size_t header_count = Dowa_Array_Length(p_resp->headers);
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
83 for (size_t i = 0; i < header_count; i++)
67
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
84 {
126
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
85 headers_len += strlen(p_resp->headers[i].key) + strlen(p_resp->headers[i].value) + 4; // ": " + "\r\n"
67
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
86 }
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
87 }
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
88
126
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
89 size_t total_size = status_line_len + headers_len + 2 + body_len + 1; // +2 for "\r\n", +1 for null terminator
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
90 char *response = malloc(total_size);
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
91 if (!response)
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
92 return NULL;
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
93
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
94 // Build status line
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
95 int offset = snprintf(response, total_size, "HTTP/1.1 %d %s\r\n",
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
96 p_resp->status_code,
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
97 p_resp->status_text ? p_resp->status_text : "OK");
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
98
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
99 // Add headers
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
100 if (p_resp->headers)
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
101 {
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
102 size_t header_count = Dowa_Array_Length(p_resp->headers);
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
103 for (size_t i = 0; i < header_count; i++)
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
104 {
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
105 offset += snprintf(response + offset, total_size - offset, "%s: %s\r\n",
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
106 p_resp->headers[i].key,
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
107 p_resp->headers[i].value);
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
108 }
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
109 }
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
110
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
111 // End of headers
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
112 offset += snprintf(response + offset, total_size - offset, "\r\n");
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
113
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
114 // Add body
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
115 if (p_resp->body && body_len > 0)
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
116 {
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
117 memcpy(response + offset, p_resp->body, body_len);
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
118 offset += body_len;
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
119 }
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
120
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
121 response[offset] = '\0';
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
122 *len_out = offset;
67
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
123 return response;
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
124 }
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
125
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
126 // Helper: Write snapshot to file
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
127 static int write_snapshot(const char *filepath, const char *data, size_t size)
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
128 {
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
129 // Create directory if needed
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
130 char dir_copy[1024];
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
131 snprintf(dir_copy, sizeof(dir_copy), "%s", filepath);
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
132
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
133 char *last_slash = strrchr(dir_copy, '/');
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
134 if (last_slash)
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
135 {
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
136 *last_slash = '\0';
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
137 create_directory(dir_copy);
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
138 }
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
139
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
140 FILE *f = fopen(filepath, "wb");
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
141 if (!f)
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
142 {
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
143 perror("fopen");
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
144 return -1;
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
145 }
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
146
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
147 size_t written = fwrite(data, 1, size, f);
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
148 fclose(f);
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
149
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
150 return (written == size) ? 0 : -1;
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
151 }
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
152
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
153 int Seobeo_Snapshot_Create(const SnapshotConfig *config)
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
154 {
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
155 if (!config || !config->path || !config->snapshot_dir || !config->host || !config->port)
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
156 {
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
157 fprintf(stderr, "Invalid snapshot config\n");
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
158 return -1;
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
159 }
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
160
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
161 printf("Creating snapshot: %s (expecting %d)\n", config->path, config->expected_status);
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
162
126
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
163 // Build URL
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
164 char url[2048];
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
165 snprintf(url, sizeof(url), "http://%s:%s%s", config->host, config->port, config->path);
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
166
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
167 // Create HTTP request
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
168 Seobeo_Client_Request *p_req = Seobeo_Client_Request_Create(url);
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
169 if (!p_req)
67
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
170 {
126
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
171 fprintf(stderr, " ✗ Failed to create request for %s\n", url);
67
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
172 return -1;
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
173 }
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
174
126
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
175 // Execute request
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
176 Seobeo_Client_Response *p_resp = Seobeo_Client_Request_Execute(p_req);
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
177 if (!p_resp)
67
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
178 {
126
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
179 fprintf(stderr, " ✗ Failed to get response\n");
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
180 Seobeo_Client_Request_Destroy(p_req);
67
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
181 return -1;
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
182 }
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
183
126
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
184 // Check status code
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
185 if (p_resp->status_code != config->expected_status)
67
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
186 {
126
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
187 fprintf(stderr, " ✗ Status mismatch: expected %d, got %d\n",
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
188 config->expected_status, p_resp->status_code);
128
7eb79fd91c7e [Misc] Fixed all bazel targets. I should creat a separate scripts for these lol.
June Park <parkjune1995@gmail.com>
parents: 126
diff changeset
189 // fprintf(stderr, "%s", p_resp->body);
126
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
190 Seobeo_Client_Response_Destroy(p_resp);
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
191 Seobeo_Client_Request_Destroy(p_req);
67
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
192 return -1;
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
193 }
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
194
126
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
195 printf(" ✓ Status: %d\n", p_resp->status_code);
e7899c93da77 Remove playground.
June Park <parkjune1995@gmail.com>
parents: 67
diff changeset
196
67
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
197 // Generate snapshot filename
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
198 char filename[256];
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
199 path_to_filename(config->path, filename, sizeof(filename));
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
200
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
201 char filepath[1024];
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
202 snprintf(filepath, sizeof(filepath), "%s/%s", config->snapshot_dir, filename);
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
203
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
204 // Write snapshot
128
7eb79fd91c7e [Misc] Fixed all bazel targets. I should creat a separate scripts for these lol.
June Park <parkjune1995@gmail.com>
parents: 126
diff changeset
205 if (write_snapshot(filepath, p_resp->body, p_resp->body_length) == 0)
67
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
206 {
128
7eb79fd91c7e [Misc] Fixed all bazel targets. I should creat a separate scripts for these lol.
June Park <parkjune1995@gmail.com>
parents: 126
diff changeset
207 printf(" ✓ Snapshot saved: %s (%zu bytes)\n", filepath, p_resp->body_length);
67
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
208 return 0;
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
209 }
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
210 else
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
211 {
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
212 fprintf(stderr, " ✗ Failed to write snapshot: %s\n", filepath);
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
213 return -1;
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
214 }
128
7eb79fd91c7e [Misc] Fixed all bazel targets. I should creat a separate scripts for these lol.
June Park <parkjune1995@gmail.com>
parents: 126
diff changeset
215
7eb79fd91c7e [Misc] Fixed all bazel targets. I should creat a separate scripts for these lol.
June Park <parkjune1995@gmail.com>
parents: 126
diff changeset
216 Seobeo_Client_Response_Destroy(p_resp);
7eb79fd91c7e [Misc] Fixed all bazel targets. I should creat a separate scripts for these lol.
June Park <parkjune1995@gmail.com>
parents: 126
diff changeset
217 Seobeo_Client_Request_Destroy(p_req);
67
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
218 }
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
219
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
220 int Seobeo_Snapshots_Create_Batch(const SnapshotConfig configs[], int count)
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
221 {
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
222 int failed = 0;
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
223 int passed = 0;
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
224
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
225 for (int i = 0; i < count; i++)
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
226 {
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
227 if (Seobeo_Snapshot_Create(&configs[i]) == 0)
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
228 passed++;
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
229 else
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
230 failed++;
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
231 printf("\n");
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
232 }
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
233
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
234 printf("=== Summary ===\n");
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
235 printf("Created: %d\n", passed);
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
236 printf("Failed: %d\n", failed);
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
237
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
238 return (failed == 0) ? 0 : -1;
6626ec933933 [Seobeo] Separated out Client Server logic. Created test tools.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
239 }