Modified the selection of request and response classes to take into

account the server we are servicing, so that each server only sees
and creates request/response classes he knows he can handle.  This
also makes it possible to add request/response classes in a running
system, and to run servers of different versions side-by-side in an
image without affecting each other...
This commit is contained in:
1999-09-19 12:55:29 +00:00
parent 23eb318329
commit d9cf8a6965
3 changed files with 25 additions and 10 deletions

View File

@ -75,10 +75,11 @@ request object, which references the given server."))
(defmethod parse-request (server stream)
(multiple-value-bind (method url version)
(parse-request-line stream)
(let ((request (make-instance (get-request-class version)
:server server
:method method
:url url)))
(let ((request (make-instance
(get-request-class-using-server server version)
:server server
:method method
:url url)))
(parse-request-remainder request stream)
request)))

View File

@ -34,6 +34,11 @@ generic function handle-server-error to handle server errors."))
(setf (connection-state connection) :processing-request))
(:documentation "Read a request from the connection."))
(defgeneric get-request-class-using-server (server version)
(:documentation
"Based on the version given, return the appropriate class for the
request."))
(defgeneric serve-request (server request)
(:documentation
"Let the server handle the request, creating a valid response
@ -46,6 +51,13 @@ request, using the detailed information provided by the resource, via
CREATE-RESPONSE. A server must implement apropriate methods for this
generic function, to ensure conformant generation of response messages."))
(defgeneric get-response-class-using-server (server request)
(:documentation
"Return the class to be used in creating the response object based
on the server and the class of the request object passed. This shall
be used by `create-response-using-server' to determine the class to be
passed to `make-instance'."))
(defgeneric write-response (server connection response)
(:method :before (server connection response)
(declare (ignorable server response))
@ -88,6 +100,9 @@ connection."))
(defmethod read-request ((server http-server/0.9) connection)
(parse-request server (connection-stream connection)))
(defmethod get-request-class-using-server ((server http-server/0.9) version)
(get-request-class nil))
(defmethod serve-request ((server http-server/0.9) request)
(let ((resource (namespace-lookup-url (http-server-namespace server)
(request-url request))))
@ -105,12 +120,15 @@ connection."))
(defmethod create-response-using-server
((server http-server/0.9) request status-code &rest args)
(apply #'make-instance
(get-response-class (get-http-version 0 9))
(get-response-class-using-server server request)
:server server
:request request
:status-code status-code
args))
(defmethod get-response-class-using-server ((server http-server/0.9) request)
(get-response-class (get-http-version 0 9)))
(defmethod handle-server-error ((server http-server/0.9) connection condition)
(ignore-errors
(let ((response (make-instance