diff options
| author | Ibrahim Muftee <ibrahim@muftee.net> | 2026-08-22 02:33:43 +0000 |
|---|---|---|
| committer | Ibrahim Muftee <ibrahim@muftee.net> | 2026-08-22 02:33:43 +0000 |
| commit | dcd4483c277e6de60a94ed284f927e60511bf4cc (patch) | |
| tree | ebdb499ca3b6dd4fb1ba8b8f10d63af6a1a20bab /http.zig | |
Begin basic HTTP server
Diffstat (limited to 'http.zig')
| -rw-r--r-- | http.zig | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/http.zig b/http.zig new file mode 100644 index 0000000..74a1341 --- /dev/null +++ b/http.zig @@ -0,0 +1,54 @@ +const std = @import("std"); +const log = std.log; +const net = std.Io.net; +const Io = std.Io; +const Request = std.http.Server.Request; + +const MAX_BUF = 1024; + +pub fn main(init: std.process.Init) !void { + const io = init.io; + + const addr = try net.IpAddress.parse("127.0.0.1", 8080); + var server = try addr.listen(io, .{ .reuse_address = true }); + defer server.deinit(io); + + log.info("Start HTTP server at {f}", .{addr}); + + while (true) { + const stream = server.accept(io) catch |err| { + log.err("failed to accept connection: {s}", .{@errorName(err)}); + continue; + }; + const thread = std.Thread.spawn(.{}, accept, .{ stream, io }) catch |err| { + log.err("unable to spawn connection thread: {s}", .{@errorName(err)}); + stream.close(io); + continue; + }; + thread.detach(); + } +} + +fn accept(stream: net.Stream, io: Io) !void { + defer stream.close(io); + + log.info("Got new client!", .{}); + + var recv_buffer: [1024]u8 = undefined; + var send_buffer: [100]u8 = undefined; + var stream_reader = stream.reader(io, &recv_buffer); + var stream_writer = stream.writer(io, &send_buffer); + var server = std.http.Server.init(&stream_reader.interface, &stream_writer.interface); + while (server.reader.state == .ready) { + var request = server.receiveHead() catch |err| switch (err) { + error.HttpConnectionClosing => return, + else => return err, + }; + try serveHTTP(&request); + } +} + +fn serveHTTP(request: *Request) !void { + log.info("Received request: {s}", .{request.head.target}); + try request.respond("Welcome to Coinvane!\n", .{}); +} |
