;; -*- mode: Scheme; -*-
;;
;; This file is part of WebGate for CHICKEN.
;; Copyright (c) 2011-2013 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 (cut write-response <> output-port)))
(close-input-port input-port)
(close-output-port output-port))))
(loop)))))