r5259: *** 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.8 2003/07/08 16:12:03 kevin Exp $
11 ;;;; *************************************************************************
12
13 (in-package #:modlisp)
14
15 (defun modlisp-start (&key (port +default-apache-port+)
16                            (processor 'demo-apache-command-processor)
17                            (processor-args nil)
18                            (catch-errors t))
19   (let ((listener (make-instance 'listener :port port
20                                  :base-name "modlisp"                    
21                                  :function 'apache-command-issuer
22                                  :function-args (cons processor processor-args)
23                                  :format :text
24                                  :wait nil
25                                  :catch-errors catch-errors)))
26     (init/listener listener :start)))
27
28
29 (defun modlisp-stop (listener)
30   (init/listener listener :stop))
31
32 (defun modlisp-stop-all ()
33   (stop-all/listener))
34
35
36 (let ((*number-server-requests* 0)
37       (*number-worker-requests* 0)
38       (*close-apache-socket* t))
39   
40   (defun apache-command-issuer (*apache-socket* processor &rest args)
41     "generates commands from apache, issues commands to processor-fun"
42     (unwind-protect
43          (progn
44            (setq *number-worker-requests* 0)
45            (do ((command (read-apache-command) (read-apache-command)))
46                ((null command))
47              (apply processor command args)
48              (force-output *apache-socket*)
49              (incf *number-worker-requests*)
50              (incf *number-server-requests*)
51              (when *close-apache-socket*
52                (return))))
53       (close-active-socket *apache-socket*)))
54   
55
56   (defun get-number-worker-requests ()
57     *number-worker-requests*)
58
59   (defun get-number-server-requests ()
60     *number-server-requests*)
61   
62   (defun set-close-apache-socket (close?)
63     (setq *close-apache-socket* close?))
64   
65   ) ;; closure
66
67 (defun header-value (header key)
68   (cdr (assoc key header :test #'string=)))
69
70 (defun read-apache-command ()
71   (ignore-errors
72     (let* ((header (read-apache-header))
73            (content-length (header-value header "content-length"))
74            (content (when content-length 
75                       (make-string
76                        (parse-integer content-length :junk-allowed t)))))
77      (when content
78        (read-sequence content *apache-socket*)
79        (push (cons "posted-content" content) header))
80      header)))
81
82 (defun read-apache-line ()
83   (kmrcl:string-left-trim-one-char  #\return
84                                     (read-line *apache-socket* nil nil)))
85
86 (defun read-apache-header ()
87   (loop for key = (read-apache-line)
88       while (and key
89                  (string-not-equal key "end")
90                  (> (length key) 1))
91       for value = (read-apache-line)
92       collect (cons key value)))
93
94 (defun write-header-line (key value)
95   (write-string key *apache-socket*)
96   (write-char #\NewLine *apache-socket*)
97   (write-string value *apache-socket*)
98   (write-char #\NewLine *apache-socket*))
99
100