From 0de89a383debf769ad16420cc327bb4ef04fb2f0 Mon Sep 17 00:00:00 2001 From: Muki Kiboigo Date: Wed, 18 Mar 2026 11:38:39 -0700 Subject: [PATCH] add CachedResponse variant to Response --- src/browser/HttpClient.zig | 26 +++++++++++++++++++------- src/browser/ScriptManager.zig | 1 + 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/browser/HttpClient.zig b/src/browser/HttpClient.zig index 290d9d6b..39f01b2d 100644 --- a/src/browser/HttpClient.zig +++ b/src/browser/HttpClient.zig @@ -32,6 +32,8 @@ const CookieJar = @import("webapi/storage/Cookie.zig").Jar; const http = @import("../network/http.zig"); const Runtime = @import("../network/Runtime.zig"); const Robots = @import("../network/Robots.zig"); +const Cache = @import("../network/cache/Cache.zig"); +const CachedResponse = Cache.CachedResponse; const IS_DEBUG = builtin.mode == .Debug; @@ -1006,57 +1008,67 @@ pub const Response = struct { ctx: *anyopaque, inner: union(enum) { transfer: *Transfer, + cached: *const CachedResponse, }, pub fn fromTransfer(transfer: *Transfer) Response { return .{ .ctx = transfer.req.ctx, .inner = .{ .transfer = transfer } }; } + pub fn fromCached(ctx: *anyopaque, resp: *const CachedResponse) Response { + return .{ .ctx = ctx, .inner = .{ .cached = resp } }; + } + pub fn status(self: Response) ?u16 { return switch (self.inner) { .transfer => |t| if (t.response_header) |rh| rh.status else null, + .cached => |c| c.metadata.status, }; } pub fn contentType(self: Response) ?[]const u8 { return switch (self.inner) { .transfer => |t| if (t.response_header) |*rh| rh.contentType() else null, + .cached => |c| c.metadata.content_type, }; } pub fn contentLength(self: Response) ?u32 { return switch (self.inner) { .transfer => |t| t.getContentLength(), + .cached => |c| switch (c.data) { + .buffer => |buf| @intCast(buf.len), + .file => |f| @intCast(f.getEndPos() catch 0), + }, }; } pub fn redirectCount(self: Response) ?u32 { return switch (self.inner) { .transfer => |t| if (t.response_header) |rh| rh.redirect_count else null, + .cached => 0, }; } pub fn url(self: Response) [:0]const u8 { return switch (self.inner) { .transfer => |t| t.url, + .cached => |c| c.metadata.url, }; } pub fn headerIterator(self: Response) HeaderIterator { return switch (self.inner) { - .live => |live| live.responseHeaderIterator(), + .transfer => |t| t.responseHeaderIterator(), + // TODO: Cache HTTP Headers + .cached => unreachable, }; } pub fn abort(self: Response, err: anyerror) void { switch (self.inner) { .transfer => |t| t.abort(err), - } - } - - pub fn terminate(self: Response) void { - switch (self.inner) { - .transfer => |t| t.terminate(), + .cached => {}, } } }; diff --git a/src/browser/ScriptManager.zig b/src/browser/ScriptManager.zig index e2fc8563..653a4a7e 100644 --- a/src/browser/ScriptManager.zig +++ b/src/browser/ScriptManager.zig @@ -753,6 +753,7 @@ pub const Script = struct { self.debug_transfer_auth_challenge = transfer._auth_challenge != null; self.debug_transfer_easy_id = if (transfer._conn) |c| @intFromPtr(c._easy) else 0; }, + else => {}, } lp.assert(self.source.remote.capacity == 0, "ScriptManager.Header buffer", .{ .capacity = self.source.remote.capacity });