(let ((hash (make-hash-table :size (length map) :test 'equal)))
(dolist (map-item map)
- (setf (gethash (first map-item) hash) (second map-item)))
+ (setf (gethash (first map-item) hash) (cdr map-item)))
(setf (project-hash-map project) hash))
(ecase connector
(defun dispatch-to-handler (req ent)
- (let ((handler (request-find-handler req ent))
+ (let ((handlers (request-find-handlers req ent))
(*wol-stream* (request-socket req)))
- (if handler
- (handle-request handler req ent)
+ (if handlers
+ (handle-request handlers req ent)
(no-url-handler req ent))))
-(defun request-find-handler (req ent)
+(defun request-find-handlers (req ent)
(nth-value 0 (gethash (request-page req)
(project-hash-map (entity-project ent)))))
-(defun handle-request (handler req ent)
- (typecase handler
+(defun handle-request (handlers req ent)
+ (typecase handlers
(null
+ (setf (entity-generators ent) nil)
nil)
- ((or symbol function)
- (when (and (symbolp handler)
- (not (fboundp handler)))
- (cmsg "handler given a symbol without a function ~S" handler)
- (return-from handle-request nil))
- (let ((next-page (funcall handler req ent)))
- (typecase next-page
- (string
- (redirect-entity next-page req ent))
- (cons
- (redirect-entity (car next-page) req ent (cadr next-page)))
- (null
- t)
- (t
- (cmsg "handler should return nil or a string, not ~S" next-page))))
- t)
+ (list
+ (let ((next-handler (first handlers)))
+ (setf (entity-generators ent) (cdr handlers))
+ (when (and (symbolp next-handler)
+ (not (fboundp next-handler)))
+ (cmsg "handler given a symbol without a function ~S" next-handler)
+ (return-from handle-request nil))
+ (let ((next-page (funcall next-handler req ent)))
+ (typecase next-page
+ (string
+ (setf (entity-generators ent) nil)
+ (redirect-entity next-page req ent))
+ (cons
+ (setf (entity-generators ent) nil)
+ (redirect-entity (car next-page) req ent (cadr next-page)))
+ (keyword
+ (if (eq :continue next-page)
+ (handle-request (cdr handlers) req ent)
+ (add-log-entry "Invalid return keyword ~S" next-page)))
+ (null
+ t)
+ (t
+ (cmsg "handler should return nil or a string, not ~S" next-page))))
+ t))
(string
(cmsg "string handler not supported: ~A" handler)
nil)