Skip to content

Instantly share code, notes, and snippets.

@Zorgatone
Created August 26, 2025 15:02
Show Gist options
  • Save Zorgatone/968ce86711aecea984a2c4a9771eed5f to your computer and use it in GitHub Desktop.
Save Zorgatone/968ce86711aecea984a2c4a9771eed5f to your computer and use it in GitHub Desktop.
Zig 0.15.1 http-client GET example
const builtin = @import("builtin");
const std = @import("std");
pub fn parseContentLength(buf: []const u8) !usize {
const prefix = "Content-Length:";
var it = std.mem.tokenizeAny(u8, buf, "\r\n");
while (it.next()) |line| {
if (std.ascii.startsWithIgnoreCase(line, prefix)) {
// Skip the header name
const value = std.mem.trim(u8, line[prefix.len..], " \t");
return try std.fmt.parseInt(usize, value, 10);
}
}
return error.NoContentLen; // Not found
}
pub fn main() !void {
var writer_buffer: [4096]u8 = undefined;
var transfer_buffer: [4096]u8 = undefined;
var reader_buffer: [4096]u8 = undefined;
var writer = std.fs.File.stdout().writer(&writer_buffer);
var debug_allocator: std.heap.DebugAllocator(.{}) = .init;
defer switch (builtin.mode) {
.Debug => std.debug.assert(debug_allocator.deinit() == .ok),
.ReleaseFast, .ReleaseSmall, .ReleaseSafe => {
// Nothing
},
};
const allocator = switch (builtin.mode) {
.Debug => debug_allocator.allocator(),
.ReleaseFast, .ReleaseSmall, .ReleaseSafe => std.heap.smp_allocator,
};
const uri = try std.Uri.parse("https://postman-echo.com/get");
var client: std.http.Client = .{ .allocator = allocator };
defer client.deinit();
var request = try client.request(.GET, uri, .{});
defer request.deinit();
try request.sendBodiless();
const head = try request.reader.receiveHead();
_ = try writer.interface.write(head);
const content_len = try parseContentLength(head);
const reader = request.reader.bodyReader(&transfer_buffer, .none, content_len);
var bytes_read: usize = 0;
while (bytes_read < content_len) {
const size = try reader.readSliceShort(&reader_buffer);
if (size > 0) {
bytes_read += size;
_ = try writer.interface.write(reader_buffer[0..size]);
}
}
try writer.interface.flush();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment