From dcd4483c277e6de60a94ed284f927e60511bf4cc Mon Sep 17 00:00:00 2001 From: Ibrahim Muftee Date: Sat, 22 Aug 2026 02:33:43 +0000 Subject: Begin basic HTTP server --- http.zig | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 http.zig (limited to 'http.zig') 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", .{}); +} -- cgit v1.2.3