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"); }