use session arg to load cookies from file

This commit is contained in:
Pierre Tachoire
2026-04-15 10:08:39 -04:00
parent cc4bd417d2
commit a24fcc6a5c
4 changed files with 11 additions and 7 deletions

View File

@@ -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 });
};
}

View File

@@ -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);

View File

@@ -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 });
};
}

View File

@@ -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 });
};
}