可以在限定次数内重试临时性的服务端失败。让所有尝试共用一个 std.http.Client, 可以利用其连接池复用符合条件的 keep-alive 连接;每次收到响应后调用 request.deinit(),使客户端能够释放或复用连接。只有当请求安全且服务允许时,才应该重试失败。

//! Retry transient HTTP failures while reusing one HTTP client.

const std = @import("std");
const http = std.http;

pub fn main(init: std.process.Init) !void {
    const io = init.io;
    const gpa = init.gpa;
    const uri = try std.Uri.parse("https://httpbin.org/status/503");

    var client: http.Client = .{ .allocator = gpa, .io = io };
    defer client.deinit();

    var attempt: u8 = 0;
    while (attempt < 3) : (attempt += 1) {
        var request = try client.request(.GET, uri, .{});
        try request.sendBodiless();

        var response_buffer: [1024]u8 = undefined;
        const response = try request.receiveHead(&response_buffer);
        const status_code = @intFromEnum(response.head.status);
        std.debug.print("attempt {d}: HTTP {d}\n", .{ attempt + 1, status_code });
        request.deinit();

        if (status_code < 500) return;
    }

    std.debug.print("retry limit reached\n", .{});
}