diff options
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | build.zig | 31 | ||||
| -rw-r--r-- | src/cgi/submit.zig | 40 | ||||
| -rw-r--r-- | src/pages/join/index.html | 2 |
4 files changed, 66 insertions, 8 deletions
@@ -3,4 +3,5 @@ /html-out *.tar.gz /.zig-cache +/zig-out /zig-pkg @@ -2,13 +2,29 @@ const std = @import("std"); const webgen = @import("webgen"); pub fn build(b: *std.Build) void { + const optimize = b.standardOptimizeOption(.{}); + const target = b.standardTargetOptions(.{}); + const run_webgen = webgen.installHtmlStep(b); run_webgen.addDirectoryArg(b.path("src")); - const bundle_html = b.addSystemCommand(&[_][]const u8{ "tar", "--exclude=pages.tar.gz", "-czvf", "html-out/pages.tar.gz", "html-out" }); + const cgi_app = b.addExecutable(.{ + .name = "submit.cgi", + .root_module = b.createModule(.{ + .optimize = optimize, + .root_source_file = b.path("src/cgi/submit.zig"), + .target = target, + }), + }); + b.installArtifact(cgi_app); + const run_cgi = b.step("run_cgi", "Run the CGI application"); + run_cgi.dependOn(&b.addRunArtifact(cgi_app).step); + + const bundle_html = b.addSystemCommand(&.{ "tar", "--exclude=pages.tar.gz", "-czvf", "html-out/pages.tar.gz", "html-out", "zig-out" }); bundle_html.step.dependOn(&run_webgen.step); b.getInstallStep().dependOn(&bundle_html.step); - const serve = b.addSystemCommand(&[_][]const u8{ "lighttpd", "-Df", "util/lighttpd.conf" }); + const serve = b.addSystemCommand(&.{ "lighttpd", "-Df" }); + serve.addFileArg(b.path("util/lighttpd.conf")); const run_server = b.step("serve", "Run a local test server"); serve.step.dependOn(b.getInstallStep()); run_server.dependOn(&serve.step); @@ -19,11 +35,12 @@ pub fn build(b: *std.Build) void { copy_bundle.addFileArg(b.path("html-out/pages.tar.gz")); copy_bundle.addArg("debian@www.eviltransgenders.club:pages.tar.gz"); - const unpack_bundle = b.addSystemCommand(&.{ - "ssh", - "debian@www.eviltransgenders.club", - "cp pages.tar.gz /var/www/www.eviltransgenders.club && cd /var/www/www.eviltransgenders.club && tar -xvf /var/www/www.eviltransgenders.club/pages.tar.gz" - }); + const unpack_bundle = b.addSystemCommand(&.{ "ssh", "debian@www.eviltransgenders.club", "cp pages.tar.gz /var/www/www.eviltransgenders.club && cd /var/www/www.eviltransgenders.club && tar -xvf /var/www/www.eviltransgenders.club/pages.tar.gz" }); unpack_bundle.step.dependOn(©_bundle.step); publish_to_prod.dependOn(&unpack_bundle.step); + + const clean_html = b.addSystemCommand(&.{"rm", "-r"}); + clean_html.addFileArg(b.path("html-out")); + clean_html.addFileArg(b.path("zig-out")); + b.getUninstallStep().dependOn(&clean_html.step); } 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"); +} diff --git a/src/pages/join/index.html b/src/pages/join/index.html index f519bb1..9f5b08a 100644 --- a/src/pages/join/index.html +++ b/src/pages/join/index.html @@ -46,7 +46,7 @@ join <!--: replace body --> <main> - <form> + <form action="submit"> <header> <h2>Join the club.</h2> <p class="subtle">Required fields are marked with an asterisk.</p> |
