diff --git a/src/cdp/CDP.zig b/src/cdp/CDP.zig index ef83d479..799d3ea9 100644 --- a/src/cdp/CDP.zig +++ b/src/cdp/CDP.zig @@ -395,7 +395,7 @@ pub const BrowserContext = struct { const session = try cdp.browser.newSession(notification); if (cdp.client.app.config.cookieFile()) |cookie_path| { - lp.cookies.loadFromFile(&session.cookie_jar, cookie_path) catch |err| { + lp.cookies.loadFromFile(session, cookie_path) catch |err| { log.err(.app, "cookie load error", .{ .err = err }); }; } diff --git a/src/cookies.zig b/src/cookies.zig index d0f0c12e..8d5df888 100644 --- a/src/cookies.zig +++ b/src/cookies.zig @@ -16,6 +16,7 @@ const std = @import("std"); const Allocator = std.mem.Allocator; +const Session = @import("browser/Session.zig"); const Cookie = @import("browser/webapi/storage/Cookie.zig"); const log = @import("log.zig"); @@ -23,7 +24,7 @@ const log = @import("log.zig"); /// The file format is an array of objects with: name, value, domain, path, /// expires (optional, float), secure (optional, bool), httpOnly (optional, bool). /// This matches the CDP Network.Cookie format used by Puppeteer and Playwright. -pub fn loadFromFile(jar: *Cookie.Jar, path: []const u8) !void { +pub fn loadFromFile(session: *Session, path: []const u8) !void { const file = std.fs.cwd().openFile(path, .{}) catch |err| switch (err) { error.FileNotFound => return, // No file yet, nothing to load else => { @@ -33,13 +34,15 @@ pub fn loadFromFile(jar: *Cookie.Jar, path: []const u8) !void { }; defer file.close(); - const content = file.readToEndAlloc(jar.allocator, 1024 * 1024) catch |err| { + const call_arena = try session.getArena(.medium, "cookies.jar.allocatorloadFromFile"); + defer session.releaseArena(call_arena); + + const content = file.readToEndAlloc(call_arena, 1024 * 1024) catch |err| { log.err(.app, "failed to read cookies file", .{ .path = path, .err = err }); return err; }; - defer jar.allocator.free(content); - const parsed = std.json.parseFromSlice([]const JsonCookie, jar.allocator, content, .{ + const parsed = std.json.parseFromSlice([]const JsonCookie, call_arena, content, .{ .ignore_unknown_fields = true, }) catch |err| { log.err(.app, "failed to parse cookies JSON", .{ .path = path, .err = err }); @@ -47,6 +50,7 @@ pub fn loadFromFile(jar: *Cookie.Jar, path: []const u8) !void { }; defer parsed.deinit(); + const jar = &session.cookie_jar; var loaded: usize = 0; for (parsed.value) |jc| { var arena = std.heap.ArenaAllocator.init(jar.allocator); diff --git a/src/lightpanda.zig b/src/lightpanda.zig index 444d0537..84775a7c 100644 --- a/src/lightpanda.zig +++ b/src/lightpanda.zig @@ -69,7 +69,7 @@ pub fn fetch(app: *App, url: [:0]const u8, opts: FetchOpts) !void { var session = try browser.newSession(notification); if (app.config.cookieFile()) |cookie_path| { - cookies.loadFromFile(&session.cookie_jar, cookie_path) catch |err| { + cookies.loadFromFile(session, cookie_path) catch |err| { log.err(.app, "cookie load error", .{ .err = err }); }; } diff --git a/src/mcp/Server.zig b/src/mcp/Server.zig index cf34158c..5dbb8a0f 100644 --- a/src/mcp/Server.zig +++ b/src/mcp/Server.zig @@ -52,7 +52,7 @@ pub fn init(allocator: std.mem.Allocator, app: *App, writer: *std.io.Writer) !*S self.session = try self.browser.newSession(self.notification); if (app.config.cookieFile()) |cookie_path| { - lp.cookies.loadFromFile(&self.session.cookie_jar, cookie_path) catch |err| { + lp.cookies.loadFromFile(self.session, cookie_path) catch |err| { lp.log.err(.mcp, "cookie load error", .{ .err = err }); }; }