X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=utils.lisp;h=97f6f76a76e1330a1b794084266c066c7ecee300;hb=f63edd12886a0ed33be55f49c3284acca5db4797;hp=387fa7396c706497a05308637ed4c40eaec900bc;hpb=af822a09967eb5334753e5c1207702bf63198313;p=cl-modlisp.git diff --git a/utils.lisp b/utils.lisp index 387fa73..97f6f76 100644 --- a/utils.lisp +++ b/utils.lisp @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Dec 2002 ;;;; -;;;; $Id: utils.lisp,v 1.6 2003/07/11 02:38:00 kevin Exp $ +;;;; $Id: utils.lisp,v 1.7 2003/07/16 20:40:43 kevin Exp $ ;;;; ************************************************************************* (in-package #:modlisp) @@ -19,17 +19,22 @@ (:text "text/plain") (otherwise fmt))) -(defmacro with-ml-page ((&key (format :html) (precompute t)) &body body) - (let ((fmt (gensym)) - (precomp (gensym)) - (result (gensym)) - (outstr (gensym)) - (stream (gensym))) +(defmacro with-ml-page ((&key (format :html) (precompute t) headers) + &body body) + (let ((fmt (gensym "FMT-")) + (precomp (gensym "PRE-")) + (result (gensym "RES-")) + (outstr (gensym "STR-")) + (stream (gensym "STRM-")) + (hdr (gensym "HDR-"))) `(let ((,fmt ,format) (,precomp ,precompute) - ,result ,outstr) + ,result ,outstr ,stream) + (declare (ignorable ,stream)) (write-header-line "Status" "200 OK") (write-header-line "Content-Type" (format-string ,fmt)) + (dolist (,hdr ,headers) + (write-header-line (car ,hdr) (cdr ,hdr))) (unless ,precomp (write-string "end" *modlisp-socket*) (write-char #\NewLine *modlisp-socket*)) @@ -44,7 +49,6 @@ (write-header-line "Content-Length" (write-to-string (length ,outstr))) (write-header-line "Keep-Socket" "1") - (write-header-line "Keep-Alive" "timeout=15, max=99") (write-header-line "Connection" "Keep-Alive") (write-string "end" *modlisp-socket*) (write-char #\NewLine *modlisp-socket*) @@ -52,14 +56,16 @@ (finish-output *modlisp-socket*) (setq *close-modlisp-socket* nil)) (t - (setq *close-modlisp-socket* t) - (finish-output *modlisp-socket*))) + (finish-output *modlisp-socket*) + (setq *close-modlisp-socket* t))) ,result))) (defun redirect-to-location (url) (write-header-line "Status" "302 Redirect") (write-header-line "Location" url) + (write-string "end" *modlisp-socket*) (write-char #\NewLine *modlisp-socket*) + (force-output *modlisp-socket*) (setq *close-modlisp-socket* t)) (defun output-ml-page (format html) @@ -67,11 +73,11 @@ (write-header-line "Content-Type" (format-string format)) (write-header-line "Content-Length" (format nil "~d" (length html))) (write-header-line "Keep-Socket" "1") - (write-header-line "Keep-Alive" "timeout=15, max=99") (write-header-line "Connection" "Keep-Alive") (write-string "end" *modlisp-socket*) (write-char #\NewLine *modlisp-socket*) (write-string html *modlisp-socket*) + (force-output *modlisp-socket*) (setq *close-modlisp-socket* nil)) (defun output-html-page (str) @@ -82,7 +88,7 @@ ;; Utility functions for library users -(defun posted-to-alist (posted-string) +(defun query-to-alist (posted-string) "Converts a posted string to an assoc list of keyword names and values, \"a=1&bc=demo\" => ((:a . \"1\") (:bc . \"demo\"))" (when posted-string