Hi all,
I'm in the process of migrating a Web app from Portable Allegroserve to Hunchentoot (0.10), and I had a question about implementing virtual hosts by overriding the *META-DISPATCHER* function binding. Here's what I have so far:
----------------
(defvar *vhost-dispatch-table-map* (make-hash-table :test 'string=))
(defun vhost-meta-dispatcher (server) (declare (ignore server)) (or (gethash (hunchentoot:host) *vhost-dispatch-table-map*) *dispatch-table*))
(defun vhost-set-dispatch-table (hosts dispatch-table &key defaultp) (dolist (hostname (pg:mklist hosts)) (setf (gethash hostname *vhost-dispatch-table-map*) dispatch-table)) (when defaultp (setq *dispatch-table* dispatch-table)))
(setq hunchentoot:*meta-dispatcher* 'vhost-meta-dispatcher)
----------------
Now, I'm able to return different *DISPATCH-TABLE* bindings based on the hostname, like so:
----------------
(vhost-set-dispatch-table "foo.bar.com" (list (hunchentoot:create-folder-dispatcher-and-handler "/assets/" #p"/var/www/foo.bar.com/assets/"))) (vhost-set-dispatch-table "quux.bar.com" (list (hunchentoot:create-folder-dispatcher-and-handler "/assets/" #p"/var/www/quux.bar.com/assets/")))
----------------
Are there any problems in subverting the *META-DISPATCHER* binding this way? Is there a better alternative?
Thanks.
-ram