From fa641fe08adb5cede535a6dd79a79047c78ecf8a Mon Sep 17 00:00:00 2001 From: "Kevin M. Rosenberg" Date: Thu, 10 Jul 2003 18:58:29 +0000 Subject: [PATCH] r5268: *** empty log message *** --- README | 36 +++++++++++++++++++++--- base.lisp | 71 ++++++++++++++++++++---------------------------- debian/changelog | 2 +- demo.lisp | 26 +++++++++--------- package.lisp | 10 +++---- utils.lisp | 51 +++++++++++++++++----------------- variables.lisp | 19 ++++++++----- 7 files changed, 117 insertions(+), 98 deletions(-) diff --git a/README b/README index 439c8a1..10fb398 100644 --- a/README +++ b/README @@ -1,5 +1,6 @@ INTRODUCTION ------------ + This package provided the Lisp side of the interface to Marc Battyani's mod_lisp apache module (http://www.fractalconcept.com). @@ -14,21 +15,48 @@ REREQUISITES 1. Apache 1.3.x 2. mod_lisp apache module (http://www.fractalconcept.com) -3. cl-kmrcl library (http://files.b9.com/kmrcl) -4. asdf +3. kmrcl library (http://files.b9.com/kmrcl) +4. asdf (http://www.sf.net/projects/cclan) + + +SUPPORTED PLATFORMS +------------------- + Allegro v6.2 + Lispworks v4.2 + SBCL 0.8.1 with sb-thread (multitasking) + CMUCL 18e + QUICKSTART ---------- -1. Install mod_lisp as described on the mod_lisp web site +1. The easiest way to install is to use the Debian GNU/Linux operating +system. Using the testing or unstable distributions, you can give the +command: + apt-get install libapache-mod-lisp cl-modlisp cl-kmrcl + +If you are not using Debian, you will need to download and install +mod_lisp, cl-modlisp, and cl-kmrcl manually. + 2. Add something like the below to httpd.conf and then restart apache LispServer 127.0.0.1 20123 "localhost" AddHandler lisp-handler .lsp -3. Load cl-modlisp and cl-kmrcl + +3. Start your Lisp implementation and load cl-modlisp with + (asdf:operate 'asdf:load-op 'modlisp) + 4. Start the server with (ml:modlisp-start :port 20123)) + 5. Try some demostration pages lynx http://localhost/fixed.lsp lynx http://localhost/debug.lsp + 6. Shutdown the all cl-modlisp servers with (ml:modlisp-stop-all) + + +USAGE +----- + +Return to the demo.lisp file for some examples of using cl-modlisp. diff --git a/base.lisp b/base.lisp index 724aef2..b50a088 100644 --- a/base.lisp +++ b/base.lisp @@ -7,18 +7,18 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Dec 2002 ;;;; -;;;; $Id: base.lisp,v 1.9 2003/07/09 19:19:19 kevin Exp $ +;;;; $Id: base.lisp,v 1.10 2003/07/10 18:58:29 kevin Exp $ ;;;; ************************************************************************* (in-package #:modlisp) -(defun modlisp-start (&key (port +default-apache-port+) - (processor 'demo-apache-command-processor) +(defun modlisp-start (&key (port +default-modlisp-port+) + (processor 'demo-modlisp-command-processor) (processor-args nil) (catch-errors t)) (let ((listener (make-instance 'listener :port port :base-name "modlisp" - :function 'apache-command-issuer + :function 'modlisp-command-issuer :function-args (cons processor processor-args) :format :text :wait nil @@ -32,70 +32,57 @@ (defun modlisp-stop-all () (stop-all/listener)) +;; Internal functions -(let ((*number-server-requests* 0) - (*number-worker-requests* 0) - (*close-apache-socket* t)) - - (defun apache-command-issuer (*apache-socket* processor &rest args) - "generates commands from apache, issues commands to processor-fun" - (unwind-protect - (progn - (setq *number-worker-requests* 0) - (do ((command (read-apache-command) (read-apache-command))) +(defun modlisp-command-issuer (*modlisp-socket* processor &rest args) + "generates commands from modlisp, issues commands to processor-fun" + (unwind-protect + (progn + (let ((*number-worker-requests* 0) + (*close-modlisp-socket* t)) + (do ((command (read-modlisp-command) (read-modlisp-command))) ((null command)) (apply processor command args) - (force-output *apache-socket*) + (force-output *modlisp-socket*) (incf *number-worker-requests*) (incf *number-server-requests*) - (when *close-apache-socket* - (return)))) - (close-active-socket *apache-socket*))) - - - (defun get-number-worker-requests () - *number-worker-requests*) - - (defun get-number-server-requests () - *number-server-requests*) - - (defun set-close-apache-socket (close?) - (setq *close-apache-socket* close?)) + (when *close-modlisp-socket* + (return))))) + (close-active-socket *modlisp-socket*))) - ) ;; closure - (defun header-value (header key) + "Returns the value of a modlisp header" (cdr (assoc key header :test #'string=))) -(defun read-apache-command () +(defun read-modlisp-command () (ignore-errors - (let* ((header (read-apache-header)) + (let* ((header (read-modlisp-header)) (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 *apache-socket*) + (read-sequence content *modlisp-socket*) (push (cons "posted-content" content) header)) header))) -(defun read-apache-line () +(defun read-modlisp-line () (kmrcl:string-right-trim-one-char #\return - (read-line *apache-socket* nil nil))) + (read-line *modlisp-socket* nil nil))) -(defun read-apache-header () - (loop for key = (read-apache-line) +(defun read-modlisp-header () + (loop for key = (read-modlisp-line) while (and key (string-not-equal key "end") (> (length key) 1)) - for value = (read-apache-line) + for value = (read-modlisp-line) collect (cons key value))) (defun write-header-line (key value) - (write-string key *apache-socket*) - (write-char #\NewLine *apache-socket*) - (write-string value *apache-socket*) - (write-char #\NewLine *apache-socket*)) + (write-string key *modlisp-socket*) + (write-char #\NewLine *modlisp-socket*) + (write-string value *modlisp-socket*) + (write-char #\NewLine *modlisp-socket*)) diff --git a/debian/changelog b/debian/changelog index 20f88b8..71e2159 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,7 +2,7 @@ cl-modlisp (0.3-1) unstable; urgency=low * New version - -- Kevin M. Rosenberg Tue, 8 Jul 2003 07:45:08 -0600 + -- Kevin M. Rosenberg Thu, 10 Jul 2003 12:52:34 -0600 cl-modlisp (0.2-1) unstable; urgency=low diff --git a/demo.lisp b/demo.lisp index c9e7e0f..cbe5fa6 100644 --- a/demo.lisp +++ b/demo.lisp @@ -7,14 +7,14 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Dec 2002 ;;;; -;;;; $Id: demo.lisp,v 1.2 2003/07/08 06:40:00 kevin Exp $ +;;;; $Id: demo.lisp,v 1.3 2003/07/10 18:58:29 kevin Exp $ ;;;; ************************************************************************* (in-package #:modlisp) -(defun demo-apache-command-processor (command) - "Sample function to process an apache command" +(defun demo-modlisp-command-processor (command) + "Sample function to process an modlisp command" (let ((url (header-value command "url"))) (cond ((equal url "/fixed.lsp") @@ -30,14 +30,14 @@ (write-string " -

mod_lisp debug page

" *apache-socket*) - (write-request-counts *apache-socket*) +

mod_lisp debug page

" *modlisp-socket*) + (write-request-counts *modlisp-socket*) (write-string " -" *apache-socket*) +" *modlisp-socket*) (loop for (key . value) in command do - (format *apache-socket* "" key value)) - (write-string "
KeyValue
~a~a
" *apache-socket*)) + (format *modlisp-socket* "~a~a" key value)) + (write-string "" *modlisp-socket*)) (defun fixed-html-string () @@ -53,15 +53,15 @@ (write-string "

mod_lisp precomputed page

-

This is a precomputed string sent by mod_lisp

" *apache-socket*) - (write-request-counts *apache-socket*) - (write-string "" *apache-socket*)) +

This is a precomputed string sent by mod_lisp

" *modlisp-socket*) + (write-request-counts *modlisp-socket*) + (write-string "" *modlisp-socket*)) (defun write-request-counts (s) (format s "

Number of server requests: ~D

" - (get-number-server-requests)) + *number-server-requests*) (format s "

Number of worker requests for this socket: ~D

" - (get-number-worker-requests))) + *number-worker-requests*)) diff --git a/package.lisp b/package.lisp index d495556..3be1976 100644 --- a/package.lisp +++ b/package.lisp @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Dec 2002 ;;;; -;;;; $Id: package.lisp,v 1.3 2003/07/08 06:40:00 kevin Exp $ +;;;; $Id: package.lisp,v 1.4 2003/07/10 18:58:29 kevin Exp $ ;;;; ************************************************************************* (in-package #:cl-user) @@ -18,7 +18,9 @@ (:export ;; variables.lisp - #:*apache-socket* + #:*modlisp-socket* + #:*number-worker-requests* + #:*number-server-requests* ;; base.lisp #:modlisp-start @@ -26,9 +28,7 @@ #:modlisp-stop-all #:header-value #:write-header-line - #:get-number-worker-requests - #:get-number-server-requests - #:set-close-apache-socket + #:set-close-modlisp-socket ;; utils.lisp #:output-html-page diff --git a/utils.lisp b/utils.lisp index 9964122..fe10081 100644 --- a/utils.lisp +++ b/utils.lisp @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Dec 2002 ;;;; -;;;; $Id: utils.lisp,v 1.4 2003/07/08 08:34:23 kevin Exp $ +;;;; $Id: utils.lisp,v 1.5 2003/07/10 18:58:29 kevin Exp $ ;;;; ************************************************************************* (in-package #:modlisp) @@ -31,13 +31,13 @@ (write-header-line "Status" "200 OK") (write-header-line "Content-Type" (format-string ,fmt)) (unless ,precomp - (write-string "end" *apache-socket*) - (write-char #\NewLine *apache-socket*)) + (write-string "end" *modlisp-socket*) + (write-char #\NewLine *modlisp-socket*)) (setq ,outstr (with-output-to-string (,stream) - (let ((*apache-socket* (if ,precomp + (let ((*modlisp-socket* (if ,precomp ,stream - *apache-socket*))) + *modlisp-socket*))) (setq ,result (progn ,@body))))) (cond (,precomp @@ -46,21 +46,21 @@ (write-header-line "Keep-Socket" "1") (write-header-line "Keep-Alive" "timeout=15, max=99") (write-header-line "Connection" "Keep-Alive") - (write-string "end" *apache-socket*) - (write-char #\NewLine *apache-socket*) - (write-string ,outstr *apache-socket*) - (force-output *apache-socket*) - (set-close-apache-socket nil)) + (write-string "end" *modlisp-socket*) + (write-char #\NewLine *modlisp-socket*) + (write-string ,outstr *modlisp-socket*) + (force-output *modlisp-socket*) + (setq *close-modlisp-socket* nil)) (t - (set-close-apache-socket t) - (finish-output *apache-socket*))) + (setq *close-modlisp-socket* t) + (finish-output *modlisp-socket*))) ,result))) (defun redirect-to-location (url) (write-header-line "Status" "302 Redirect") (write-header-line "Location" url) - (write-char #\NewLine *apache-socket*) - (set-close-apache-socket t)) + (write-char #\NewLine *modlisp-socket*) + (setq *close-modlisp-socket* t)) (defun output-ml-page (format html) (write-header-line "Status" "200 OK") @@ -69,10 +69,10 @@ (write-header-line "Keep-Socket" "1") (write-header-line "Keep-Alive" "timeout=15, max=99") (write-header-line "Connection" "Keep-Alive") - (write-string "end" *apache-socket*) - (write-char #\NewLine *apache-socket*) - (write-string html *apache-socket*) - (set-close-apache-socket nil)) + (write-string "end" *modlisp-socket*) + (write-char #\NewLine *modlisp-socket*) + (write-string html *modlisp-socket*) + (setq *close-modlisp-socket* nil)) (defun output-html-page (str) (output-ml-page :html str)) @@ -80,20 +80,19 @@ (defun output-xml-page (str) (output-ml-page :xml str)) +;; Utility functions for library users + (defun posted-to-alist (posted-string) - "Converts a posted string to an assoc list of variable names and values" + "Converts a posted string to an assoc list of keyword names and values, +\"a=1&bc=demo\" => ((:a . \"1\") (:bc . \"demo\"))" (when posted-string (let ((alist '())) (dolist (name=val (kmrcl:delimited-string-to-list posted-string #\&) (nreverse alist)) (let ((name-val-list (kmrcl:delimited-string-to-list name=val #\=))) - (when (= 2 (length name-val-list)) + (if (= 2 (length name-val-list)) (destructuring-bind (name val) name-val-list (push (cons (kmrcl:ensure-keyword name) (kmrcl:decode-uri-query-string val)) - alist)))))))) - - - - - + alist)) + (cmsg-c :debug "Invalid number of #\= in ~S" name-val-list))))))) diff --git a/variables.lisp b/variables.lisp index a4df081..adee909 100644 --- a/variables.lisp +++ b/variables.lisp @@ -7,20 +7,25 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Dec 2002 ;;;; -;;;; $Id: variables.lisp,v 1.7 2003/07/08 16:12:03 kevin Exp $ +;;;; $Id: variables.lisp,v 1.8 2003/07/10 18:58:29 kevin Exp $ ;;;; ************************************************************************* (in-package #:modlisp) -(defconstant +default-apache-port+ 20123 +(defconstant +default-modlisp-port+ 20123 "Default port for listen") -(defvar *apache-socket* nil - "the socket stream to apache") +(defvar *modlisp-socket* nil + "the socket stream to modlisp") -(defvar *number-server-requests* 0) -(defvar *number-worker-requests* 0) -(defvar *close-apache-socket* t) +(defvar *number-server-requests* 0 + "number of requests for the server") + +(defvar *number-worker-requests* 0 + "number of requests for this worker process") + +(defvar *close-modlisp-socket* t + "whether to close the modlisp socket at the end of this request") -- 2.34.1