From c4eeef2a8606048d776091de7deb72e3a5c68ce8 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Mon, 17 Feb 2025 12:05:25 +0800 Subject: [PATCH] On CDP process error, let client decide how to close Fixes issue where CDP closes the client, but client still registers a recv operation. --- src/cdp/cdp.zig | 6 +++--- src/server.zig | 6 +++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/cdp/cdp.zig b/src/cdp/cdp.zig index 61f245e3..cfd65029 100644 --- a/src/cdp/cdp.zig +++ b/src/cdp/cdp.zig @@ -114,15 +114,15 @@ pub const CDP = struct { 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; defer _ = arena.reset(.{ .retain_with_limit = 1024 * 16 }); self.dispatch(arena.allocator(), self, msg) catch |err| { log.err("failed to process message: {}\n{s}", .{ err, msg }); - self.client.close(null); - return; + return false; }; + return true; } // Called from above, in processMessage which handles client messages diff --git a/src/server.zig b/src/server.zig index 0f27f6e2..5bf3139d 100644 --- a/src/server.zig +++ b/src/server.zig @@ -555,6 +555,7 @@ fn ClientT(comptime S: type, comptime C: type) type { errdefer self.server.queueClose(self.socket); var reader = &self.reader; + while (true) { const msg = reader.next() catch |err| { switch (err) { @@ -578,7 +579,10 @@ fn ClientT(comptime S: type, comptime C: type) type { self.server.queueClose(self.socket); 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) { reader.cleanup();