aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/http/Server.zig49
1 files changed, 30 insertions, 19 deletions
diff --git a/src/http/Server.zig b/src/http/Server.zig
index 955b8cc..dc331d8 100644
--- a/src/http/Server.zig
+++ b/src/http/Server.zig
@@ -23,32 +23,43 @@ pub fn init(
}
pub fn serve(self: *Self, gpa: std.mem.Allocator) !void {
- var read_buffer: [1024 * 8]u8 = undefined;
- var write_buffer: [1024 * 8]u8 = undefined;
+ var group: std.Io.Group = .init;
+ const io = self.threaded.io();
while (true) {
const stream = try self.server.accept(self.threaded.io());
- defer stream.close(self.threaded.io());
+ group.async(io, handle, .{self, gpa, stream});
+ }
+}
+
+pub fn handle(
+ self: *Self,
+ gpa: std.mem.Allocator,
+ stream: std.Io.net.Stream,
+) void {
+ var read_buffer: [1024 * 8]u8 = undefined;
+ var write_buffer: [1024 * 8]u8 = undefined;
- var reader = stream.reader(self.threaded.io(), &read_buffer);
- var writer = stream.writer(self.threaded.io(), &write_buffer);
+ defer stream.close(self.threaded.io());
- var server: std.http.Server = .init(&reader.interface, &writer.interface);
- var request = server.receiveHead() catch |e| {
- std.debug.print("error: {}\n", .{e});
- continue;
- };
+ var arena: std.heap.ArenaAllocator = .init(gpa);
+ defer arena.deinit();
- std.debug.print("{s} {s}\n", .{ @tagName(request.head.method), request.head.target });
+ var reader = stream.reader(self.threaded.io(), &read_buffer);
+ var writer = stream.writer(self.threaded.io(), &write_buffer);
+
+ var server: std.http.Server = .init(&reader.interface, &writer.interface);
+ var request = server.receiveHead() catch |e| {
+ std.debug.print("error: {}\n", .{e});
+ return;
+ };
- var arena: std.heap.ArenaAllocator = .init(gpa);
- defer arena.deinit();
+ std.debug.print("{s} {s}\n", .{ @tagName(request.head.method), request.head.target });
- 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("", .{ .status = .not_found }) catch continue;
- }
+ 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 return;
+ } else {
+ request.respond("", .{ .status = .not_found }) catch return;
}
}