aboutsummaryrefslogtreecommitdiff
path: root/src/cgi/submit.zig
diff options
context:
space:
mode:
authorRosa <rosaontheweb@proton.me>2026-05-27 19:47:23 -0400
committerRosa <rosaontheweb@proton.me>2026-05-27 19:47:23 -0400
commit600e21fa5c4e232f135b7728b111f6268f95a71f (patch)
tree7cc2ab46b8039b4b5fb0a07a798e1a90d9b7784e /src/cgi/submit.zig
parent13b2ec0cd728ea55e393806c0032e24bc11ed9f5 (diff)
write a crappy little cgi program for form processing
Diffstat (limited to 'src/cgi/submit.zig')
-rw-r--r--src/cgi/submit.zig40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/cgi/submit.zig b/src/cgi/submit.zig
new file mode 100644
index 0000000..b94c546
--- /dev/null
+++ b/src/cgi/submit.zig
@@ -0,0 +1,40 @@
+const std = @import("std");
+
+pub fn main(init: std.process.Init) !void {
+ const query_string = init.environ_map.get("QUERY_STRING").?;
+ var decoded = try init.gpa.alloc(u8, query_string.len);
+ @memcpy(decoded, query_string);
+ decoded = std.Uri.percentDecodeInPlace(decoded);
+ std.mem.replaceScalar(u8, decoded, '+', ' ');
+
+ // Parse the query string.
+ var args_map = std.StringHashMap([]const u8).init(init.gpa);
+ defer args_map.deinit();
+ var args = std.mem.splitScalar(u8, decoded, '&');
+ while (args.next()) |arg| {
+ const arg_and_value = std.mem.cutScalar(u8, arg, '=').?;
+ try args_map.put(arg_and_value[0], arg_and_value[1]);
+ }
+
+ const out_path = init.environ_map.get("OUT_PATH").?;
+ const out_file = try std.Io.Dir.createFileAbsolute(init.io, out_path, .{ .truncate = false });
+ defer out_file.close(init.io);
+ const current_size = (try out_file.stat(init.io)).size;
+ var buf: [128]u8 = undefined;
+ var writer = out_file.writer(init.io, &buf);
+ if (current_size == 0) {
+ try writer.interface.print("name,email,website,about\r\n", .{});
+ } else {
+ try writer.seekTo(current_size);
+ }
+ try writer.interface.print("{s},{s},{s},{s}\r\n", .{
+ args_map.get("name").?,
+ args_map.get("email").?,
+ args_map.get("website").?,
+ args_map.get("about").?,
+ });
+ try writer.interface.flush();
+
+ // redirect back to the homepage
+ try std.Io.File.stdout().writeStreamingAll(init.io, "HTTP/1.0 302 Found\r\nLocation: https://eviltransgenders.club/join\r\n\r\n");
+}