diff --git a/src/network/http.zig b/src/network/http.zig index 19295ee59..c7914acb0 100644 --- a/src/network/http.zig +++ b/src/network/http.zig @@ -668,6 +668,9 @@ pub const Handles = struct { errdefer libcurl.curl_multi_cleanup(multi) catch {}; try libcurl.curl_multi_setopt(multi, .max_host_connections, config.httpMaxHostOpen()); + // Default is 4x the attached easy handles, i.e. ~0 between page loads, + // so keepalive connections were evicted on every cross-site navigation. + try libcurl.curl_multi_setopt(multi, .max_connects, 128); return .{ .multi = multi }; } diff --git a/src/sys/libcurl.zig b/src/sys/libcurl.zig index 4ffe54409..dda5ec6e5 100644 --- a/src/sys/libcurl.zig +++ b/src/sys/libcurl.zig @@ -239,6 +239,7 @@ pub const CurlHttpVersion = enum(c_long) { pub const CurlMOption = enum(c.CURLMoption) { max_host_connections = c.CURLMOPT_MAX_HOST_CONNECTIONS, + max_connects = c.CURLMOPT_MAXCONNECTS, }; pub const CurlInfo = enum(c.CURLINFO) { @@ -742,7 +743,7 @@ pub fn curl_multi_cleanup(multi: *CurlM) ErrorMulti!void { pub fn curl_multi_setopt(multi: *CurlM, comptime option: CurlMOption, value: anytype) ErrorMulti!void { const opt: c.CURLMoption = @intFromEnum(option); const code = switch (option) { - .max_host_connections => blk: { + .max_host_connections, .max_connects => blk: { const n: c_long = switch (@typeInfo(@TypeOf(value))) { .comptime_int, .int => @intCast(value), else => @compileError("expected integer for " ++ @tagName(option) ++ ", got " ++ @typeName(@TypeOf(value))),