diff --git a/src/browser/HttpClient.zig b/src/browser/HttpClient.zig index 393b7de1..3fb5ac5a 100644 --- a/src/browser/HttpClient.zig +++ b/src/browser/HttpClient.zig @@ -1261,7 +1261,9 @@ pub const Transfer = struct { fn detectAuthChallenge(transfer: *Transfer, conn: *const http.Connection) void { const status = conn.getResponseCode() catch return; - if (status != 401 and status != 407) { + const connect_status = conn.getConnectCode() catch return; + + if (status != 401 and status != 407 and connect_status != 401 and connect_status != 407) { transfer._auth_challenge = null; return; } diff --git a/src/network/http.zig b/src/network/http.zig index 2c8e7d5a..dac76749 100644 --- a/src/network/http.zig +++ b/src/network/http.zig @@ -389,6 +389,15 @@ pub const Connection = struct { return url; } + pub fn getConnectCode(self: *const Connection) !u16 { + var status: c_long = undefined; + try libcurl.curl_easy_getinfo(self._easy, .connect_code, &status); + if (status < 0 or status > std.math.maxInt(u16)) { + return 0; + } + return @intCast(status); + } + pub fn getResponseCode(self: *const Connection) !u16 { var status: c_long = undefined; try libcurl.curl_easy_getinfo(self._easy, .response_code, &status); diff --git a/src/sys/libcurl.zig b/src/sys/libcurl.zig index b37e5142..0e2defe3 100644 --- a/src/sys/libcurl.zig +++ b/src/sys/libcurl.zig @@ -178,6 +178,7 @@ pub const CurlInfo = enum(c.CURLINFO) { private = c.CURLINFO_PRIVATE, redirect_count = c.CURLINFO_REDIRECT_COUNT, response_code = c.CURLINFO_RESPONSE_CODE, + connect_code = c.CURLINFO_HTTP_CONNECTCODE, }; pub const Error = error{ @@ -662,6 +663,7 @@ pub fn curl_easy_getinfo(easy: *Curl, comptime info: CurlInfo, out: anytype) Err break :blk c.curl_easy_getinfo(easy, inf, p); }, .response_code, + .connect_code, .redirect_count, => blk: { const p: *c_long = out;