mirror of
https://github.com/lightpanda-io/browser.git
synced 2025-10-28 22:53:28 +00:00
fix header done callback
This commit is contained in:
@@ -53,32 +53,36 @@ pub fn processMessage(cmd: anytype) !void {
|
||||
|
||||
const Response = struct {
|
||||
status: u16,
|
||||
headers: std.StringArrayHashMapUnmanaged([]const u8) = .empty, // These may not be complete yet, but we only tell the client Network.responseReceived when all the headers are in
|
||||
// Later should store body as well to support getResponseBody which should only work once Network.loadingFinished is sent
|
||||
// but the body itself would be loaded with each chunks as Network.dataReceiveds are coming in.
|
||||
headers: std.StringArrayHashMapUnmanaged([]const u8) = .empty,
|
||||
// These may not be complete yet, but we only tell the client
|
||||
// Network.responseReceived when all the headers are in.
|
||||
// Later should store body as well to support getResponseBody which should
|
||||
// only work once Network.loadingFinished is sent but the body itself would
|
||||
// be loaded with each chunks as Network.dataReceiveds are coming in.
|
||||
};
|
||||
|
||||
// Stored in CDP
|
||||
pub const NetworkState = struct {
|
||||
const Self = @This();
|
||||
received: std.AutoArrayHashMap(u64, Response),
|
||||
arena: std.heap.ArenaAllocator,
|
||||
received: std.AutoArrayHashMap(u64, Response),
|
||||
|
||||
pub fn init(allocator: Allocator) !NetworkState {
|
||||
return .{
|
||||
.received = std.AutoArrayHashMap(u64, Response).init(allocator),
|
||||
.arena = std.heap.ArenaAllocator.init(allocator),
|
||||
.received = std.AutoArrayHashMap(u64, Response).init(allocator),
|
||||
};
|
||||
}
|
||||
|
||||
pub fn deinit(self: *Self) void {
|
||||
pub fn deinit(self: *NetworkState) void {
|
||||
self.received.deinit();
|
||||
self.arena.deinit();
|
||||
}
|
||||
|
||||
pub fn putOrAppendReceivedHeader(self: *NetworkState, request_id: u64, status: u16, header: std.http.Header) !void {
|
||||
const kv = try self.received.getOrPut(request_id);
|
||||
if (!kv.found_existing) kv.value_ptr.* = .{ .status = status };
|
||||
if (!kv.found_existing) {
|
||||
kv.value_ptr.* = .{ .status = status };
|
||||
}
|
||||
|
||||
const a = self.arena.allocator();
|
||||
const name = try a.dupe(u8, header.name);
|
||||
|
||||
@@ -247,13 +247,12 @@ fn makeTransfer(self: *Client, req: Request) !*Transfer {
|
||||
.req = req,
|
||||
.ctx = req.ctx,
|
||||
.client = self,
|
||||
.notification = &self.notification,
|
||||
};
|
||||
return transfer;
|
||||
}
|
||||
|
||||
fn requestFailed(self: *Client, transfer: *Transfer, err: anyerror) void {
|
||||
// this shoudln't happen, we'll crash in debug mode. But in release, we'll
|
||||
// this shouldn't happen, we'll crash in debug mode. But in release, we'll
|
||||
// just noop this state.
|
||||
std.debug.assert(transfer._notified_fail == false);
|
||||
if (transfer._notified_fail) {
|
||||
@@ -550,8 +549,6 @@ pub const Transfer = struct {
|
||||
|
||||
_redirecting: bool = false,
|
||||
|
||||
notification: *?*Notification, // Points to the Client's notification. TBD if a Browser can remove the notification before all Transfers are gone.
|
||||
|
||||
fn deinit(self: *Transfer) void {
|
||||
self.req.headers.deinit();
|
||||
if (self._handle) |handle| {
|
||||
@@ -676,7 +673,8 @@ pub const Transfer = struct {
|
||||
// returning < buf_len terminates the request
|
||||
return 0;
|
||||
};
|
||||
if (transfer.notification.*) |notification| { // TBD before or after callback?
|
||||
|
||||
if (transfer.client.notification) |notification| {
|
||||
notification.dispatch(.http_headers_done_receiving, &.{
|
||||
.transfer = transfer,
|
||||
});
|
||||
@@ -687,15 +685,16 @@ pub const Transfer = struct {
|
||||
log.err(.http, "header_callback", .{ .err = err, .req = transfer });
|
||||
return 0;
|
||||
};
|
||||
if (transfer.notification.*) |notification| { // TBD before or after callback?
|
||||
if (Http.Headers.parseHeader(header)) |hdr_name_value| {
|
||||
notification.dispatch(.http_header_received, &.{
|
||||
.request_id = transfer.id,
|
||||
.status = hdr.status,
|
||||
.header = hdr_name_value,
|
||||
});
|
||||
} else log.err(.http, "invalid header", .{ .line = header });
|
||||
}
|
||||
}
|
||||
|
||||
if (transfer.client.notification) |notification| {
|
||||
if (Http.Headers.parseHeader(header)) |hdr_name_value| {
|
||||
notification.dispatch(.http_header_received, &.{
|
||||
.request_id = transfer.id,
|
||||
.status = hdr.status,
|
||||
.header = hdr_name_value,
|
||||
});
|
||||
} else log.err(.http, "invalid header", .{ .line = header });
|
||||
}
|
||||
}
|
||||
return buf_len;
|
||||
|
||||
Reference in New Issue
Block a user