zig run server.zig
curl -v http//localhost:3000
| // src/main.zig | |
| const std = @import("std"); | |
| pub fn main() !void { | |
| const addr = try std.net.Address.parseIp4("127.0.0.1", 3000); | |
| var server = try addr.listen(.{}); | |
| defer server.deinit(); | |
| std.debug.print("listening on http://127.0.0.1:3000\n", .{}); | |
| while (true) { | |
| const conn = try server.accept(); | |
| handleConn(conn) catch |err| { | |
| // 例なので雑にログだけ出して次へ | |
| std.debug.print("connection error: {s}\n", .{@errorName(err)}); | |
| }; | |
| } | |
| } | |
| fn handleConn(conn: std.net.Server.Connection) !void { | |
| defer conn.stream.close(); | |
| // Zig 0.15 の新I/Oインターフェイス用に、reader/writer それぞれバッファを渡す | |
| var reader_buf: [8 * 1024]u8 = undefined; | |
| var writer_buf: [8 * 1024]u8 = undefined; | |
| var reader = conn.stream.reader(&reader_buf).file_reader; | |
| var writer = conn.stream.writer(&writer_buf).file_writer; | |
| var http_server = std.http.Server.init(&reader.interface, &writer.interface); | |
| // 1リクエストだけ処理する最小例 | |
| var req = try http_server.receiveHead(); | |
| // 確認用ログ(パスなど見たい場合) | |
| std.debug.print("{s} {s}\n", .{ @tagName(req.head.method), req.head.target }); | |
| try req.respond("hello!\n", .{}); | |
| } |