r8022: patch from Alejandro Cuervo
authorKevin M. Rosenberg <kevin@rosenberg.net>
Wed, 22 Oct 2003 00:43:53 +0000 (00:43 +0000)
committerKevin M. Rosenberg <kevin@rosenberg.net>
Wed, 22 Oct 2003 00:43:53 +0000 (00:43 +0000)
ChangeLog [new file with mode: 0644]
debian/changelog
debian/rules
utils.lisp

diff --git a/ChangeLog b/ChangeLog
new file mode 100644 (file)
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.
+       
+       
index 8f5857f027a8741fee709699f30946a15d3d3979..5f680b979ed9ad9a4c49ad5d5d6bcd7235c151b5 100644 (file)
@@ -1,3 +1,9 @@
+cl-modlisp (0.6-1) unstable; urgency=low
+
+  * New upstream, add upstream changelog
+
+ -- Kevin M. Rosenberg <kmr@debian.org>  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)
index 8295e7e12445e48caa1c7329def1c677d5454f3f..54888cee0ebe4295b89850dfd2873663a8af57a3 100755 (executable)
@@ -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
index 9caf7d0b72cc722bbe955981f119b8f7d33b1375..2f3a2139186f2398291f568f01d12a34f3141731 100644 (file)
 
 (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
 
                          (kmrcl:decode-uri-query-string val))
                    alist))
            (cmsg-c :debug "Invalid number of #\= in ~S" name-val-list)))))))
-
-