[Top][All Lists]
[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Guile-commits] GNU Guile branch, wip-nio, updated. v2.1.0-206-g75a8d1b,
Andy Wingo <=