[bknr-cvs] hans changed trunk/thirdparty/hunchentoot/
BKNR Commits
bknr at bknr.net
Mon Nov 30 13:24:18 UTC 2009
Revision: 4477
Author: hans
URL: http://bknr.net/trac/changeset/4477
New API for extending request processing without interferring with
Hunchentoot's internal variable binding, provided by Frode V. Fjeld.
U trunk/thirdparty/hunchentoot/doc/index.xml
U trunk/thirdparty/hunchentoot/packages.lisp
U trunk/thirdparty/hunchentoot/request.lisp
Modified: trunk/thirdparty/hunchentoot/doc/index.xml
===================================================================
--- trunk/thirdparty/hunchentoot/doc/index.xml 2009-11-25 17:03:40 UTC (rev 4476)
+++ trunk/thirdparty/hunchentoot/doc/index.xml 2009-11-30 13:24:17 UTC (rev 4477)
@@ -1594,17 +1594,33 @@
</clix:returns>
<clix:description>
This function is called by <clix:ref>PROCESS-CONNECTION</clix:ref>
-after the incoming headers have been read. It selects and calls a
-<a href="#handlers">handler</a> and sends the output of this handler
-to the client. It also sets up simple error handling for the request
-handler. Note that <clix:ref>PROCESS-CONNECTION</clix:ref> is called
-once per connection and loops in case of a persistent connection
+after the incoming headers have been read. It
+calls <clix:ref>DISPATCH-REQUEST</clix:ref> and sends its output to
+the client. It also sets up simple error handling for the request
+handler.
+<p>
+The return value of this function is ignored.
+</p>
+ </clix:description>
+ </clix:function>
+
+ <clix:function generic='true' name='dispatch-request'>
+ <clix:lambda-list>request
+ </clix:lambda-list>
+ <clix:returns>nil
+ </clix:returns>
+ <clix:description>
+This function is called by <clix:ref>PROCESS-REQUEST</clix:ref>. It
+selects and calls a
+<a href="#handlers">handler</a> to process the request.
+<p>
+This might be a good place to introduce around methods which bind
+special variables or do other interesting things that are relevant to
+the particular request. Note
+that <clix:ref>DISPATCH-REQUEST</clix:ref> is called once per
+connection and loops in case of a persistent connection,
while <clix:ref>PROCESS-REQUEST</clix:ref> is called anew for each
request.
-<p>
-Like <clix:ref>PROCESS-CONNECTION</clix:ref>, this might be a good
-place to introduce around methods which bind special variables or do
-other interesting things.
</p>
<p>
The return value of this function is ignored.
Modified: trunk/thirdparty/hunchentoot/packages.lisp
===================================================================
--- trunk/thirdparty/hunchentoot/packages.lisp 2009-11-25 17:03:40 UTC (rev 4476)
+++ trunk/thirdparty/hunchentoot/packages.lisp 2009-11-30 13:24:17 UTC (rev 4477)
@@ -168,6 +168,7 @@
"DELETE-AUX-REQUEST-VALUE"
"DELETE-SESSION-VALUE"
"DISPATCH-EASY-HANDLERS"
+ "DISPATCH-REQUEST"
"ESCAPE-FOR-HTML"
"EXECUTE-ACCEPTOR"
"GET-PARAMETER"
Modified: trunk/thirdparty/hunchentoot/request.lisp
===================================================================
--- trunk/thirdparty/hunchentoot/request.lisp 2009-11-25 17:03:40 UTC (rev 4476)
+++ trunk/thirdparty/hunchentoot/request.lisp 2009-11-30 13:24:17 UTC (rev 4477)
@@ -95,21 +95,22 @@
can subclass REQUEST in order to implement your own behaviour. See
the REQUEST-CLASS slot of the ACCEPTOR class."))
+(defgeneric dispatch-request (request)
+ (:documentation "This function is called by PROCESS-REQUEST. It
+selects and calls a handler to process the request.
+
+This might be a good place to introduce around methods which bind
+special variables or do other interesting things that are relevant to
+the particular request. Note that DISPATCH-REQUEST is called once per
+connection and loops in case of a persistent connection, while
+PROCESS-REQUEST is called anew for each request."))
+
(defgeneric process-request (request)
(:documentation "This function is called by PROCESS-CONNECTION after
-the incoming headers have been read. It selects and calls a handler
-and sends the output of this handler to the client using START-OUTPUT.
-It also sets up simple error handling for the request handler. Note
-that PROCESS-CONNECTION is called once per connection and loops in
-case of a persistent connection while PROCESS-REQUEST is called anew
-for each request.
+the incoming headers have been read. It calls DISPATCH-REQUEST and
+sends its output to the client. It also sets up simple error handling
+for the request handler."))
-Like PROCESS-CONNECTION, this might be a good place to introduce
-around methods which bind special variables or do other interesting
-things.
-
-The return value of this function is ignored."))
-
(defun convert-hack (string external-format)
"The rfc2388 package is buggy in that it operates on a character
stream and thus only accepts encodings which are 8 bit transparent.
@@ -210,6 +211,12 @@
;; we assume it's not our fault...
(setf (return-code*) +http-bad-request+)))))
+(defmethod dispatch-request (request)
+ "Standard implementation of dispatching a request to the appropriate
+handler."
+ (funcall (acceptor-request-dispatcher *acceptor*)
+ request))
+
(defmethod process-request (request)
"Standard implementation for processing a request. You should not
change or replace this functionality unless you know what you're
@@ -227,7 +234,7 @@
;; skip dispatch if bad request
(when (eql (return-code *reply*) +http-ok+)
;; now do the work
- (funcall (acceptor-request-dispatcher *acceptor*) *request*)))))
+ (dispatch-request request)))))
(when error
(setf (return-code *reply*)
+http-internal-server-error+))
More information about the Bknr-cvs
mailing list