guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

branch master updated: web: server: Remove with-ignored-disconnects.


From: Mathieu Othacehe
Subject: branch master updated: web: server: Remove with-ignored-disconnects.
Date: Tue, 04 Aug 2020 12:24:02 -0400

This is an automated email from the git hooks/post-receive script.

mothacehe pushed a commit to branch master
in repository guix-cuirass.

The following commit(s) were added to refs/heads/master by this push:
     new 1bcccba  web: server: Remove with-ignored-disconnects.
1bcccba is described below

commit 1bcccbab768587d80385a998bb3e450e2fdc2226
Author: Mathieu Othacehe <othacehe@gnu.org>
AuthorDate: Tue Aug 4 18:14:51 2020 +0200

    web: server: Remove with-ignored-disconnects.
    
    Use the pre-unwind-handler of a catch clause instead of nesting
    with-throw-handler inside a catch clause.
    
    * src/web/server/fiberized.scm (with-ignored-disconnects): Remove it,
    (client-loop): replace "with-ignored-disconnects" with a catch clause.
---
 src/web/server/fiberized.scm | 129 ++++++++++++++++++++-----------------------
 1 file changed, 61 insertions(+), 68 deletions(-)

diff --git a/src/web/server/fiberized.scm b/src/web/server/fiberized.scm
index 5df1d58..23a2bd9 100644
--- a/src/web/server/fiberized.scm
+++ b/src/web/server/fiberized.scm
@@ -110,79 +110,72 @@
              (alist-cons 'content-length length
                          (strip-headers response))))
 
-(define-syntax-rule (with-ignored-disconnects exp ...)
-  "Run EXP and ignore silently any exceptions caused by a premature client
-disconnection. Re-raise any other kind of exceptions."
-  (catch 'system-error
-    (lambda ()
-      exp ...)
-    (lambda args
-      (unless (memv (system-error-errno args)
-                    (list EPIPE ECONNRESET))
-        (apply throw args)))))
-
 (define (client-loop client have-request)
   ;; Always disable Nagle's algorithm, as we handle buffering
   ;; ourselves.
   (setsockopt client IPPROTO_TCP TCP_NODELAY 1)
   (setvbuf client 'block 1024)
-  (with-ignored-disconnects
-   (with-throw-handler #t
-     (lambda ()
-       (let ((response-channel (make-channel)))
-         (let loop ()
-           (cond
-            ((eof-object? (lookahead-u8 client))
-             (close-port client))
-            (else
-             (call-with-values
-                 (lambda ()
-                   (catch #t
-                     (lambda ()
-                       (let* ((request (read-request client))
-                              (body (read-request-body request)))
-                         (have-request response-channel request body)))
-                     (lambda (key . args)
-                       (display "While reading request:\n"
-                                (current-error-port))
-                       (print-exception (current-error-port) #f key args)
-                       (values (build-response #:version '(1 . 0) #:code 400
-                                               #:headers
-                                               '((content-length . 0)))
-                               #vu8()))))
-               (lambda (response body)
-                 (match (assoc-ref (response-headers response) 'x-raw-file)
-                   ((? string? file)
-                    (non-blocking
-                     (call-with-input-file file
-                       (lambda (input)
-                         (let* ((size     (stat:size (stat input)))
-                                (response (write-response
-                                           (with-content-length response size)
-                                           client))
-                                (output   (response-port response)))
-                           (setsockopt client SOL_SOCKET SO_SNDBUF
-                                       (* 128 1024))
-                           (if (file-port? output)
-                               (sendfile output input size)
-                               (dump-port input output))
-                           (close-port output)
-                           (values))))))
-                   (#f (begin
-                         (write-response response client)
-                         (when body
-                           (put-bytevector client body))
-                         (force-output client))
-                       (if (and (keep-alive? response)
-                                (not (eof-object? (peek-char client))))
-                           (loop)
-                           (close-port client)))))))))))
-     (lambda (k . args)
-       (catch #t
-         (lambda () (close-port client))
-         (lambda (k . args)
-           (display "While closing port:\n" (current-error-port))
-           (print-exception (current-error-port) #f k args)))))))
+  (catch #t
+    (lambda ()
+      (let ((response-channel (make-channel)))
+        (let loop ()
+          (cond
+           ((eof-object? (lookahead-u8 client))
+            (close-port client))
+           (else
+            (call-with-values
+                (lambda ()
+                  (catch #t
+                    (lambda ()
+                      (let* ((request (read-request client))
+                             (body (read-request-body request)))
+                        (have-request response-channel request body)))
+                    (lambda (key . args)
+                      (display "While reading request:\n"
+                               (current-error-port))
+                      (print-exception (current-error-port) #f key args)
+                      (values (build-response #:version '(1 . 0) #:code 400
+                                              #:headers
+                                              '((content-length . 0)))
+                              #vu8()))))
+              (lambda (response body)
+                (match (assoc-ref (response-headers response) 'x-raw-file)
+                  ((? string? file)
+                   (non-blocking
+                    (call-with-input-file file
+                      (lambda (input)
+                        (let* ((size     (stat:size (stat input)))
+                               (response (write-response
+                                          (with-content-length response size)
+                                          client))
+                               (output   (response-port response)))
+                          (setsockopt client SOL_SOCKET SO_SNDBUF
+                                      (* 128 1024))
+                          (if (file-port? output)
+                              (sendfile output input size)
+                              (dump-port input output))
+                          (close-port output)
+                          (values))))))
+                  (#f (begin
+                        (write-response response client)
+                        (when body
+                          (put-bytevector client body))
+                        (force-output client))
+                      (if (and (keep-alive? response)
+                               (not (eof-object? (peek-char client))))
+                          (loop)
+                          (close-port client)))))))))))
+    (lambda args
+      ;; Ignore premature client disconnections.
+      (unless (memv (system-error-errno args)
+                    (list EPIPE ECONNRESET))
+        (apply throw args)))
+    (lambda (k . args)
+      (catch #t
+        (lambda () (close-port client))
+        (lambda (k . args)
+          (display "While closing port:\n" (current-error-port))
+          (print-exception (current-error-port) #f k args))))))
 
 (define (socket-loop socket request-channel)
   (define (have-request response-channel request body)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]