fetch response headers

This commit is contained in:
Karl Seguin
2025-11-27 18:54:11 +08:00
parent 819424fd3b
commit 94bcb30f11
3 changed files with 31 additions and 28 deletions

View File

@@ -24,6 +24,7 @@ const Http = @import("../../../http/Http.zig");
const js = @import("../../js/js.zig");
const Page = @import("../../Page.zig");
const Headers = @import("Headers.zig");
const Request = @import("Request.zig");
const Response = @import("Response.zig");
@@ -32,20 +33,22 @@ const Allocator = std.mem.Allocator;
const Fetch = @This();
_page: *Page,
_response: std.ArrayList(u8),
_buf: std.ArrayList(u8),
_response: *Response,
_resolver: js.PersistentPromiseResolver,
pub const Input = Request.Input;
// @ZIGDOM just enough to get campire demo working
// @ZIGDOM just enough to get campfire demo working
pub fn init(input: Input, page: *Page) !js.Promise {
const request = try Request.init(input, null, page);
const fetch = try page.arena.create(Fetch);
fetch.* = .{
._page = page,
._response = .empty,
._buf = .empty,
._resolver = try page.js.createPromiseResolver(.page),
._response = try Response.init(null, .{ .status = 0 }, page),
};
const http_client = page._session.browser.http_client;
@@ -68,20 +71,28 @@ pub fn init(input: Input, page: *Page) !js.Promise {
fn httpHeaderDoneCallback(transfer: *Http.Transfer) !void {
const self: *Fetch = @ptrCast(@alignCast(transfer.ctx));
_ = self;
if (transfer.getContentLength()) |cl| {
try self._buf.ensureTotalCapacity(self._page.arena, cl);
}
const res = self._response;
res._status = transfer.response_header.?.status;
var it = transfer.responseHeaderIterator();
while (it.next()) |hdr| {
try res._headers.append(hdr.name, hdr.value, self._page);
}
}
fn httpDataCallback(transfer: *Http.Transfer, data: []const u8) !void {
const self: *Fetch = @ptrCast(@alignCast(transfer.ctx));
try self._response.appendSlice(self._page.arena, data);
try self._buf.appendSlice(self._page.arena, data);
}
fn httpDoneCallback(ctx: *anyopaque) !void {
const self: *Fetch = @ptrCast(@alignCast(ctx));
const page = self._page;
const res = try Response.initFromFetch(page.arena, self._response.items, page);
return self._resolver.resolve(res);
self._response._body = self._buf.items;
return self._resolver.resolve(self._response);
}
fn httpErrorCallback(ctx: *anyopaque, err: anyerror) void {