diff --git a/src/Config.zig b/src/Config.zig index 680a99a8..21fdeed4 100644 --- a/src/Config.zig +++ b/src/Config.zig @@ -23,7 +23,7 @@ const Allocator = std.mem.Allocator; const log = @import("log.zig"); const dump = @import("browser/dump.zig"); -const WebBotAuth = @import("browser/WebBotAuth.zig"); +const WebBotAuthConfig = @import("network/WebBotAuth.zig").Config; pub const RunMode = enum { 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) { - inline .serve, .fetch, .mcp => |opts| WebBotAuth{ + inline .serve, .fetch, .mcp => |opts| WebBotAuthConfig{ .key_file = opts.common.web_bot_auth_key_file orelse return null, .keyid = opts.common.web_bot_auth_keyid orelse return null, .domain = opts.common.web_bot_auth_domain orelse return null, diff --git a/src/browser/HttpClient.zig b/src/browser/HttpClient.zig index 41b5ea39..05d5ddde 100644 --- a/src/browser/HttpClient.zig +++ b/src/browser/HttpClient.zig @@ -30,6 +30,7 @@ const Notification = @import("../Notification.zig"); const CookieJar = @import("../browser/webapi/storage/Cookie.zig").Jar; const Robots = @import("../network/Robots.zig"); const RobotStore = Robots.RobotStore; +const WebBotAuth = @import("../network/WebBotAuth.zig"); const Allocator = std.mem.Allocator; 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.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. if (header_list.cookies) |cookies| { try conn.setCookies(cookies); diff --git a/src/network/Runtime.zig b/src/network/Runtime.zig index b3cd6a06..d6a08f59 100644 --- a/src/network/Runtime.zig +++ b/src/network/Runtime.zig @@ -28,6 +28,7 @@ const libcurl = @import("../sys/libcurl.zig"); const net_http = @import("http.zig"); const RobotStore = @import("Robots.zig").RobotStore; +const WebBotAuth = @import("WebBotAuth.zig"); const Runtime = @This(); @@ -42,6 +43,7 @@ allocator: Allocator, config: *const Config, ca_blob: ?net_http.Blob, robot_store: RobotStore, +web_bot_auth: ?WebBotAuth, connections: []net_http.Connection, available: std.DoublyLinkedList = .{}, @@ -205,6 +207,11 @@ pub fn init(allocator: Allocator, config: *const Config) !Runtime { available.append(&connections[i].node); } + const web_bot_auth = if (config.webBotAuth()) |wba_cfg| + try WebBotAuth.fromConfig(allocator, &wba_cfg) + else + null; + return .{ .allocator = allocator, .config = config, @@ -212,6 +219,7 @@ pub fn init(allocator: Allocator, config: *const Config) !Runtime { .robot_store = RobotStore.init(allocator), .connections = connections, .available = available, + .web_bot_auth = web_bot_auth, .pollfds = pollfds, .wakeup_pipe = pipe, }; @@ -238,6 +246,9 @@ pub fn deinit(self: *Runtime) void { self.allocator.free(self.connections); self.robot_store.deinit(); + if (self.web_bot_auth) |wba| { + wba.deinit(self.allocator); + } globalDeinit(); } diff --git a/src/network/WebBotAuth.zig b/src/network/WebBotAuth.zig index 842f02d2..0abdad82 100644 --- a/src/network/WebBotAuth.zig +++ b/src/network/WebBotAuth.zig @@ -19,7 +19,7 @@ const std = @import("std"); const crypto = @import("../crypto.zig"); -const Http = @import("../http/Http.zig"); +const Http = @import("../network/http.zig"); const WebBotAuth = @This();