(define-module(www server-utils modlisp)#:export(modlisp-hgrok modlisp-ish)#:use-module((www crlf)#:select(get-body-proc))#:use-module((srfi srfi-1)#:select(lset-difference))#:use-module((ice-9 rdelim)#:select(read-line)))
(define(read-until-body port hsym)(let loop((acc '()))(let((k(read-line port)))(if(string=? "end" k)(reverse! acc)(loop(acons(hsym k)(read-line port)acc))))))
(define(read-request port s2s)(define(hsym string)(string->symbol(s2s string)))(let*((headers(read-until-body port hsym))(method(assq(hsym "method")headers))(upath(assq(hsym "url")headers))(pvers(assq(hsym "server-protocol")headers)))(set! headers(lset-difference eq? headers(list method upath pvers)))(values(cdr method)(cdr upath)(cdr pvers)headers(get-body-proc port hsym headers))))
(define LF "\n")
(define modlisp-ish(vector LF #f(string-append "Status" LF)LF(string-append "end" LF)))
(define modlisp-hgrok(vector read-request modlisp-ish))
