summaryrefslogtreecommitdiff
path: root/http.zig
diff options
context:
space:
mode:
authorIbrahim Muftee <ibrahim@muftee.net>2026-08-22 02:33:43 +0000
committerIbrahim Muftee <ibrahim@muftee.net>2026-08-22 02:33:43 +0000
commitdcd4483c277e6de60a94ed284f927e60511bf4cc (patch)
treeebdb499ca3b6dd4fb1ba8b8f10d63af6a1a20bab /http.zig
Begin basic HTTP server
Diffstat (limited to 'http.zig')
-rw-r--r--http.zig54
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", .{});
+}