r5514: *** empty log message ***
[cl-modlisp.git] / base.lisp
1 ;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10; Package: modlisp -*-
2 ;;;; *************************************************************************
3 ;;;; FILE IDENTIFICATION
4 ;;;;
5 ;;;; Name:          base.lisp
6 ;;;; Purpose:       Utility functions for modlisp package
7 ;;;; Programmer:    Kevin M. Rosenberg
8 ;;;; Date Started:  Dec 2002
9 ;;;;
10 ;;;; $Id: base.lisp,v 1.14 2003/08/18 05:48:55 kevin Exp $
11 ;;;; *************************************************************************
12
13 (in-package #:modlisp)
14
15 (defun modlisp-start (&key (port +default-modlisp-port+)
16                            (processor 'demo-modlisp-command-processor)
17                            (processor-args nil)
18                            (catch-errors t)
19                            timeout
20                            number-fixed-workers
21                            remote-host-checker)
22   (let* ((server (make-instance 'ml-server
23                    :processor processor
24                    :processor-args processor-args
25                    :port port))
26          (listener (make-instance 'listener :port port
27                                   :base-name "modlisp"                   
28                                   :function 'modlisp-command-issuer
29                                   :function-args (list server)
30                                   :format :text
31                                   :wait nil
32                                   :catch-errors catch-errors
33                                   :timeout timeout
34                                   :number-fixed-workers number-fixed-workers
35                                   :remote-host-checker remote-host-checker)))
36     (setf (listener server) listener)
37     (init/listener listener :start)
38     (setf *ml-server* server)
39     server))
40
41
42 (defun modlisp-stop (server)
43   (init/listener (listener server) :stop)
44   (setf (listener server) nil)
45   server)
46
47 (defun modlisp-stop-all ()
48   (stop-all/listener))
49
50 ;; Internal functions
51
52 (defun modlisp-command-issuer (*modlisp-socket* server)
53   "generates commands from modlisp, issues commands to processor-fun"
54   (unwind-protect
55        (progn
56          (let ((*number-worker-requests* 0)
57                (*close-modlisp-socket* t)
58                (*ml-server* server))
59            (do ((command (read-modlisp-command) (read-modlisp-command)))
60                ((null command))
61              (apply (processor server) command (processor-args server))
62              (finish-output *modlisp-socket*)
63              (incf *number-worker-requests*)
64              (incf *number-server-requests*)
65              (when *close-modlisp-socket*
66                (return)))))
67     (close-active-socket *modlisp-socket*)))
68   
69 (defun header-value (header key)
70   "Returns the value of a modlisp header"
71   (cdr (assoc key header :test #'eq)))
72
73 (defun read-modlisp-command ()
74   (ignore-errors
75     (let* ((header (read-modlisp-header))
76            (content-length (header-value header :content-length))
77            (content (when content-length 
78                       (make-string
79                        (parse-integer content-length :junk-allowed t)))))
80           (when content
81             (read-sequence content *modlisp-socket*)
82             (push (cons :posted-content content) header))
83           header)))
84
85
86 (defun read-modlisp-line ()
87   (kmrcl:string-right-trim-one-char
88    #\return
89    (read-line *modlisp-socket* nil nil)))      
90
91
92 (defun read-modlisp-header ()
93   (loop for key = (read-modlisp-line)
94       while (and key (string-not-equal key "end"))
95       for value = (read-modlisp-line)
96       collect (cons (ensure-keyword key) value)))
97
98 (defun write-header-line (key value)
99   (write-string (string key) *modlisp-socket*)
100   (write-char #\NewLine *modlisp-socket*)
101   (write-string value *modlisp-socket*)
102   (write-char #\NewLine *modlisp-socket*))
103
104