From 6d0dc6cb1efd1d91bc4eee551a1a7dc69054db93 Mon Sep 17 00:00:00 2001 From: Nikolay Govorov Date: Mon, 16 Mar 2026 20:20:47 +0000 Subject: [PATCH] Gracefull close ws socket --- src/Server.zig | 5 ++++- src/network/Runtime.zig | 5 ++++- src/network/websocket.zig | 5 +++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/Server.zig b/src/Server.zig index f899d43c..e43313da 100644 --- a/src/Server.zig +++ b/src/Server.zig @@ -242,7 +242,10 @@ pub const Client = struct { fn stop(self: *Client) void { switch (self.mode) { .http => {}, - .cdp => |*cdp| cdp.browser.env.terminate(), + .cdp => |*cdp| { + cdp.browser.env.terminate(); + self.ws.sendClose(); + }, } self.ws.shutdown(); } diff --git a/src/network/Runtime.zig b/src/network/Runtime.zig index d6a08f59..196e2aa2 100644 --- a/src/network/Runtime.zig +++ b/src/network/Runtime.zig @@ -308,10 +308,13 @@ pub fn run(self: *Runtime) void { const socket = posix.accept(listener.socket, null, null, posix.SOCK.NONBLOCK) catch |err| { switch (err) { - error.SocketNotListening, error.ConnectionAborted => { + error.SocketNotListening => { self.pollfds[1] = .{ .fd = -1, .events = 0, .revents = 0 }; self.listener = null; }, + error.ConnectionAborted => { + lp.log.warn(.app, "accept connection aborted", .{}); + }, error.WouldBlock => {}, else => { lp.log.err(.app, "accept", .{ .err = err }); diff --git a/src/network/websocket.zig b/src/network/websocket.zig index 5a5b4747..c6c74ed0 100644 --- a/src/network/websocket.zig +++ b/src/network/websocket.zig @@ -308,6 +308,7 @@ pub fn Reader(comptime EXPECT_MASK: bool) type { pub const WsConnection = struct { // CLOSE, 2 length, code const CLOSE_NORMAL = [_]u8{ 136, 2, 3, 232 }; // code: 1000 + const CLOSE_GOING_AWAY = [_]u8{ 136, 2, 3, 233 }; // code: 1001 const CLOSE_TOO_BIG = [_]u8{ 136, 2, 3, 241 }; // 1009 const CLOSE_PROTOCOL_ERROR = [_]u8{ 136, 2, 3, 234 }; //code: 1002 // "private-use" close codes must be from 4000-49999 @@ -583,6 +584,10 @@ pub const WsConnection = struct { return address; } + pub fn sendClose(self: *WsConnection) void { + self.send(&CLOSE_GOING_AWAY) catch {}; + } + pub fn shutdown(self: *WsConnection) void { posix.shutdown(self.socket, .recv) catch {}; }