| ... | ... | @@ -36,25 +36,33 @@ pub fn main() !void { |
| 36 | 36 | .zig_lib_directory = zig_lib_directory, |
| 37 | 37 | }; |
| 38 | 38 | |
| 39 | | var read_buffer: [8000]u8 = undefined; |
| 40 | | accept: while (true) { |
| 39 | while (true) { |
| 41 | 40 | const connection = try http_server.accept(); |
| 42 | | defer connection.stream.close(); |
| 43 | | |
| 44 | | var server = std.http.Server.init(connection, &read_buffer); |
| 45 | | while (server.state == .ready) { |
| 46 | | var request = server.receiveHead() catch |err| switch (err) { |
| 47 | | error.HttpConnectionClosing => continue :accept, |
| 48 | | else => { |
| 49 | | std.log.err("closing http connection: {s}", .{@errorName(err)}); |
| 50 | | continue :accept; |
| 51 | | }, |
| 52 | | }; |
| 53 | | serveRequest(&request, &context) catch |err| { |
| 54 | | std.log.err("unable to serve {s}: {s}", .{ request.head.target, @errorName(err) }); |
| 55 | | continue :accept; |
| 56 | | }; |
| 57 | | } |
| 41 | _ = std.Thread.spawn(.{}, accept, .{ &context, connection }) catch |err| { |
| 42 | std.log.err("unable to accept connection: {s}", .{@errorName(err)}); |
| 43 | connection.stream.close(); |
| 44 | continue; |
| 45 | }; |
| 46 | } |
| 47 | } |
| 48 | |
| 49 | fn accept(context: *Context, connection: std.net.Server.Connection) void { |
| 50 | defer connection.stream.close(); |
| 51 | |
| 52 | var read_buffer: [8000]u8 = undefined; |
| 53 | var server = std.http.Server.init(connection, &read_buffer); |
| 54 | while (server.state == .ready) { |
| 55 | var request = server.receiveHead() catch |err| switch (err) { |
| 56 | error.HttpConnectionClosing => return, |
| 57 | else => { |
| 58 | std.log.err("closing http connection: {s}", .{@errorName(err)}); |
| 59 | return; |
| 60 | }, |
| 61 | }; |
| 62 | serveRequest(&request, context) catch |err| { |
| 63 | std.log.err("unable to serve {s}: {s}", .{ request.head.target, @errorName(err) }); |
| 64 | return; |
| 65 | }; |
| 58 | 66 | } |
| 59 | 67 | } |
| 60 | 68 | |