From f63edd12886a0ed33be55f49c3284acca5db4797 Mon Sep 17 00:00:00 2001 From: "Kevin M. Rosenberg" Date: Wed, 16 Jul 2003 20:40:43 +0000 Subject: [PATCH] r5318: *** empty log message *** --- base.lisp | 76 +++++++++++++++++++++++++++++--------------------- demo.lisp | 4 +-- package.lisp | 7 +++-- utils.lisp | 32 ++++++++++++--------- variables.lisp | 11 +++++++- 5 files changed, 79 insertions(+), 51 deletions(-) diff --git a/base.lisp b/base.lisp index 4ae7c6d..ebb2ece 100644 --- 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*) @@ -58,24 +68,26 @@ (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) @@ -83,10 +95,10 @@ (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*)) diff --git a/demo.lisp b/demo.lisp index cbe5fa6..d247b54 100644 --- 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))) diff --git a/package.lisp b/package.lisp index e974889..79c39c1 100644 --- a/package.lisp +++ b/package.lisp @@ -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 )) diff --git a/utils.lisp b/utils.lisp index 387fa73..97f6f76 100644 --- a/utils.lisp +++ b/utils.lisp @@ -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) @@ -19,17 +19,22 @@ (: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*) @@ -52,14 +56,16 @@ (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) @@ -67,11 +73,11 @@ (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 diff --git a/variables.lisp b/variables.lisp index adee909..6d8d303 100644 --- a/variables.lisp +++ b/variables.lisp @@ -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) @@ -28,6 +28,15 @@ "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))) + + -- 2.34.1