From: Kevin M. Rosenberg Date: Wed, 22 Oct 2003 00:43:53 +0000 (+0000) Subject: r8022: patch from Alejandro Cuervo X-Git-Tag: debian-0.6-2~4 X-Git-Url: http://git.kpe.io/?p=cl-modlisp.git;a=commitdiff_plain;h=bba0c14661b34e447456e397fc98fefebec5c4f8 r8022: patch from Alejandro Cuervo --- diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..2bf1627 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,5 @@ +2003-10-21 Kevin Rosenberg + * utils.lisp: Incorporate improvements from Alejandro Forero + Cuervo's contributed patch. + + diff --git a/debian/changelog b/debian/changelog index 8f5857f..5f680b9 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +cl-modlisp (0.6-1) unstable; urgency=low + + * New upstream, add upstream changelog + + -- Kevin M. Rosenberg Tue, 21 Oct 2003 18:43:05 -0600 + cl-modlisp (0.5.1-1) unstable; urgency=low * Don't export non-existent symbol (closes:215173) diff --git a/debian/rules b/debian/rules index 8295e7e..54888ce 100755 --- a/debian/rules +++ b/debian/rules @@ -63,7 +63,7 @@ binary-arch: build install # dh_installman # dh_installinfo # dh_undocumented - dh_installchangelogs + dh_installchangelogs ChangeLog dh_strip dh_compress dh_fixperms diff --git a/utils.lisp b/utils.lisp index 9caf7d0..2f3a213 100644 --- a/utils.lisp +++ b/utils.lisp @@ -12,81 +12,53 @@ (in-package #:modlisp) -(defun format-string (fmt) - (case fmt - (:html "text/html") - (:xml "text/xml") - (:text "text/plain") - (otherwise fmt))) - +(defun format-string (fmt headers) + `(("Content-Type" . + ,(case fmt + (:html "text/html") + (:xml "text/xml") + (:text "text/plain") + (otherwise fmt))) + . ,headers)) + +(defmacro write-response ((&key headers len (status "200 OK")) &body body) + (let ((result (gensym "RES-"))) + `(progn + (write-header-line "Status" ,status) + (dolist (hdr ,headers) + (write-header-line (car hdr) (cdr hdr))) + ,@(and len + `((write-header-line "Content-Length" ,len) + (write-header-line "Keep-Socket" "1") + (write-header-line "Connection" "Keep-Alive"))) + (write-string "end" *modlisp-socket*) + (write-char #\NewLine *modlisp-socket*) + (let ((,result (progn ,@body))) + (,(if len 'force-output 'finish-output) *modlisp-socket*) + (setq *close-modlisp-socket* ,(not len)) + ,result)))) + (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 ,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*)) - (setq ,outstr - (with-output-to-string (,stream) - (let ((*modlisp-socket* (if ,precomp - ,stream - *modlisp-socket*))) - (setq ,result (progn ,@body))))) - (cond - (,precomp - (write-header-line "Content-Length" - (write-to-string (length ,outstr))) - (write-header-line "Keep-Socket" "1") - (write-header-line "Connection" "Keep-Alive") - (write-string "end" *modlisp-socket*) - (write-char #\NewLine *modlisp-socket*) - (write-string ,outstr *modlisp-socket*) - (finish-output *modlisp-socket*) - (setq *close-modlisp-socket* nil)) - (t - (finish-output *modlisp-socket*) - (setq *close-modlisp-socket* t))) - ,result))) + (if precompute + `(output-ml-page ,format (with-output-to-string (*modlisp-socket*) ,@body) :headers ,headers) + `(write-response (:headers (format-string ,format ,headers)) ,@body))) (defun redirect-to-location (url) - (write-header-line "Status" "307 Temporary Redirect") - (write-header-line "Location" url) - ;;(write-header-line "Keep-Socket" "1") - ;;(write-header-line "Connection" "Keep-Alive") - (write-string "end" *modlisp-socket*) - (write-char #\NewLine *modlisp-socket*) - (force-output *modlisp-socket*) - (setq *close-modlisp-socket* t)) + (write-response (:status "307 Temporary Redirect" :headers `(("Location" . ,url))))) -(defun output-ml-page (format html) - (write-header-line "Status" "200 OK") - (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 "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)) +(defmacro output-ml-page (format html &key headers) + (let ((str (gensym "STR-"))) + `(let ((,str ,html)) + (write-response (:len (format nil "~d" (length ,str)) + :headers (format-string ,format ,headers)) + (write-string ,str *modlisp-socket*))))) -(defun output-html-page (str) - (output-ml-page :html str)) +(defun output-html-page (str &key headers) + (output-ml-page :html str :headers headers)) -(defun output-xml-page (str) - (output-ml-page :xml str)) +(defun output-xml-page (str &key headers) + (output-ml-page :xml str :headers headers)) ;; Utility functions for library users @@ -106,5 +78,3 @@ (kmrcl:decode-uri-query-string val)) alist)) (cmsg-c :debug "Invalid number of #\= in ~S" name-val-list))))))) - -