Skip to content

Commit f5ec742

Browse files
committed
Add fulfillRequest and more complete continueRequest
1 parent 211012d commit f5ec742

File tree

10 files changed

+231
-96
lines changed

10 files changed

+231
-96
lines changed

src/browser/ScriptManager.zig

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ const parser = @import("netsurf.zig");
2424
const Env = @import("env.zig").Env;
2525
const Page = @import("page.zig").Page;
2626
const DataURI = @import("DataURI.zig");
27+
const Http = @import("../http/Http.zig");
2728
const Browser = @import("browser.zig").Browser;
28-
const HttpClient = @import("../http/Client.zig");
2929
const URL = @import("../url.zig").URL;
3030

3131
const Allocator = std.mem.Allocator;
@@ -57,7 +57,7 @@ deferreds: OrderList,
5757

5858
shutdown: bool = false,
5959

60-
client: *HttpClient,
60+
client: *Http.Client,
6161
allocator: Allocator,
6262
buffer_pool: BufferPool,
6363
script_pool: std.heap.MemoryPool(PendingScript),
@@ -229,7 +229,7 @@ pub fn addFromElement(self: *ScriptManager, element: *parser.Element) !void {
229229

230230
errdefer pending_script.deinit();
231231

232-
var headers = try HttpClient.Headers.init();
232+
var headers = try Http.Headers.init();
233233
try page.requestCookie(.{}).headersForRequest(page.arena, remote_url.?, &headers);
234234

235235
try self.client.request(.{
@@ -297,7 +297,7 @@ pub fn blockingGet(self: *ScriptManager, url: [:0]const u8) !BlockingResult {
297297
.buffer_pool = &self.buffer_pool,
298298
};
299299

300-
var headers = try HttpClient.Headers.init();
300+
var headers = try Http.Headers.init();
301301
try self.page.requestCookie(.{}).headersForRequest(self.page.arena, url, &headers);
302302

303303
var client = self.client;
@@ -425,15 +425,15 @@ fn getList(self: *ScriptManager, script: *const Script) *OrderList {
425425
return &self.scripts;
426426
}
427427

428-
fn startCallback(transfer: *HttpClient.Transfer) !void {
428+
fn startCallback(transfer: *Http.Transfer) !void {
429429
const script: *PendingScript = @alignCast(@ptrCast(transfer.ctx));
430430
script.startCallback(transfer) catch |err| {
431431
log.err(.http, "SM.startCallback", .{ .err = err, .transfer = transfer });
432432
return err;
433433
};
434434
}
435435

436-
fn headerCallback(transfer: *HttpClient.Transfer) !void {
436+
fn headerCallback(transfer: *Http.Transfer) !void {
437437
const script: *PendingScript = @alignCast(@ptrCast(transfer.ctx));
438438
script.headerCallback(transfer) catch |err| {
439439
log.err(.http, "SM.headerCallback", .{
@@ -445,7 +445,7 @@ fn headerCallback(transfer: *HttpClient.Transfer) !void {
445445
};
446446
}
447447

448-
fn dataCallback(transfer: *HttpClient.Transfer, data: []const u8) !void {
448+
fn dataCallback(transfer: *Http.Transfer, data: []const u8) !void {
449449
const script: *PendingScript = @alignCast(@ptrCast(transfer.ctx));
450450
script.dataCallback(transfer, data) catch |err| {
451451
log.err(.http, "SM.dataCallback", .{ .err = err, .transfer = transfer, .len = data.len });
@@ -490,12 +490,12 @@ const PendingScript = struct {
490490
}
491491
}
492492

493-
fn startCallback(self: *PendingScript, transfer: *HttpClient.Transfer) !void {
493+
fn startCallback(self: *PendingScript, transfer: *Http.Transfer) !void {
494494
_ = self;
495495
log.debug(.http, "script fetch start", .{ .req = transfer });
496496
}
497497

498-
fn headerCallback(self: *PendingScript, transfer: *HttpClient.Transfer) !void {
498+
fn headerCallback(self: *PendingScript, transfer: *Http.Transfer) !void {
499499
const header = &transfer.response_header.?;
500500
log.debug(.http, "script header", .{
501501
.req = transfer,
@@ -515,7 +515,7 @@ const PendingScript = struct {
515515
self.script.source = .{ .remote = self.manager.buffer_pool.get() };
516516
}
517517

518-
fn dataCallback(self: *PendingScript, transfer: *HttpClient.Transfer, data: []const u8) !void {
518+
fn dataCallback(self: *PendingScript, transfer: *Http.Transfer, data: []const u8) !void {
519519
_ = transfer;
520520
// too verbose
521521
// log.debug(.http, "script data chunk", .{
@@ -768,11 +768,11 @@ const Blocking = struct {
768768
done: BlockingResult,
769769
};
770770

771-
fn startCallback(transfer: *HttpClient.Transfer) !void {
771+
fn startCallback(transfer: *Http.Transfer) !void {
772772
log.debug(.http, "script fetch start", .{ .req = transfer, .blocking = true });
773773
}
774774

775-
fn headerCallback(transfer: *HttpClient.Transfer) !void {
775+
fn headerCallback(transfer: *Http.Transfer) !void {
776776
const header = &transfer.response_header.?;
777777
log.debug(.http, "script header", .{
778778
.req = transfer,
@@ -789,7 +789,7 @@ const Blocking = struct {
789789
self.buffer = self.buffer_pool.get();
790790
}
791791

792-
fn dataCallback(transfer: *HttpClient.Transfer, data: []const u8) !void {
792+
fn dataCallback(transfer: *Http.Transfer, data: []const u8) !void {
793793
// too verbose
794794
// log.debug(.http, "script data chunk", .{
795795
// .req = transfer,

src/browser/page.zig

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ const Renderer = @import("renderer.zig").Renderer;
3030
const Window = @import("html/window.zig").Window;
3131
const Walker = @import("dom/walker.zig").WalkerDepthFirst;
3232
const Scheduler = @import("Scheduler.zig");
33-
const HttpClient = @import("../http/Client.zig");
33+
const Http = @import("../http/Http.zig");
3434
const ScriptManager = @import("ScriptManager.zig");
3535
const HTMLDocument = @import("html/document.zig").HTMLDocument;
3636

@@ -87,7 +87,7 @@ pub const Page = struct {
8787
polyfill_loader: polyfill.Loader = .{},
8888

8989
scheduler: Scheduler,
90-
http_client: *HttpClient,
90+
http_client: *Http.Client,
9191
script_manager: ScriptManager,
9292

9393
mode: Mode,
@@ -375,7 +375,10 @@ pub const Page = struct {
375375
return;
376376
}
377377
},
378-
.err => |err| return err,
378+
.err => |err| {
379+
self.mode = .{ .raw_done = @errorName(err) };
380+
return err;
381+
},
379382
.raw_done => return,
380383
}
381384

@@ -394,7 +397,7 @@ pub const Page = struct {
394397
std.debug.print("\nactive requests: {d}\n", .{self.http_client.active});
395398
var n_ = self.http_client.handles.in_use.first;
396399
while (n_) |n| {
397-
const transfer = HttpClient.Transfer.fromEasy(n.data.conn.easy) catch |err| {
400+
const transfer = Http.Transfer.fromEasy(n.data.conn.easy) catch |err| {
398401
std.debug.print(" - failed to load transfer: {any}\n", .{err});
399402
break;
400403
};
@@ -467,7 +470,7 @@ pub const Page = struct {
467470
is_http: bool = true,
468471
is_navigation: bool = false,
469472
};
470-
pub fn requestCookie(self: *const Page, opts: RequestCookieOpts) HttpClient.RequestCookie {
473+
pub fn requestCookie(self: *const Page, opts: RequestCookieOpts) Http.Client.RequestCookie {
471474
return .{
472475
.jar = self.cookie_jar,
473476
.origin = &self.url.uri,
@@ -505,7 +508,7 @@ pub const Page = struct {
505508
const owned_url = try self.arena.dupeZ(u8, request_url);
506509
self.url = try URL.parse(owned_url, null);
507510

508-
var headers = try HttpClient.Headers.init();
511+
var headers = try Http.Headers.init();
509512
if (opts.header) |hdr| try headers.add(hdr);
510513
try self.requestCookie(.{ .is_navigation = true }).headersForRequest(self.arena, owned_url, &headers);
511514

@@ -596,7 +599,7 @@ pub const Page = struct {
596599
);
597600
}
598601

599-
fn pageHeaderDoneCallback(transfer: *HttpClient.Transfer) !void {
602+
fn pageHeaderDoneCallback(transfer: *Http.Transfer) !void {
600603
var self: *Page = @alignCast(@ptrCast(transfer.ctx));
601604

602605
// would be different than self.url in the case of a redirect
@@ -611,7 +614,7 @@ pub const Page = struct {
611614
});
612615
}
613616

614-
fn pageDataCallback(transfer: *HttpClient.Transfer, data: []const u8) !void {
617+
fn pageDataCallback(transfer: *Http.Transfer, data: []const u8) !void {
615618
var self: *Page = @alignCast(@ptrCast(transfer.ctx));
616619

617620
if (self.mode == .pre) {
@@ -1035,7 +1038,7 @@ pub const NavigateReason = enum {
10351038
pub const NavigateOpts = struct {
10361039
cdp_id: ?i64 = null,
10371040
reason: NavigateReason = .address_bar,
1038-
method: HttpClient.Method = .GET,
1041+
method: Http.Method = .GET,
10391042
body: ?[]const u8 = null,
10401043
header: ?[:0]const u8 = null,
10411044
};

src/browser/xhr/xhr.zig

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ const URL = @import("../../url.zig").URL;
3030
const Mime = @import("../mime.zig").Mime;
3131
const parser = @import("../netsurf.zig");
3232
const Page = @import("../page.zig").Page;
33-
const HttpClient = @import("../../http/Client.zig");
33+
const Http = @import("../../http/Http.zig");
3434
const CookieJar = @import("../storage/storage.zig").CookieJar;
3535

3636
// XHR interfaces
@@ -80,12 +80,12 @@ const XMLHttpRequestBodyInit = union(enum) {
8080
pub const XMLHttpRequest = struct {
8181
proto: XMLHttpRequestEventTarget = XMLHttpRequestEventTarget{},
8282
arena: Allocator,
83-
transfer: ?*HttpClient.Transfer = null,
83+
transfer: ?*Http.Transfer = null,
8484
err: ?anyerror = null,
8585
last_dispatch: i64 = 0,
8686
send_flag: bool = false,
8787

88-
method: HttpClient.Method,
88+
method: Http.Method,
8989
state: State,
9090
url: ?[:0]const u8 = null,
9191

@@ -320,7 +320,7 @@ pub const XMLHttpRequest = struct {
320320
}
321321

322322
const methods = [_]struct {
323-
tag: HttpClient.Method,
323+
tag: Http.Method,
324324
name: []const u8,
325325
}{
326326
.{ .tag = .DELETE, .name = "DELETE" },
@@ -330,7 +330,7 @@ pub const XMLHttpRequest = struct {
330330
.{ .tag = .POST, .name = "POST" },
331331
.{ .tag = .PUT, .name = "PUT" },
332332
};
333-
pub fn validMethod(m: []const u8) DOMError!HttpClient.Method {
333+
pub fn validMethod(m: []const u8) DOMError!Http.Method {
334334
for (methods) |method| {
335335
if (std.ascii.eqlIgnoreCase(method.name, m)) {
336336
return method.tag;
@@ -370,7 +370,7 @@ pub const XMLHttpRequest = struct {
370370
}
371371
}
372372

373-
var headers = try HttpClient.Headers.init();
373+
var headers = try Http.Headers.init();
374374
for (self.headers.items) |hdr| {
375375
try headers.add(hdr);
376376
}
@@ -393,18 +393,19 @@ pub const XMLHttpRequest = struct {
393393
});
394394
}
395395

396-
fn httpStartCallback(transfer: *HttpClient.Transfer) !void {
396+
fn httpStartCallback(transfer: *Http.Transfer) !void {
397397
const self: *XMLHttpRequest = @alignCast(@ptrCast(transfer.ctx));
398398
log.debug(.http, "request start", .{ .method = self.method, .url = self.url, .source = "xhr" });
399399
self.transfer = transfer;
400400
}
401401

402-
fn httpHeaderCallback(transfer: *HttpClient.Transfer, header: []const u8) !void {
402+
fn httpHeaderCallback(transfer: *Http.Transfer, header: Http.Header) !void {
403403
const self: *XMLHttpRequest = @alignCast(@ptrCast(transfer.ctx));
404-
try self.response_headers.append(self.arena, try self.arena.dupe(u8, header));
404+
const joined = try std.fmt.allocPrint(self.arena, "{s}: {s}", .{ header.name, header.value });
405+
try self.response_headers.append(self.arena, joined);
405406
}
406407

407-
fn httpHeaderDoneCallback(transfer: *HttpClient.Transfer) !void {
408+
fn httpHeaderDoneCallback(transfer: *Http.Transfer) !void {
408409
const self: *XMLHttpRequest = @alignCast(@ptrCast(transfer.ctx));
409410

410411
const header = &transfer.response_header.?;
@@ -434,7 +435,7 @@ pub const XMLHttpRequest = struct {
434435
self.dispatchEvt("readystatechange");
435436
}
436437

437-
fn httpDataCallback(transfer: *HttpClient.Transfer, data: []const u8) !void {
438+
fn httpDataCallback(transfer: *Http.Transfer, data: []const u8) !void {
438439
const self: *XMLHttpRequest = @alignCast(@ptrCast(transfer.ctx));
439440
try self.response_bytes.appendSlice(self.arena, data);
440441

src/cdp/cdp.zig

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,12 @@ pub fn BrowserContext(comptime CDP_T: type) type {
387387
pub fn deinit(self: *Self) void {
388388
self.inspector.deinit();
389389

390+
// abort all intercepted requests before closing the sesion/page
391+
// since some of these might callback into the page/scriptmanager
392+
for (self.intercept_state.pendingTransfers()) |transfer| {
393+
transfer.abort();
394+
}
395+
390396
// If the session has a page, we need to clear it first. The page
391397
// context is always nested inside of the isolated world context,
392398
// so we need to shutdown the page one first.
@@ -406,10 +412,6 @@ pub fn BrowserContext(comptime CDP_T: type) type {
406412
log.warn(.http, "restoreOriginalProxy", .{ .err = err });
407413
};
408414
}
409-
410-
for (self.intercept_state.pendingTransfers()) |transfer| {
411-
transfer.abort();
412-
}
413415
self.intercept_state.deinit();
414416
}
415417

src/cdp/domains/dom.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ fn describeNode(cmd: anytype) !void {
304304
pierce: bool = false,
305305
})) orelse return error.InvalidParams;
306306

307-
if (params.depth != 1 or params.pierce) return error.NotYetImplementedParams;
307+
if (params.depth != 1 or params.pierce) return error.NotImplemented;
308308
const bc = cmd.browser_context orelse return error.BrowserContextNotLoaded;
309309

310310
const node = try getNode(cmd.arena, bc, params.nodeId, params.backendNodeId, params.objectId);

0 commit comments

Comments
 (0)