Il y a plusieurs problèmes, autant que je peux voir. Tout d'abord, demander la manipulation par *dispatch-table*
exige que l'accepteur est de type easy-acceptor
, à savoir, vous devrez
(make-instance 'easy-acceptor ...)
Le documentation a les détails.
Le deuxième problème est que vous redéfinissez *dispatch-table*
pendant le code d'installation et que vous insérez de nouvelles valeurs dans cette liaison. Étant donné que la liaison est rétablie après que le let
est terminé (et que hunchentoot:start
fonctionne de manière asynchrone), vos entrées dans *dispatch-table*
sont effectivement perdues lorsque le serveur est en cours d'exécution. Essayez
(push (hunchentoot:create-prefix-dispatcher "/a" (lambda() "a")) *dispatch-table*)
(push (hunchentoot:create-prefix-dispatcher "/b" (lambda() "b")) *dispatch-table*)
au niveau supérieur (ou faites quelque chose comme ça dans une fonction d'installation dédiée). Si vous n'aimez pas l'approche globale *dispatch-table*
, vous pouvez également créer une sous-classe de acceptor
et remplacer acceptor-dispatch-request
(et ainsi implémenter tout type de répartition que vous aimez). Juste comme une note de côté: vous ne préfixez pas *dispatch-table*
, tandis que vous préfixez virtuellement tout autre symbole du paquet hunchentoot
. Est-ce juste une erreur de copier/coller, ou est-ce aussi le cas dans votre code actuel? Si vous n'obtenez pas le paquet hunchentoot
dans le paquet où votre code arrive à vivre, vous devez également qualifier la table de répartition comme hunchentoot:*dispatch-table*
.
Modifier (pour répondre à la question dans la section commentaire) Il y a une example in the hunchentoot documentation, qui semble faire exactement ce que vous voulez faire:
(defclass vhost (tbnl:acceptor)
((dispatch-table
:initform '()
:accessor dispatch-table
:documentation "List of dispatch functions"))
(:default-initargs
:address "127.0.0.1"))
(defmethod tbnl:acceptor-dispatch-request ((vhost vhost) request)
(mapc (lambda (dispatcher)
(let ((handler (funcall dispatcher request)))
(when handler
(return-from tbnl:acceptor-dispatch-request (funcall handler)))))
(dispatch-table vhost))
(call-next-method))
(defvar vhost1 (make-instance 'vhost :port 50001))
(defvar vhost2 (make-instance 'vhost :port 50002))
(push
(tbnl:create-prefix-dispatcher "/foo" 'foo1)
(dispatch-table vhost1))
(push
(tbnl:create-prefix-dispatcher "/foo" 'foo2)
(dispatch-table vhost2))
(defun foo1() "Hello")
(defun foo2() "Goodbye")
(tbnl:start vhost1)
(tbnl:start vhost2)
(commentaires présents dans la documentation supprimée par souci de concision) . Le tbnl
est un pseudonyme prédéfini pour le package hunchentoot
. Vous pouvez utiliser les deux de façon interchangeable, bien que je vous recommande, que vous en choisissez un et y adhérez. Mélanger les deux peut générer de la confusion.
'* dispatch-table *' est déjà une variable globale. –