Created
August 26, 2025 15:02
-
-
Save Zorgatone/968ce86711aecea984a2c4a9771eed5f to your computer and use it in GitHub Desktop.
Zig 0.15.1 http-client GET example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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