You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
isso/isso/dispatch.py

69 lines
2.0 KiB

# -*- encoding: utf-8 -*-
from __future__ import unicode_literals
import sys
import os
import logging
from glob import glob
from werkzeug.middleware.dispatcher import DispatcherMiddleware
from werkzeug.wrappers import Response
from isso import dist, make_app, wsgi, config
logger = logging.getLogger("isso")
class Dispatcher(DispatcherMiddleware):
"""
A dispatcher to support different websites. Dispatches based on
a relative URI, e.g. /foo.example and /other.bar.
"""
def __init__(self, *confs):
self.isso = {}
default = os.path.join(
dist.location, dist.project_name, "defaults.ini")
for i, path in enumerate(confs):
conf = config.load(default, path)
if not conf.get("general", "name"):
logger.warn("unable to dispatch %r, no 'name' set", confs[i])
continue
self.isso["/" + conf.get("general", "name")] = make_app(conf)
super(Dispatcher, self).__init__(self.default, mounts=self.isso)
def __call__(self, environ, start_response):
# clear X-Script-Name as the PATH_INFO is already adjusted
environ.pop('HTTP_X_SCRIPT_NAME', None)
return super(Dispatcher, self).__call__(environ, start_response)
def default(self, environ, start_response):
resp = Response("\n".join(self.isso.keys()),
404, content_type="text/plain")
return resp(environ, start_response)
settings = os.environ.get("ISSO_SETTINGS")
if settings:
if os.path.isdir(settings):
conf_glob = os.path.join(settings, '*.cfg')
confs = glob(conf_glob)
application = wsgi.SubURI(Dispatcher(*confs))
else:
confs = settings.split(";")
for path in confs:
if not os.path.isfile(path):
logger.fatal("%s: no such file", path)
sys.exit(1)
application = wsgi.SubURI(Dispatcher(*confs))
else:
logger.fatal('environment variable ISSO_SETTINGS must be set')