view dogdish/dispatcher.py @ 2:e0ea3f0b407a

u+x
author Jeff Hammel <jhammel@mozilla.com>
date Wed, 10 Oct 2012 16:23:34 -0700
parents 2cb8b06d64df
children 4521527b93f6
line wrap: on
line source

#!/usr/bin/env python

"""
dogdish
"""

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):
        return Response(content_type='text/xml',
                        self.body)

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()