;; -*- mode: Scheme; -*- ;; ;; This file is part of WebGate for CHICKEN. ;; Copyright (c) 2011 by Thomas Chust. All rights reserved. ;; ;; Permission is hereby granted, free of charge, to any person ;; obtaining a copy of this software and associated documentation ;; files (the Software), to deal in the Software without restriction, ;; including without limitation the rights to use, copy, modify, ;; merge, publish, distribute, sublicense, and/or sell copies of the ;; Software, and to permit persons to whom the Software is furnished ;; to do so, subject to the following conditions: ;; ;; The above copyright notice and this permission notice shall be ;; included in all copies or substantial portions of the Software. ;; ;; THE SOFTWARE IS PROVIDED ASIS, WITHOUT WARRANTY OF ANY KIND, ;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS ;; BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ;; ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN ;; CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ;; SOFTWARE. ;;; SCGI server loop (and directly related stuff) (define (scgi-main-loop handle-request listener) (let ((environment-rx (irregex '(: ($ (* (~ #\nul))) #\nul ($ (* (~ #\nul))) #\nul)))) (let loop () (let-values (((input-port output-port) (tcp-accept listener))) (thread-start! (make-thread (lambda () (let ((environment (irregex-fold environment-rx (lambda (start m environment) (hash-table-set! environment (irregex-match-substring m 1) (irregex-match-substring m 2)) environment) (make-hash-table #:test string=? #:hash string-hash) (read-netstring input-port)))) (handle-request (cut hash-table-ref/default environment <> #f) input-port output-port)) (close-input-port input-port) (close-output-port output-port)))) (loop)))))