Mercurial > mozilla > hg > dogfood
view dogdish/dispatcher.py @ 0:b3fd8f98df32
initial stub
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Wed, 10 Oct 2012 16:01:56 -0700 |
parents | |
children | 2cb8b06d64df |
line wrap: on
line source
""" request dispatcher """ from webob import Request, exc from cgi import escape from urlparse import urlparse from webob import Response, exc class Handler(object): def __init__(self, request): self.request = request self.application_path = urlparse(request.application_url)[2] def link(self, path=(), permanant=False): if isinstance(path, basestring): path = [ path ] path = [ i.strip('/') for i in path ] if permanant: application_url = [ self.request.application_url ] else: application_url = [ self.application_path ] path = application_url + path return '/'.join(path) def redirect(self, location): raise exc.HTTPSeeOther(location=location) class Get(Handler): body = """<?xml version="1.0"?> <updates> <update type="minor" appVersion="19.0a1" version="19.0a1" extensionVersion="19.0a1" buildID="20121010114416" licenseURL="http://www.mozilla.com/test/sample-eula.html" detailsURL="http://www.mozilla.com/test/sample-details.html"> <patch type="complete" URL="http://update.boot2gecko.org/nightly/b2g_update_2012-10-10_114416.mar" hashFunction="SHA512" hashValue="84edb1f53891cf983bc0f6066d31492f43e2d063aaceb05e1c51876f4fde81635afeb7ce3203dee6f65dd59be0cae5c73c49093b625c99acd4118000ad72dda8" size="42924805"/> </update> </updates>""" @classmethod def match(cls, request): return request.method == 'GET' def __call__(self): name = self.request.GET.get('name', 'world') retval = """<html><body><form method="post">Hello, <input type="text" name="name" value="%s"/></form></body></html>""" return Response(content_type='text/html', body=retval % name) class Dispatcher(object): ### class level variables defaults = {} def __init__(self, **kw): for key in self.defaults: setattr(self, key, kw.get(key, self.defaults[key])) self.handlers = [ Get ] if self.app: assert hasattr(self.app, '__call__') ### methods dealing with HTTP def __call__(self, environ, start_response): request = Request(environ) for h in self.handlers: if h.match(request): handler = h(request) break else: if self.app: return self.app(environ, start_response) handler = exc.HTTPNotFound res = handler() return res(environ, start_response) def main(args=sys.argv[1:]): """CLI entry point""" import optparse from wsgiref import simple_server parser = optparse.OptionParser() parser.add_option('-p', '--port', dest='port', default=8080, type='int', help="port to serve on") options, args = parser.parse_args() dispatcher = Dispatcher() server = simple_server.make_server(host='0.0.0.0', port=options.port, app=app) server.serve_forever() if __name__ == '__main__': main()