r5318: *** empty log message ***
authorKevin M. Rosenberg <kevin@rosenberg.net>
Wed, 16 Jul 2003 20:40:43 +0000 (20:40 +0000)
committerKevin M. Rosenberg <kevin@rosenberg.net>
Wed, 16 Jul 2003 20:40:43 +0000 (20:40 +0000)
base.lisp
demo.lisp
package.lisp
utils.lisp
variables.lisp

index 4ae7c6d5009c97cbc912d208e639f6fa5bd400a0..ebb2ece37c8932ef451c4a0d204444babd126e6c 100644 (file)
--- a/base.lisp
+++ b/base.lisp
@@ -7,48 +7,58 @@
 ;;;; Programmer:    Kevin M. Rosenberg
 ;;;; Date Started:  Dec 2002
 ;;;;
-;;;; $Id: base.lisp,v 1.12 2003/07/11 07:00:57 kevin Exp $
+;;;; $Id: base.lisp,v 1.13 2003/07/16 20:40:43 kevin Exp $
 ;;;; *************************************************************************
 
 (in-package #:modlisp)
 
 (defun modlisp-start (&key (port +default-modlisp-port+)
-                     (processor 'demo-modlisp-command-processor)
-                     (processor-args nil)
-                     (catch-errors t)
-                     timeout
-                     number-fixed-workers
-                     remote-host-checker)
-  (let ((listener (make-instance 'listener :port port
-                                :base-name "modlisp"                    
-                                :function 'modlisp-command-issuer
-                                :function-args (cons processor processor-args)
-                                :format :text
-                                :wait nil
-                                :catch-errors catch-errors
-                                :timeout timeout
-                                :number-fixed-workers number-fixed-workers
-                                :remote-host-checker remote-host-checker)))
-    (init/listener listener :start)))
+                          (processor 'demo-modlisp-command-processor)
+                          (processor-args nil)
+                          (catch-errors t)
+                          timeout
+                          number-fixed-workers
+                          remote-host-checker)
+  (let* ((server (make-instance 'ml-server
+                  :processor processor
+                  :processor-args processor-args
+                  :port port))
+        (listener (make-instance 'listener :port port
+                                 :base-name "modlisp"                   
+                                 :function 'modlisp-command-issuer
+                                 :function-args (list server)
+                                 :format :text
+                                 :wait nil
+                                 :catch-errors catch-errors
+                                 :timeout timeout
+                                 :number-fixed-workers number-fixed-workers
+                                 :remote-host-checker remote-host-checker)))
+    (setf (listener server) listener)
+    (init/listener listener :start)
+    (setf *ml-server* server)
+    server))
 
 
-(defun modlisp-stop (listener)
-  (init/listener listener :stop))
+(defun modlisp-stop (server)
+  (init/listener (listener server) :stop)
+  (setf (listener server) nil)
+  server)
 
 (defun modlisp-stop-all ()
   (stop-all/listener))
 
 ;; Internal functions
 
-(defun modlisp-command-issuer (*modlisp-socket* processor &rest args)
+(defun modlisp-command-issuer (*modlisp-socket* server)
   "generates commands from modlisp, issues commands to processor-fun"
   (unwind-protect
        (progn
         (let ((*number-worker-requests* 0)
-              (*close-modlisp-socket* t))
+              (*close-modlisp-socket* t)
+              (*ml-server* server))
           (do ((command (read-modlisp-command) (read-modlisp-command)))
               ((null command))
-            (apply processor command args)
+            (apply (processor server) command (processor-args server))
             (finish-output *modlisp-socket*)
             (incf *number-worker-requests*)
             (incf *number-server-requests*)
   
 (defun header-value (header key)
   "Returns the value of a modlisp header"
-  (cdr (assoc key header :test #'string=)))
+  (cdr (assoc key header :test #'eq)))
 
 (defun read-modlisp-command ()
   (ignore-errors
     (let* ((header (read-modlisp-header))
-          (content-length (header-value header "content-length"))
+          (content-length (header-value header :content-length))
           (content (when content-length 
                      (make-string
                       (parse-integer content-length :junk-allowed t)))))
-     (when content
-       (read-sequence content *modlisp-socket*)
-       (push (cons "posted-content" content) header))
-     header)))
+         (when content
+           (read-sequence content *modlisp-socket*)
+           (push (cons :posted-content content) header))
+         header)))
+
 
 (defun read-modlisp-line ()
   (kmrcl:string-right-trim-one-char
    #\return
-   (read-line *modlisp-socket* nil nil)))
+   (read-line *modlisp-socket* nil nil)))      
+
 
 (defun read-modlisp-header ()
   (loop for key = (read-modlisp-line)
                 (string-not-equal key "end")
                 (> (length key) 1))
       for value = (read-modlisp-line)
-      collect (cons key value)))
+      collect (cons (ensure-keyword key) value)))
 
 (defun write-header-line (key value)
-  (write-string key *modlisp-socket*)
+  (write-string (string key) *modlisp-socket*)
   (write-char #\NewLine *modlisp-socket*)
   (write-string value *modlisp-socket*)
   (write-char #\NewLine *modlisp-socket*))
index cbe5fa61d78dc54fa531aac1aefb6700557db7ba..d247b547a7405aa8c5bf4f68a21701a9c8172c9b 100644 (file)
--- a/demo.lisp
+++ b/demo.lisp
@@ -7,7 +7,7 @@
 ;;;; Programmer:    Kevin M. Rosenberg
 ;;;; Date Started:  Dec 2002
 ;;;;
-;;;; $Id: demo.lisp,v 1.3 2003/07/10 18:58:29 kevin Exp $
+;;;; $Id: demo.lisp,v 1.4 2003/07/16 20:40:43 kevin Exp $
 ;;;; *************************************************************************
 
 (in-package #:modlisp)
@@ -15,7 +15,7 @@
 
 (defun demo-modlisp-command-processor (command)
   "Sample function to process an modlisp command"
-  (let ((url (header-value command "url")))
+  (let ((url (header-value command :url)))
     (cond
       ((equal url "/fixed.lsp")
        (output-html-page (fixed-html-string)))
index e97488933e9af824ba367887a4eb5fb1bb37982e..79c39c1780f2dc3ce0941e993417f06c4f1e107a 100644 (file)
@@ -7,7 +7,7 @@
 ;;;; Programmer:    Kevin M. Rosenberg
 ;;;; Date Started:  Dec 2002
 ;;;;
-;;;; $Id: package.lisp,v 1.5 2003/07/11 18:02:41 kevin Exp $
+;;;; $Id: package.lisp,v 1.6 2003/07/16 20:40:43 kevin Exp $
 ;;;; *************************************************************************
 
 (in-package #:cl-user)
@@ -21,7 +21,8 @@
    #:*modlisp-socket*
    #:*number-worker-requests*
    #:*number-server-requests*
-
+   #:*ml-server*
+   
    ;; base.lisp
    #:modlisp-start
    #:modlisp-stop
@@ -35,7 +36,7 @@
    #:output-html-page
    #:output-xml-page
    #:with-ml-page
-   #:posted-to-alist
+   #:query-to-alist
    #:redirect-to-location
    ))
 
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
index adee9093a2a42536221b55ab85f4ee44109a5725..6d8d3034228b5e49f141e73175dda61bdab25244 100644 (file)
@@ -7,7 +7,7 @@
 ;;;; Programmer:    Kevin M. Rosenberg
 ;;;; Date Started:  Dec 2002
 ;;;;
-;;;; $Id: variables.lisp,v 1.8 2003/07/10 18:58:29 kevin Exp $
+;;;; $Id: variables.lisp,v 1.9 2003/07/16 20:40:43 kevin Exp $
 ;;;; *************************************************************************
 
 (in-package #:modlisp)
   "whether to close the modlisp socket at the end of this request")
 
 
+(defvar *ml-server* nil "Current ml-server instance")
 
+(defclass ml-server ()
+  ((listener :initarg :listener :initform nil :accessor listener)
+   (port :initarg :port :initform nil :accessor port)
+   (processor :initarg :processor :initform nil :accessor processor)
+   (processor-args :initarg :processor-args :initform nil
+                  :accessor processor-args)))
+   
+