mirror of
https://github.com/lightpanda-io/browser.git
synced 2026-04-02 02:16:44 +00:00
Compare commits
6 Commits
http-clien
...
http-cache
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6688f69ba1 | ||
|
|
648af43f8a | ||
|
|
ebb8c3f11c | ||
|
|
9214fba85e | ||
|
|
d707a61646 | ||
|
|
600f2909fc |
@@ -394,6 +394,11 @@ pub fn printUsageAndExit(self: *const Config, success: bool) void {
|
||||
\\
|
||||
\\--web-bot-auth-domain
|
||||
\\ Your domain e.g. yourdomain.com
|
||||
\\
|
||||
\\--cache-dir
|
||||
\\ Path to a directory to use as a Filesystem Cache for network resources.
|
||||
\\ Omitting this will result is no caching.
|
||||
\\ Defaults to no caching.
|
||||
;
|
||||
|
||||
// MAX_HELP_LEN|
|
||||
@@ -1055,9 +1060,9 @@ fn parseCommonArg(
|
||||
return true;
|
||||
}
|
||||
|
||||
if (std.mem.eql(u8, "--cache_dir", opt)) {
|
||||
if (std.mem.eql(u8, "--cache-dir", opt)) {
|
||||
const str = args.next() orelse {
|
||||
log.fatal(.app, "missing argument value", .{ .arg = "--cache_dir" });
|
||||
log.fatal(.app, "missing argument value", .{ .arg = "--cache-dir" });
|
||||
return error.InvalidArgument;
|
||||
};
|
||||
common.cache_dir = try allocator.dupe(u8, str);
|
||||
|
||||
@@ -970,25 +970,22 @@ fn processOneMessage(self: *Client, msg: http.Handles.MultiMessage, transfer: *T
|
||||
}
|
||||
}
|
||||
|
||||
// release conn ASAP so that it's available; some done_callbacks
|
||||
// will load more resources.
|
||||
transfer.releaseConn();
|
||||
|
||||
try transfer.req.done_callback(transfer.req.ctx);
|
||||
|
||||
if (transfer._pending_cache_metadata) |metadata| {
|
||||
const cache = &self.network.cache.?;
|
||||
log.debug(.browser, "http cache", .{ .url = transfer.req.url, .metadata = metadata });
|
||||
|
||||
// TODO: Support Vary Keying
|
||||
const cache_key = transfer.req.url;
|
||||
|
||||
log.debug(.browser, "http cache", .{ .key = cache_key, .metadata = metadata });
|
||||
cache.put(metadata, body) catch |err| {
|
||||
log.warn(.http, "cache put failed", .{ .err = err });
|
||||
};
|
||||
log.debug(.browser, "http.cache.put", .{ .url = transfer.req.url });
|
||||
}
|
||||
|
||||
// release conn ASAP so that it's available; some done_callbacks
|
||||
// will load more resources.
|
||||
transfer.releaseConn();
|
||||
|
||||
try transfer.req.done_callback(transfer.req.ctx);
|
||||
|
||||
transfer.req.notification.dispatch(.http_request_done, &.{
|
||||
.transfer = transfer,
|
||||
});
|
||||
@@ -1572,12 +1569,9 @@ pub const Transfer = struct {
|
||||
);
|
||||
|
||||
if (maybe_cm) |cm| {
|
||||
transfer._pending_cache_metadata = cm;
|
||||
|
||||
var iter = transfer.responseHeaderIterator();
|
||||
var header_list = try iter.collect(allocator);
|
||||
const end_of_response = header_list.items.len;
|
||||
transfer._pending_cache_metadata.?.headers = header_list.items[0..end_of_response];
|
||||
|
||||
if (vary) |vary_str| {
|
||||
var req_it = transfer.req.headers.iterator();
|
||||
@@ -1595,9 +1589,11 @@ pub const Transfer = struct {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
transfer._pending_cache_metadata.?.vary_headers = header_list.items[end_of_response..];
|
||||
}
|
||||
|
||||
transfer._pending_cache_metadata = cm;
|
||||
transfer._pending_cache_metadata.?.headers = header_list.items[0..end_of_response];
|
||||
transfer._pending_cache_metadata.?.vary_headers = header_list.items[end_of_response..];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -273,6 +273,10 @@ pub fn addFromElement(self: *ScriptManager, comptime from_parser: bool, script_e
|
||||
// Let the outer errdefer handle releasing the arena if client.request fails
|
||||
}
|
||||
|
||||
// If we return synchronously (like from cache), we would call evaluate() immediately.
|
||||
const was_evaluating = self.is_evaluating;
|
||||
self.is_evaluating = true;
|
||||
|
||||
try self.client.request(.{
|
||||
.url = url,
|
||||
.ctx = script,
|
||||
@@ -290,6 +294,9 @@ pub fn addFromElement(self: *ScriptManager, comptime from_parser: bool, script_e
|
||||
.done_callback = Script.doneCallback,
|
||||
.error_callback = Script.errorCallback,
|
||||
});
|
||||
|
||||
self.is_evaluating = was_evaluating;
|
||||
|
||||
handover = true;
|
||||
|
||||
if (comptime IS_DEBUG) {
|
||||
|
||||
22
src/network/cache/Cache.zig
vendored
22
src/network/cache/Cache.zig
vendored
@@ -103,6 +103,26 @@ pub const CachedMetadata = struct {
|
||||
|
||||
/// These are Request Headers used by Vary.
|
||||
vary_headers: []const Http.Header,
|
||||
|
||||
pub fn format(self: CachedMetadata, writer: *std.Io.Writer) !void {
|
||||
try writer.print("url={s} | status={d} | content_type={s} | max_age={d} | vary=[", .{
|
||||
self.url,
|
||||
self.status,
|
||||
self.content_type,
|
||||
self.cache_control.max_age,
|
||||
});
|
||||
|
||||
// Logging all headers gets pretty verbose...
|
||||
// so we just log the Vary ones that matter for caching.
|
||||
|
||||
if (self.vary_headers.len > 0) {
|
||||
for (self.vary_headers, 0..) |hdr, i| {
|
||||
if (i > 0) try writer.print(", ", .{});
|
||||
try writer.print("{s}: {s}", .{ hdr.name, hdr.value });
|
||||
}
|
||||
}
|
||||
try writer.print("]", .{});
|
||||
}
|
||||
};
|
||||
|
||||
pub const CacheRequest = struct {
|
||||
@@ -144,7 +164,7 @@ pub fn tryCache(
|
||||
const cc = CacheControl.parse(cache_control orelse return null) orelse return null;
|
||||
|
||||
return .{
|
||||
.url = url,
|
||||
.url = try arena.dupeZ(u8, url),
|
||||
.content_type = if (content_type) |ct| try arena.dupe(u8, ct) else "application/octet-stream",
|
||||
.status = status,
|
||||
.stored_at = timestamp,
|
||||
|
||||
Reference in New Issue
Block a user