From bb6d9fd89dc29472d659229693a3c033819fc2b7 Mon Sep 17 00:00:00 2001 From: Christopher Baines Date: Sun, 22 Mar 2026 15:04:51 +0000 Subject: [PATCH] Add exception handling to the server loop This should start to deal with accept failing if there are too many open files. --- knots/web-server.scm | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/knots/web-server.scm b/knots/web-server.scm index adaba13..a99b971 100644 --- a/knots/web-server.scm +++ b/knots/web-server.scm @@ -576,19 +576,28 @@ before sending back to the client." (spawn-fiber (lambda () - (let loop () - (match (accept socket (logior SOCK_NONBLOCK SOCK_CLOEXEC)) - ((client . sockaddr) - (spawn-fiber (lambda () - (client-loop client handler - read-request-exception-handler - write-response-exception-handler - connection-idle-timeout - connection-buffer-size - (post-request-hook/safe - post-request-hook))) - #:parallel? #t) - (loop)))))) + (while #t + (with-exception-handler + (const #t) + (lambda () + (with-exception-handler + (lambda (exn) + (print-backtrace-and-exception/knots exn)) + (lambda () + (let loop () + (match (accept socket (logior SOCK_NONBLOCK SOCK_CLOEXEC)) + ((client . sockaddr) + (spawn-fiber (lambda () + (client-loop client handler + read-request-exception-handler + write-response-exception-handler + connection-idle-timeout + connection-buffer-size + (post-request-hook/safe + post-request-hook))) + #:parallel? #t) + (loop))))))) + #:unwind? #t)))) (make-web-server socket (vector-ref (getsockname socket)