;;;; 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*))
(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)
;; 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