zig std: use threads for the http server

This commit is contained in:
Andrew Kelley 2024-03-06 18:00:34 -07:00
parent c7c7ad1b78
commit 574b33e65a

View file

@ -36,25 +36,33 @@ pub fn main() !void {
.zig_lib_directory = zig_lib_directory, .zig_lib_directory = zig_lib_directory,
}; };
var read_buffer: [8000]u8 = undefined; while (true) {
accept: while (true) {
const connection = try http_server.accept(); const connection = try http_server.accept();
defer connection.stream.close(); _ = std.Thread.spawn(.{}, accept, .{ &context, connection }) catch |err| {
std.log.err("unable to accept connection: {s}", .{@errorName(err)});
connection.stream.close();
continue;
};
}
}
var server = std.http.Server.init(connection, &read_buffer); fn accept(context: *Context, connection: std.net.Server.Connection) void {
while (server.state == .ready) { defer connection.stream.close();
var request = server.receiveHead() catch |err| switch (err) {
error.HttpConnectionClosing => continue :accept, var read_buffer: [8000]u8 = undefined;
else => { var server = std.http.Server.init(connection, &read_buffer);
std.log.err("closing http connection: {s}", .{@errorName(err)}); while (server.state == .ready) {
continue :accept; var request = server.receiveHead() catch |err| switch (err) {
}, error.HttpConnectionClosing => return,
}; else => {
serveRequest(&request, &context) catch |err| { std.log.err("closing http connection: {s}", .{@errorName(err)});
std.log.err("unable to serve {s}: {s}", .{ request.head.target, @errorName(err) }); return;
continue :accept; },
}; };
} serveRequest(&request, context) catch |err| {
std.log.err("unable to serve {s}: {s}", .{ request.head.target, @errorName(err) });
return;
};
} }
} }