From 600e21fa5c4e232f135b7728b111f6268f95a71f Mon Sep 17 00:00:00 2001 From: Rosa Date: Wed, 27 May 2026 19:47:23 -0400 Subject: write a crappy little cgi program for form processing --- src/cgi/submit.zig | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 src/cgi/submit.zig (limited to 'src/cgi') 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"); +} -- cgit v1.3.1