aboutsummaryrefslogtreecommitdiff
path: root/src/http/Server.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/http/Server.zig')
-rw-r--r--src/http/Server.zig22
1 files changed, 13 insertions, 9 deletions
diff --git a/src/http/Server.zig b/src/http/Server.zig
index 71037bb..955b8cc 100644
--- a/src/http/Server.zig
+++ b/src/http/Server.zig
@@ -1,23 +1,28 @@
const std = @import("std");
+const RouteSet = @import("RouteSet.zig");
+
const Self = @This();
server: std.Io.net.Server,
threaded: std.Io.Threaded,
+routes: RouteSet,
pub fn init(
gpa: std.mem.Allocator,
address: std.Io.net.IpAddress,
+ comptime routes: RouteSet,
) !Self {
var threaded: std.Io.Threaded = .init(gpa, .{});
return .{
.threaded = threaded,
.server = try address.listen(threaded.io(), .{ .reuse_address = true }),
+ .routes = routes,
};
}
-pub fn serve(self: *Self, content: []const u8) !void {
+pub fn serve(self: *Self, gpa: std.mem.Allocator) !void {
var read_buffer: [1024 * 8]u8 = undefined;
var write_buffer: [1024 * 8]u8 = undefined;
@@ -36,15 +41,14 @@ pub fn serve(self: *Self, content: []const u8) !void {
std.debug.print("{s} {s}\n", .{ @tagName(request.head.method), request.head.target });
- if (std.mem.eql(u8, request.head.target, "/")) {
- request.respond(content, .{
- .status = .ok,
- .extra_headers = &.{
- .{ .name = "Content-Type", .value = "text/html" },
- },
- }) catch continue;
+ var arena: std.heap.ArenaAllocator = .init(gpa);
+ defer arena.deinit();
+
+ if (self.routes.getInterface(request.head.target)) |interface| {
+ const message = interface.handle(gpa, arena.allocator(), self.threaded.io(), &request);
+ message.send(self.threaded.io(), &request) catch continue;
} else {
- request.respond("Not Found", .{ .status = .not_found }) catch continue;
+ request.respond("", .{ .status = .not_found }) catch continue;
}
}
}