From 7d0e4b6270a5317157673eb2ed2f3c03b0e83f66 Mon Sep 17 00:00:00 2001 From: Pierre Tachoire Date: Wed, 13 Aug 2025 17:51:05 +0200 Subject: [PATCH] use CURLOPT_COOKIE to set cookies --- src/http/Client.zig | 11 +++++++++-- src/http/Http.zig | 18 +++++++++++++++++- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/http/Client.zig b/src/http/Client.zig index 27298126..d228cbec 100644 --- a/src/http/Client.zig +++ b/src/http/Client.zig @@ -319,6 +319,14 @@ fn makeRequest(self: *Client, handle: *Handle, transfer: *Transfer) !void { var header_list = req.headers; try conn.secretHeaders(&header_list); // Add headers that must be hidden from intercepts try errorCheck(c.curl_easy_setopt(easy, c.CURLOPT_HTTPHEADER, header_list.headers)); + + // Add cookies. + // Clear cookies from Curl's engine. + try errorCheck(c.curl_easy_setopt(easy, c.CURLOPT_COOKIELIST, "ALL")); + if (header_list.cookies) |cookies| { + try errorCheck(c.curl_easy_setopt(easy, c.CURLOPT_COOKIE, cookies)); + } + try errorCheck(c.curl_easy_setopt(easy, c.CURLOPT_PRIVATE, transfer)); } @@ -506,12 +514,11 @@ pub const RequestCookie = struct { .is_http = self.is_http, .is_navigation = self.is_navigation, .origin_uri = self.origin, - .prefix = "Cookie: ", }); if (arr.items.len > 0) { try arr.append(temp, 0); //null terminate - try headers.add(@ptrCast(arr.items.ptr)); + headers.cookies = @ptrCast(arr.items.ptr); } } }; diff --git a/src/http/Http.zig b/src/http/Http.zig index f1453263..1d8cde58 100644 --- a/src/http/Http.zig +++ b/src/http/Http.zig @@ -204,6 +204,13 @@ pub const Connection = struct { try self.secretHeaders(&header_list); try errorCheck(c.curl_easy_setopt(easy, c.CURLOPT_HTTPHEADER, header_list.headers)); + // Add cookies. + // Clear cookies from Curl's engine. + try errorCheck(c.curl_easy_setopt(easy, c.CURLOPT_COOKIELIST, "ALL")); + if (header_list.cookies) |cookies| { + try errorCheck(c.curl_easy_setopt(easy, c.CURLOPT_COOKIE, cookies)); + } + try errorCheck(c.curl_easy_perform(easy)); var http_code: c_long = undefined; try errorCheck(c.curl_easy_getinfo(easy, c.CURLINFO_RESPONSE_CODE, &http_code)); @@ -216,11 +223,12 @@ pub const Connection = struct { pub const Headers = struct { headers: *c.curl_slist, + cookies: ?[*c]const u8, pub fn init() !Headers { const header_list = c.curl_slist_append(null, "User-Agent: Lightpanda/1.0"); if (header_list == null) return error.OutOfMemory; - return .{ .headers = header_list }; + return .{ .headers = header_list, .cookies = null }; } pub fn deinit(self: *const Headers) void { @@ -245,6 +253,10 @@ pub const Headers = struct { list.putAssumeCapacity(header.name, header.value); current = node.*.next; } + // special case for cookies + if (self.cookies) |v| { + list.putAssumeCapacity("Cookie", std.mem.span(@as([*:0]const u8, @ptrCast(v)))); + } return list; } @@ -264,6 +276,10 @@ pub const Headers = struct { num += 1; current = node.*.next; } + // special case for cookies + if (self.cookies != null) { + num += 1; + } return num; } };