Mercurial > hg > simpypi
annotate 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 |
rev | line source |
---|---|
19
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
1 #!/usr/bin/env python |
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
2 |
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
3 """ |
30 | 4 WSGI factories for simpypi |
19
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
5 """ |
0 | 6 |
19
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
7 import optparse |
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
8 import os |
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
9 import shutil |
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
10 import sys |
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
11 import tempfile |
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
12 |
27 | 13 from fileserver import DirectoryServer |
72
b2ea14bf9f46
add a slash to the namespaced directory
Jeff Hammel <jhammel@mozilla.com>
parents:
70
diff
changeset
|
14 from webob import exc |
19
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
15 from wsgi import SimPyPI |
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
16 from wsgiref import simple_server |
0 | 17 |
23
e72d9655d753
start stubbing a directory server
Jeff Hammel <jhammel@mozilla.com>
parents:
20
diff
changeset
|
18 class NamespacedFileserver(DirectoryServer): |
16
d3efc504c0b1
more towards the type of fileserver we actually care about
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
19 |
d3efc504c0b1
more towards the type of fileserver we actually care about
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
20 def __init__(self, app, directory, namespace): |
23
e72d9655d753
start stubbing a directory server
Jeff Hammel <jhammel@mozilla.com>
parents:
20
diff
changeset
|
21 DirectoryServer.__init__(self, directory) |
e72d9655d753
start stubbing a directory server
Jeff Hammel <jhammel@mozilla.com>
parents:
20
diff
changeset
|
22 self.app = app |
16
d3efc504c0b1
more towards the type of fileserver we actually care about
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
23 self.namespace = namespace |
d3efc504c0b1
more towards the type of fileserver we actually care about
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
24 |
d3efc504c0b1
more towards the type of fileserver we actually care about
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
25 def __call__(self, environ, start_response): |
d3efc504c0b1
more towards the type of fileserver we actually care about
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
26 path = environ['PATH_INFO'] |
d3efc504c0b1
more towards the type of fileserver we actually care about
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
27 if path == self.namespace: |
72
b2ea14bf9f46
add a slash to the namespaced directory
Jeff Hammel <jhammel@mozilla.com>
parents:
70
diff
changeset
|
28 response = exc.HTTPMovedPermanently(add_slash=True) |
b2ea14bf9f46
add a slash to the namespaced directory
Jeff Hammel <jhammel@mozilla.com>
parents:
70
diff
changeset
|
29 return response(environ, start_response) |
16
d3efc504c0b1
more towards the type of fileserver we actually care about
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
30 environ['PATH_INFO'] = '/' |
24 | 31 return DirectoryServer.__call__(self, environ, start_response) |
16
d3efc504c0b1
more towards the type of fileserver we actually care about
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
32 elif path.startswith(self.namespace + '/'): |
d3efc504c0b1
more towards the type of fileserver we actually care about
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
33 environ['PATH_INFO'] = path[len(self.namespace):] |
24 | 34 return DirectoryServer.__call__(self, environ, start_response) |
0 | 35 return self.app(environ, start_response) |
36 | |
23
e72d9655d753
start stubbing a directory server
Jeff Hammel <jhammel@mozilla.com>
parents:
20
diff
changeset
|
37 |
1 | 38 def factory(**app_conf): |
0 | 39 """create a webob view and wrap it in middleware""" |
4 | 40 directory = app_conf['directory'] |
19
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
41 app = SimPyPI(**app_conf) |
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
42 return NamespacedFileserver(app, directory, '/index') |
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
43 |
70
8fa30276b3e0
add a command line entry point
Jeff Hammel <jhammel@mozilla.com>
parents:
30
diff
changeset
|
44 def main(args=sys.argv[1:]): |
0 | 45 |
19
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
46 # parse command line options |
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
47 usage = '%prog [options]' |
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
48 parser = optparse.OptionParser(usage=usage) |
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
49 parser.add_option('-p', '--port', dest='port', |
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
50 type='int', default=8080, |
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
51 help="port to run the server on") |
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
52 parser.add_option('-d', '--directory', dest='directory', |
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
53 help='directory to serve') |
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
54 options, args = parser.parse_args(args) |
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
55 |
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
56 # create a temporary directory, if none specified |
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
57 tmpdir = None |
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
58 if not options.directory: |
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
59 tmpdir = tempfile.mkdtemp() |
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
60 options.directory = tmpdir |
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
61 |
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
62 # serve |
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
63 print "http://localhost:%d/" % options.port |
2 | 64 try: |
19
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
65 app = factory(directory=options.directory) |
20 | 66 server = simple_server.make_server(host='0.0.0.0', port=options.port, app=app) |
3 | 67 server.serve_forever() |
2 | 68 finally: |
19
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
69 if tmpdir: |
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
70 shutil.rmtree(tmpdir) |
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
71 |
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
72 if __name__ == '__main__': |
bf70fc5a115f
make a real python program
Jeff Hammel <jhammel@mozilla.com>
parents:
17
diff
changeset
|
73 main() |