From 677d941cb320aecf4f127e77f041f348d80f6d62 Mon Sep 17 00:00:00 2001 From: Christopher Baines Date: Sun, 22 Mar 2026 15:16:17 +0000 Subject: [PATCH] Simplify web server exception handling This used to be more complicated as the exception handler was configurable, but now it's not so this can be simplified. --- knots/web-server.scm | 87 ++++++++++++++++++++------------------------ 1 file changed, 39 insertions(+), 48 deletions(-) diff --git a/knots/web-server.scm b/knots/web-server.scm index a99b971..99abfdc 100644 --- a/knots/web-server.scm +++ b/knots/web-server.scm @@ -317,26 +317,6 @@ on the procedure being called at any particular time." ;; Close the client port #f) -(define (exception-handler exn request) - (let* ((error-string - (call-with-output-string - (lambda (port) - (simple-format - port - "exception when processing: ~A ~A\n" - (request-method request) - (uri-path (request-uri request))) - (print-backtrace-and-exception/knots - exn - #:port port))))) - (display/knots error-string - (current-error-port))) - - (values (build-response #:code 500) - ;; TODO Make this configurable - (string->utf8 - "internal server error"))) - (define* (handle-request handler client read-request-exception-handler write-response-exception-handler @@ -362,36 +342,47 @@ on the procedure being called at any particular time." (connection . (close)))) #vu8())) (else - (call-with-escape-continuation - (lambda (return) - (with-exception-handler - (lambda (exn) + (with-exception-handler + (lambda (exn) + (sanitize-response + request + (build-response #:code 500) + (string->utf8 + "internal server error"))) + (lambda () + (with-exception-handler + (lambda (exn) + (let* ((error-string + (call-with-output-string + (lambda (port) + (simple-format + port + "exception when processing: ~A ~A\n" + (request-method request) + (uri-path (request-uri request))) + (print-backtrace-and-exception/knots + exn + #:port port))))) + (display/knots error-string + (current-error-port)))) + (lambda () + (start-stack + #t (call-with-values (lambda () - (exception-handler exn request)) - (lambda (response body) - (call-with-values - (lambda () - (sanitize-response request response body)) - return)))) - (lambda () - (start-stack - #t - (call-with-values - (lambda () - (handler request)) - (match-lambda* - ((response body) - (sanitize-response request response body)) - (other - (raise-exception - (make-exception-with-irritants - (list (make-exception-with-message - (simple-format - #f - "wrong number of values returned from handler, expecting 2, got ~A" - (length other))) - handler))))))))))))))) + (handler request)) + (match-lambda* + ((response body) + (sanitize-response request response body)) + (other + (raise-exception + (make-exception-with-irritants + (list (make-exception-with-message + (simple-format + #f + "wrong number of values returned from handler, expecting 2, got ~A" + (length other))) + handler))))))))))))))) (with-exception-handler (lambda (exn) (write-response-exception-handler exn request))