guile-commits
[Top][All Lists]
Advanced

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

[Guile-commits] GNU Guile branch, wip-nio, updated. v2.1.0-206-g75a8d1b


From: Andy Wingo
Subject: [Guile-commits] GNU Guile branch, wip-nio, updated. v2.1.0-206-g75a8d1b
Date: Mon, 19 Mar 2012 10:25:53 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU Guile".

http://git.savannah.gnu.org/cgit/guile.git/commit/?id=75a8d1ba66552fa3390558a8e16f782c1c55f164

The branch, wip-nio has been updated
       via  75a8d1ba66552fa3390558a8e16f782c1c55f164 (commit)
       via  9ea27ac051ce84d82af8d665beaee713ae0663a8 (commit)
      from  f5430195866396f175a3bdfac6f6e203308e6063 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 75a8d1ba66552fa3390558a8e16f782c1c55f164
Author: Andy Wingo <address@hidden>
Date:   Mon Mar 19 11:25:33 2012 +0100

    minor (web server nio) tweaks
    
    * module/web/server/nio.scm (bad-request): Define helper.
      (read-http-line): Handle an EOF return from get-bytevector-delimited.
      (read-request-body): Use the bad-request helper.
      (client-loop): Wrap the request read in a catch.  Silently exit the
      thread for closed keep-alive connections.

commit 9ea27ac051ce84d82af8d665beaee713ae0663a8
Author: Andy Wingo <address@hidden>
Date:   Mon Mar 19 11:22:49 2012 +0100

    minor ice-9/nio tweaks
    
    * module/ice-9/nio.scm (wait-for-readable): Also wait for EPOLLRDHUP.
      (get-bytevector-delimited): Properly return EOF for the bytevector if
      no data was read.

-----------------------------------------------------------------------

Summary of changes:
 module/ice-9/nio.scm      |    6 +++-
 module/web/server/nio.scm |   48 ++++++++++++++++++++++++++------------------
 2 files changed, 32 insertions(+), 22 deletions(-)

diff --git a/module/ice-9/nio.scm b/module/ice-9/nio.scm
index bc94dbf..d69ec1e 100644
--- a/module/ice-9/nio.scm
+++ b/module/ice-9/nio.scm
@@ -195,7 +195,7 @@
         (error "error reading from fd")))))
 
 (define (wait-for-readable nio-port)
-  (wait-for-events nio-port EPOLLIN))
+  (wait-for-events nio-port (logior EPOLLIN EPOLLRDHUP)))
 
 (define (wait-for-writable nio-port)
   (wait-for-events nio-port EPOLLOUT))
@@ -491,7 +491,9 @@
                 (let ((len (- end cur)))
                   (if (zero? len)
                       ;; EOF
-                      (values (collect-result prev prev-len bv)
+                      (values (if (zero? prev-len)
+                                  the-eof-object
+                                  (collect-result prev prev-len #vu8()))
                               the-eof-object)
                       (let ((ret (make-bytevector len)))
                         (bytevector-copy! bv cur ret 0 len)
diff --git a/module/web/server/nio.scm b/module/web/server/nio.scm
index ae56270..3bec01e 100644
--- a/module/web/server/nio.scm
+++ b/module/web/server/nio.scm
@@ -70,6 +70,9 @@
     (create-nio-thread ctx (lambda () (socket-loop server nsocket)))
     server))
 
+(define (bad-request msg . args)
+  (throw 'bad-request msg args))
+
 (define (read-http-line nio-port)
   ;; 10 and 13 are #\newline and #\return, respectively.
   (define (end-of-line? u8)
@@ -77,12 +80,14 @@
   (call-with-values (lambda ()
                       (get-bytevector-delimited nio-port end-of-line?))
     (lambda (bv delim)
-      (when (eof-object? delim)
-        (throw 'bad-request "EOF while reading line: ~S" bv))
-      (when (and (eqv? delim 13)
-                 (eqv? (lookahead-u8 nio-port) 10))
-        (get-u8 nio-port))
-      (utf8->string bv))))
+      (cond
+       ((eof-object? delim)
+        (bad-request "EOF while reading line: ~S" bv))
+       (else
+        (when (and (eqv? delim 13)
+                   (eqv? (lookahead-u8 nio-port) 10))
+          (get-u8 nio-port))
+        (utf8->string bv))))))
 
 (define (continuation-line? port)
   (case (integer->char (lookahead-u8 port))
@@ -106,14 +111,8 @@
          (let ((bv (get-bytevector-n (request-port r) nbytes)))
            (if (= (bytevector-length bv) nbytes)
                bv
-               (throw 'bad-request
-                      "EOF while reading request body: ~a bytes of ~a"
-                      (bytevector-length bv) nbytes))))))
-
-(define (bad-request port)
-  (write-response (build-response #:version '(1 . 0) #:code 400
-                                  #:headers '((content-length . 0)))
-                  port))
+               (bad-request "EOF while reading request body: ~a bytes of ~a"
+                            (bytevector-length bv) nbytes))))))
 
 (define (call-with-output-bytevector proc)
   (call-with-values (lambda () (open-bytevector-output-port))
@@ -140,11 +139,19 @@
       (let loop ()
         (call-with-values
             (lambda ()
-              (let* ((request (read-request client))
-                     (body (read-request-body request)))
-                (suspend-current-nio-thread
-                 (lambda ()
-                   (have-request (current-nio-thread) request body)))))
+              (catch #t
+                (lambda ()
+                  (let* ((request (read-request client))
+                         (body (read-request-body request)))
+                    (suspend-current-nio-thread
+                     (lambda ()
+                       (have-request (current-nio-thread) 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)
             (put-bytevector client
                             (call-with-output-bytevector
@@ -152,7 +159,8 @@
             (when body
               (put-bytevector client body))
             (drain-output client)
-            (if (keep-alive? response)
+            (if (and (keep-alive? response)
+                     (not (eof-object? (lookahead-u8 client))))
                 (loop)
                 (close-nio-port client))))))
     (lambda (k . args)


hooks/post-receive
-- 
GNU Guile



reply via email to

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