aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--.gitignore1
-rw-r--r--build.zig31
-rw-r--r--src/cgi/submit.zig40
-rw-r--r--src/pages/join/index.html2
4 files changed, 66 insertions, 8 deletions
diff --git a/.gitignore b/.gitignore
index 7e295f8..f320ec1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,4 +3,5 @@
/html-out
*.tar.gz
/.zig-cache
+/zig-out
/zig-pkg
diff --git a/build.zig b/build.zig
index 11898e4..5148a6c 100644
--- a/build.zig
+++ b/build.zig
@@ -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(&copy_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>