r5318: *** empty log message ***
[cl-modlisp.git] / utils.lisp
index 387fa7396c706497a05308637ed4c40eaec900bc..97f6f76a76e1330a1b794084266c066c7ecee300 100644 (file)
@@ -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)
     (: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*)
         (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)
   (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