1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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");
}
|