Something went wrong. Try again.
A Zig library for Bluesky activity and feed analytics, built on Zat.
Something went wrong. Try again.
12345678910111213141516171819202122232425262728293031323334353637383940414243const std = @import("std");
pub const Origin = struct { io: std.Io, listener: std.Io.net.Server, responses: []const []const u8, requests: usize = 0,
pub fn init(io: std.Io, responses: []const []const u8) !Origin { return .{ .io = io, .listener = try (std.Io.net.IpAddress{ .ip4 = .loopback(0) }).listen(io, .{ .reuse_address = true }), .responses = responses }; }
pub fn deinit(self: *Origin) void { self.listener.deinit(self.io); }
pub fn url(self: *Origin, allocator: std.mem.Allocator) ![]const u8 { return std.fmt.allocPrint(allocator, "http://127.0.0.1:{d}", .{self.listener.socket.address.getPort()}); }
pub fn serve(self: *Origin) !void { for (self.responses) |payload| { var connection = try self.listener.accept(self.io); defer connection.close(self.io); var read_buffer: [4096]u8 = undefined; var reader = connection.reader(self.io, &read_buffer); while (true) { const line = try reader.interface.takeDelimiterInclusive('\n'); if (std.mem.eql(u8, line, "\r\n")) break; } self.requests += 1; var write_buffer: [4096]u8 = undefined; var writer = connection.writer(self.io, &write_buffer); try writer.interface.writeAll(payload); try writer.interface.flush(); } }};
pub fn response(allocator: std.mem.Allocator, body: []const u8) ![]const u8 { return std.fmt.allocPrint(allocator, "HTTP/1.1 200 OK\r\nContent-Length: {d}\r\nConnection: close\r\n\r\n{s}", .{ body.len, body });}