diff options
Diffstat (limited to 'guix-data-service/web/build-server')
-rw-r--r-- | guix-data-service/web/build-server/controller.scm | 52 |
1 files changed, 28 insertions, 24 deletions
diff --git a/guix-data-service/web/build-server/controller.scm b/guix-data-service/web/build-server/controller.scm index 94c7e52..473cc61 100644 --- a/guix-data-service/web/build-server/controller.scm +++ b/guix-data-service/web/build-server/controller.scm @@ -277,8 +277,15 @@ (if (member provided-token (map cdr permitted-tokens) string=?) - (catch - 'json-invalid + (with-exception-handler + (lambda (exn) + (if (eq? (exception-kind exn) 'json-invalid) + (render-json + '((error . "could not parse body as JSON")) + #:code 400) + (render-json + '((error . "error")) + #:code 403))) (lambda () (let ((body-string (utf8->string body))) (let* ((body-json (json-string->scm body-string)) @@ -294,30 +301,27 @@ '((error . "no items to process")) #:code 400)) (else - (catch - #t + (with-exception-handler + (lambda (exn) + (render-json + '((error . "could not process events")) + #:code 500)) (lambda () - (process-items items) + (with-exception-handler + (lambda (exn) + (print-backtrace-and-exception/knots exn) + (simple-format (current-error-port) + "error processing events: ~A\n" + exn) + (for-each (lambda (item) + (simple-format (current-error-port) + " ~A\n" item)) + items)) + (lambda () + (process-items items))) (no-content)) - (lambda (key . args) - (simple-format (current-error-port) - "error processing events: ~A: ~A\n" - key - args) - (for-each (lambda (item) - (simple-format (current-error-port) - " ~A\n" item)) - items) - (render-json - '((error . "could not process events")) - #:code 500)))))))) - (lambda (key . args) - (render-json - '((error . "could not parse body as JSON")) - #:code 400))) - (render-json - '((error . "error")) - #:code 403))))))) + #:unwind? #t)))))) + #:unwind? #t))))))) (define (handle-signing-key-request id) (render-html |