Inspecting HTTP Response Headers in Zig

When working with HTTP requests in Zig, retrieving and printing response headers can be straightforward with the standard library. Here’s a concise example demonstrating how to perform a GET request and list the response headers from https://ziglang.org/.

pub fn print_headers(allocator: std.mem.Allocator) !void {
    const writer = std.io.getStdOut().writer();
    var bw = std.io.bufferedWriter(writer);

    const uri = try std.Uri.parse("https://ziglang.org/");
    var buf: [4096]u8 = undefined;

    var client = std.http.Client{
        .allocator = allocator,
    };
    defer client.deinit();

    const start = std.time.milliTimestamp();
    var req = try client.open(.GET, uri, .{ .server_header_buffer = &buf });

    defer req.deinit();
    try req.send();
    try req.finish();

    try req.wait();
    const stop = std.time.milliTimestamp();

    try writer.print("Status: {d}, Duration: {d}\n", .{ req.response.status, stop - start });
    var responseHeadersIterator = req.response.iterateHeaders();
    while (responseHeadersIterator.next()) |header| {
        try writer.print("{s}: {s}\n", .{ header.name, header.value });
    }
    try bw.flush();
}

Output

Status: http.Status.ok, Duration: 249       
Server: nginx/1.18.0
Date: Fri, 02 May 2025 20:04:34 GMT
Content-Type: text/html
Last-Modified: Fri, 02 May 2025 14:22:36 GMT
Transfer-Encoding: chunked
Connection: keep-alive
ETag: W/"6814d52c-37c8"
Content-Encoding: gzip

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *