On CDP process error, let client decide how to close

Fixes issue where CDP closes the client, but client still registers a recv
operation.
This commit is contained in:
Karl Seguin
2025-02-17 12:05:25 +08:00
parent b60a91f53c
commit c4eeef2a86
2 changed files with 8 additions and 4 deletions

View File

@@ -114,15 +114,15 @@ pub const CDP = struct {
self.session = try self.browser.newSession(self); self.session = try self.browser.newSession(self);
} }
pub fn processMessage(self: *CDP, msg: []const u8) void { pub fn processMessage(self: *CDP, msg: []const u8) bool {
const arena = &self.message_arena; const arena = &self.message_arena;
defer _ = arena.reset(.{ .retain_with_limit = 1024 * 16 }); defer _ = arena.reset(.{ .retain_with_limit = 1024 * 16 });
self.dispatch(arena.allocator(), self, msg) catch |err| { self.dispatch(arena.allocator(), self, msg) catch |err| {
log.err("failed to process message: {}\n{s}", .{ err, msg }); log.err("failed to process message: {}\n{s}", .{ err, msg });
self.client.close(null); return false;
return;
}; };
return true;
} }
// Called from above, in processMessage which handles client messages // Called from above, in processMessage which handles client messages

View File

@@ -555,6 +555,7 @@ fn ClientT(comptime S: type, comptime C: type) type {
errdefer self.server.queueClose(self.socket); errdefer self.server.queueClose(self.socket);
var reader = &self.reader; var reader = &self.reader;
while (true) { while (true) {
const msg = reader.next() catch |err| { const msg = reader.next() catch |err| {
switch (err) { switch (err) {
@@ -578,7 +579,10 @@ fn ClientT(comptime S: type, comptime C: type) type {
self.server.queueClose(self.socket); self.server.queueClose(self.socket);
return false; return false;
}, },
.text, .binary => self.cdp.?.processMessage(msg.data), .text, .binary => if (self.cdp.?.processMessage(msg.data) == false) {
self.close(null);
return false;
},
} }
if (msg.cleanup_fragment) { if (msg.cleanup_fragment) {
reader.cleanup(); reader.cleanup();