aboutsummaryrefslogtreecommitdiffstats
path: root/src/fetch.zig
diff options
context:
space:
mode:
authorSimen A. W. Olsen <hello@simenandre.no>2026-05-28 23:27:10 +0200
committerSimen A. W. Olsen <hello@simenandre.no>2026-05-28 23:27:10 +0200
commit1eaf6a9d883a47444d0d68f4ab88bfba62c321d0 (patch)
treea4ff9ee96580c8173620b1419537308367ebd399 /src/fetch.zig
downloadziglang-docs-epub-1eaf6a9d883a47444d0d68f4ab88bfba62c321d0.tar.gz
ziglang-docs-epub-1eaf6a9d883a47444d0d68f4ab88bfba62c321d0.zip
feat: add ziglang-docs-epub tool
Diffstat (limited to 'src/fetch.zig')
-rw-r--r--src/fetch.zig30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/fetch.zig b/src/fetch.zig
new file mode 100644
index 0000000..706a435
--- /dev/null
+++ b/src/fetch.zig
@@ -0,0 +1,30 @@
+//! Thin HTTP GET helper over std.http.Client.
+
+const std = @import("std");
+const assert = std.debug.assert;
+
+/// Largest response body we accept (the docs page is ~1 MB; allow generous slack).
+pub const max_body = 32 * 1024 * 1024;
+
+pub const Error = error{ HttpStatus, BodyTooLarge } || std.mem.Allocator.Error;
+
+/// GET `url` and return the response body. Caller owns the returned slice.
+/// Returns an error on any non-200 status so callers can skip that version.
+pub fn get(allocator: std.mem.Allocator, client: *std.http.Client, url: []const u8) ![]u8 {
+ assert(url.len > 0);
+
+ var body: std.Io.Writer.Allocating = .init(allocator);
+ defer body.deinit();
+
+ const result = try client.fetch(.{
+ .location = .{ .url = url },
+ .response_writer = &body.writer,
+ });
+
+ if (result.status != .ok) return Error.HttpStatus;
+ if (body.writer.end > max_body) return Error.BodyTooLarge;
+
+ const out = try body.toOwnedSlice();
+ assert(out.len > 0);
+ return out;
+}