add support for WebBotAuth in Client

This commit is contained in:
Muki Kiboigo
2026-02-19 12:30:03 -08:00
parent 6cd8202310
commit 02198de455
4 changed files with 22 additions and 4 deletions

View File

@@ -23,7 +23,7 @@ const Allocator = std.mem.Allocator;
const log = @import("log.zig"); const log = @import("log.zig");
const dump = @import("browser/dump.zig"); const dump = @import("browser/dump.zig");
const WebBotAuth = @import("browser/WebBotAuth.zig"); const WebBotAuthConfig = @import("network/WebBotAuth.zig").Config;
pub const RunMode = enum { pub const RunMode = enum {
help, help,
@@ -163,9 +163,9 @@ pub fn cdpTimeout(self: *const Config) usize {
}; };
} }
pub fn webBotAuth(self: *const Config) ?WebBotAuth { pub fn webBotAuth(self: *const Config) ?WebBotAuthConfig {
return switch (self.mode) { return switch (self.mode) {
inline .serve, .fetch, .mcp => |opts| WebBotAuth{ inline .serve, .fetch, .mcp => |opts| WebBotAuthConfig{
.key_file = opts.common.web_bot_auth_key_file orelse return null, .key_file = opts.common.web_bot_auth_key_file orelse return null,
.keyid = opts.common.web_bot_auth_keyid orelse return null, .keyid = opts.common.web_bot_auth_keyid orelse return null,
.domain = opts.common.web_bot_auth_domain orelse return null, .domain = opts.common.web_bot_auth_domain orelse return null,

View File

@@ -30,6 +30,7 @@ const Notification = @import("../Notification.zig");
const CookieJar = @import("../browser/webapi/storage/Cookie.zig").Jar; const CookieJar = @import("../browser/webapi/storage/Cookie.zig").Jar;
const Robots = @import("../network/Robots.zig"); const Robots = @import("../network/Robots.zig");
const RobotStore = Robots.RobotStore; const RobotStore = Robots.RobotStore;
const WebBotAuth = @import("../network/WebBotAuth.zig");
const Allocator = std.mem.Allocator; const Allocator = std.mem.Allocator;
const ArenaAllocator = std.heap.ArenaAllocator; const ArenaAllocator = std.heap.ArenaAllocator;
@@ -702,6 +703,12 @@ fn makeRequest(self: *Client, conn: *Net.Connection, transfer: *Transfer) anyerr
try conn.secretHeaders(&header_list, &self.network.config.http_headers); // Add headers that must be hidden from intercepts try conn.secretHeaders(&header_list, &self.network.config.http_headers); // Add headers that must be hidden from intercepts
try conn.setHeaders(&header_list); try conn.setHeaders(&header_list);
// If we have WebBotAuth, sign our request.
if (self.network.web_bot_auth) |*wba| {
const authority = URL.getHost(req.url);
try wba.signRequest(self.allocator, &header_list, authority);
}
// Add cookies. // Add cookies.
if (header_list.cookies) |cookies| { if (header_list.cookies) |cookies| {
try conn.setCookies(cookies); try conn.setCookies(cookies);

View File

@@ -28,6 +28,7 @@ const libcurl = @import("../sys/libcurl.zig");
const net_http = @import("http.zig"); const net_http = @import("http.zig");
const RobotStore = @import("Robots.zig").RobotStore; const RobotStore = @import("Robots.zig").RobotStore;
const WebBotAuth = @import("WebBotAuth.zig");
const Runtime = @This(); const Runtime = @This();
@@ -42,6 +43,7 @@ allocator: Allocator,
config: *const Config, config: *const Config,
ca_blob: ?net_http.Blob, ca_blob: ?net_http.Blob,
robot_store: RobotStore, robot_store: RobotStore,
web_bot_auth: ?WebBotAuth,
connections: []net_http.Connection, connections: []net_http.Connection,
available: std.DoublyLinkedList = .{}, available: std.DoublyLinkedList = .{},
@@ -205,6 +207,11 @@ pub fn init(allocator: Allocator, config: *const Config) !Runtime {
available.append(&connections[i].node); available.append(&connections[i].node);
} }
const web_bot_auth = if (config.webBotAuth()) |wba_cfg|
try WebBotAuth.fromConfig(allocator, &wba_cfg)
else
null;
return .{ return .{
.allocator = allocator, .allocator = allocator,
.config = config, .config = config,
@@ -212,6 +219,7 @@ pub fn init(allocator: Allocator, config: *const Config) !Runtime {
.robot_store = RobotStore.init(allocator), .robot_store = RobotStore.init(allocator),
.connections = connections, .connections = connections,
.available = available, .available = available,
.web_bot_auth = web_bot_auth,
.pollfds = pollfds, .pollfds = pollfds,
.wakeup_pipe = pipe, .wakeup_pipe = pipe,
}; };
@@ -238,6 +246,9 @@ pub fn deinit(self: *Runtime) void {
self.allocator.free(self.connections); self.allocator.free(self.connections);
self.robot_store.deinit(); self.robot_store.deinit();
if (self.web_bot_auth) |wba| {
wba.deinit(self.allocator);
}
globalDeinit(); globalDeinit();
} }

View File

@@ -19,7 +19,7 @@
const std = @import("std"); const std = @import("std");
const crypto = @import("../crypto.zig"); const crypto = @import("../crypto.zig");
const Http = @import("../http/Http.zig"); const Http = @import("../network/http.zig");
const WebBotAuth = @This(); const WebBotAuth = @This();