add an isso.dispatch module to support multiple sites, #34
parent
b21e216b06
commit
6f66960df8
@ -0,0 +1,63 @@
|
||||
|
||||
import os
|
||||
import logging
|
||||
|
||||
try:
|
||||
from urlparse import urlparse
|
||||
except ImportError:
|
||||
from urllib.parse import urlparse
|
||||
|
||||
from werkzeug.exceptions import ImATeapot
|
||||
|
||||
from isso import make_app, wsgi
|
||||
from isso.core import Config
|
||||
|
||||
logger = logging.getLogger("isso")
|
||||
|
||||
|
||||
class Dispatcher(object):
|
||||
"""
|
||||
A dispatcher to support different websites. Dispatches based on
|
||||
HTTP-Host. If HTTP-Host is not provided, display an error message.
|
||||
"""
|
||||
|
||||
def __init__(self, *confs):
|
||||
|
||||
self.isso = {}
|
||||
|
||||
for conf in map(Config.load, confs):
|
||||
|
||||
app = make_app(conf)
|
||||
|
||||
for origin in conf.getiter("general", "host"):
|
||||
self.isso[origin.rstrip("/")] = app
|
||||
|
||||
def __call__(self, environ, start_response):
|
||||
|
||||
if "HTTP_ORIGIN" in environ:
|
||||
origin = environ["HTTP_ORIGIN"]
|
||||
elif "HTTP_REFERER" in environ:
|
||||
rv = urlparse(environ["HTTP_REFERER"])
|
||||
origin = rv.scheme + "://" + rv.hostname + (":" + str(rv.port) if rv.port else "")
|
||||
else:
|
||||
origin = wsgi.host(environ)
|
||||
|
||||
try:
|
||||
# logger.info("dispatch %s", origin)
|
||||
return self.isso[origin](environ, start_response)
|
||||
except KeyError:
|
||||
# logger.info("unable to dispatch %s", origin)
|
||||
resp = ImATeapot("unable to dispatch %s" % origin)
|
||||
return resp(environ, start_response)
|
||||
|
||||
|
||||
if "ISSO_SETTINGS" not in os.environ:
|
||||
logger.fatal('no such environment variable: ISSO_SETTINGS')
|
||||
else:
|
||||
confs = os.environ["ISSO_SETTINGS"].split(";")
|
||||
for path in confs:
|
||||
if not os.path.isfile(path):
|
||||
logger.fatal("%s: no such file", path)
|
||||
break
|
||||
else:
|
||||
application = Dispatcher(*confs)
|
Loading…
Reference in new issue