diff --git a/src/handler.zig b/src/handler.zig index bcfa1dd1..004b2734 100644 --- a/src/handler.zig +++ b/src/handler.zig @@ -45,6 +45,10 @@ pub const Stream = struct { } fn closeCDP(self: *const Stream) void { + const close_msg: []const u8 = .{ 5, 0 } ++ "close"; + self.recv(close_msg) catch |err| { + log.err("stream close error: {any}", .{err}); + }; std.posix.close(self.socket); } diff --git a/src/server.zig b/src/server.zig index 0926d5f5..7d2a41a5 100644 --- a/src/server.zig +++ b/src/server.zig @@ -120,8 +120,8 @@ pub const Ctx = struct { std.debug.assert(completion == self.conn_completion); const size = result catch |err| { - if (err == error.Canceled) { - log.debug("read canceled", .{}); + if (self.isClosed() and err == error.FileDescriptorInvalid) { + log.debug("read has been canceled", .{}); return; } log.err("read error: {any}", .{err}); @@ -202,7 +202,7 @@ pub const Ctx = struct { if (now.since(self.last_active.?) > self.timeout) { // close current connection log.debug("conn timeout, closing...", .{}); - self.cancelAndClose(); + self.close(); return; } @@ -216,19 +216,6 @@ pub const Ctx = struct { ); } - fn cancelCbk(self: *Ctx, completion: *Completion, result: CancelError!void) void { - std.debug.assert(completion == self.accept_completion); - - _ = result catch |err| { - log.err("cancel error: {any}", .{err}); - self.err = err; - return; - }; - log.debug("cancel done", .{}); - - self.close(); - } - // shortcuts // --------- @@ -265,7 +252,7 @@ pub const Ctx = struct { if (std.mem.eql(u8, cmd, "close")) { // close connection log.info("close cmd, closing conn...", .{}); - self.cancelAndClose(); + self.close(); return error.Closed; } @@ -301,26 +288,12 @@ pub const Ctx = struct { } } - fn cancelAndClose(self: *Ctx) void { - if (isLinux) { // cancel is only available on Linux - self.loop.io.cancel( - *Ctx, - self, - Ctx.cancelCbk, - self.accept_completion, - self.conn_completion, - ); - } else { - self.close(); - } - } - fn close(self: *Ctx) void { - std.posix.close(self.conn_socket); // conn is closed - log.debug("connection closed", .{}); self.last_active = null; + std.posix.close(self.conn_socket); + log.debug("connection closed", .{}); // restart a new browser session in case of re-connect if (!self.sessionNew) {