view simpypi/factory.py @ 72:b2ea14bf9f46

add a slash to the namespaced directory
author Jeff Hammel <jhammel@mozilla.com>
date Fri, 02 Mar 2012 11:35:49 -0800
parents 8fa30276b3e0
children
line wrap: on
line source

#!/usr/bin/env python

"""
WSGI factories for simpypi
"""

import optparse
import os
import shutil
import sys
import tempfile

from fileserver import DirectoryServer
from webob import exc
from wsgi import SimPyPI
from wsgiref import simple_server

class NamespacedFileserver(DirectoryServer):

    def __init__(self, app, directory, namespace):
        DirectoryServer.__init__(self, directory)
        self.app = app
        self.namespace = namespace

    def __call__(self, environ, start_response):
        path = environ['PATH_INFO']
        if path == self.namespace:
            response = exc.HTTPMovedPermanently(add_slash=True)
            return response(environ, start_response)
            environ['PATH_INFO'] = '/'
            return DirectoryServer.__call__(self, environ, start_response)
        elif path.startswith(self.namespace + '/'):
            environ['PATH_INFO'] = path[len(self.namespace):]
            return DirectoryServer.__call__(self, environ, start_response)
        return self.app(environ, start_response)


def factory(**app_conf):
    """create a webob view and wrap it in middleware"""
    directory = app_conf['directory']
    app = SimPyPI(**app_conf)
    return NamespacedFileserver(app, directory, '/index')

def main(args=sys.argv[1:]):

    # parse command line options
    usage = '%prog [options]'
    parser = optparse.OptionParser(usage=usage)
    parser.add_option('-p', '--port', dest='port',
                      type='int', default=8080,
                      help="port to run the server on")
    parser.add_option('-d', '--directory', dest='directory',
                      help='directory to serve')
    options, args = parser.parse_args(args)

    # create a temporary directory, if none specified
    tmpdir = None
    if not options.directory:
        tmpdir = tempfile.mkdtemp()
        options.directory = tmpdir

    # serve
    print "http://localhost:%d/" % options.port
    try:
        app = factory(directory=options.directory)
        server = simple_server.make_server(host='0.0.0.0', port=options.port, app=app)
        server.serve_forever()
    finally:
        if tmpdir:
            shutil.rmtree(tmpdir)

if __name__ == '__main__':
    main()