annotate fileserver/web.py @ 34:aca8cb6bfd63 default tip

fix documentation + bump version
author Jeff Hammel <jhammel@mozilla.com>
date Mon, 05 Mar 2012 14:09:43 -0800
parents 0edb831061f5
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
1 #!/usr/bin/env python
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
2
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
3 """
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
4 WSGI app for FileServer
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
5
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
6 Reference:
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
7 - http://docs.webob.org/en/latest/file-example.html
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
8 """
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
9
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
10 import mimetypes
1
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
11 import optparse
0
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
12 import os
1
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
13 import sys
0
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
14 from webob import Request, Response, exc
1
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
15 from wsgiref.simple_server import make_server
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
16
20
1eb5e82605a5 * flush out README
Jeff Hammel <jhammel@mozilla.com>
parents: 17
diff changeset
17 __all__ = ['get_mimetype', 'file_response', 'FileApp', 'DirectoryServer', 'main']
0
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
18
26
395c6744bcd9 upgrading with suggestions from http://docs.webob.org/en/latest/file-example.html
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
19 ### classes for iterating over files
395c6744bcd9 upgrading with suggestions from http://docs.webob.org/en/latest/file-example.html
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
20
395c6744bcd9 upgrading with suggestions from http://docs.webob.org/en/latest/file-example.html
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
21 class FileIterable(object):
32
0edb831061f5 test not modified response
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
22 def __init__(self, filename, start=None, stop=None):
26
395c6744bcd9 upgrading with suggestions from http://docs.webob.org/en/latest/file-example.html
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
23 self.filename = filename
32
0edb831061f5 test not modified response
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
24 self.start = start
0edb831061f5 test not modified response
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
25 self.stop = stop
26
395c6744bcd9 upgrading with suggestions from http://docs.webob.org/en/latest/file-example.html
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
26 def __iter__(self):
32
0edb831061f5 test not modified response
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
27 return FileIterator(self.filename, self.start, self.stop)
26
395c6744bcd9 upgrading with suggestions from http://docs.webob.org/en/latest/file-example.html
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
28 class FileIterator(object):
32
0edb831061f5 test not modified response
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
29 def __init__(self, filename, start, stop, chunk_size=4096):
26
395c6744bcd9 upgrading with suggestions from http://docs.webob.org/en/latest/file-example.html
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
30 self.filename = filename
395c6744bcd9 upgrading with suggestions from http://docs.webob.org/en/latest/file-example.html
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
31 self.chunk_size = chunk_size
395c6744bcd9 upgrading with suggestions from http://docs.webob.org/en/latest/file-example.html
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
32 self.fileobj = open(self.filename, 'rb')
32
0edb831061f5 test not modified response
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
33 if start:
0edb831061f5 test not modified response
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
34 self.fileobj.seek(start)
0edb831061f5 test not modified response
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
35 if stop is not None:
0edb831061f5 test not modified response
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
36 self.length = stop - start
0edb831061f5 test not modified response
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
37 else:
0edb831061f5 test not modified response
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
38 self.length = None
26
395c6744bcd9 upgrading with suggestions from http://docs.webob.org/en/latest/file-example.html
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
39 def __iter__(self):
395c6744bcd9 upgrading with suggestions from http://docs.webob.org/en/latest/file-example.html
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
40 return self
395c6744bcd9 upgrading with suggestions from http://docs.webob.org/en/latest/file-example.html
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
41 def next(self):
32
0edb831061f5 test not modified response
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
42 if self.length is not None and self.length <= 0:
0edb831061f5 test not modified response
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
43 raise StopIteration
26
395c6744bcd9 upgrading with suggestions from http://docs.webob.org/en/latest/file-example.html
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
44 chunk = self.fileobj.read(self.chunk_size)
395c6744bcd9 upgrading with suggestions from http://docs.webob.org/en/latest/file-example.html
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
45 if not chunk:
395c6744bcd9 upgrading with suggestions from http://docs.webob.org/en/latest/file-example.html
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
46 raise StopIteration
32
0edb831061f5 test not modified response
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
47 if self.length is not None:
0edb831061f5 test not modified response
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
48 self.length -= len(chunk)
0edb831061f5 test not modified response
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
49 if self.length < 0:
0edb831061f5 test not modified response
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
50 # Chop off the extra:
0edb831061f5 test not modified response
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
51 chunk = chunk[:self.length]
26
395c6744bcd9 upgrading with suggestions from http://docs.webob.org/en/latest/file-example.html
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
52 return chunk
395c6744bcd9 upgrading with suggestions from http://docs.webob.org/en/latest/file-example.html
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
53 __next__ = next # py3 compat
395c6744bcd9 upgrading with suggestions from http://docs.webob.org/en/latest/file-example.html
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
54
32
0edb831061f5 test not modified response
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
55
0edb831061f5 test not modified response
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
56 ### attributes for serving static files
0edb831061f5 test not modified response
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
57
0
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
58 def get_mimetype(filename):
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
59 type, encoding = mimetypes.guess_type(filename)
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
60 # We'll ignore encoding, even though we shouldn't really
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
61 return type or 'application/octet-stream'
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
62
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
63 def file_response(filename):
20
1eb5e82605a5 * flush out README
Jeff Hammel <jhammel@mozilla.com>
parents: 17
diff changeset
64 """return a webob response object appropriate to a file name"""
26
395c6744bcd9 upgrading with suggestions from http://docs.webob.org/en/latest/file-example.html
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
65 res = Response(content_type=get_mimetype(filename),
395c6744bcd9 upgrading with suggestions from http://docs.webob.org/en/latest/file-example.html
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
66 conditional_response=True)
395c6744bcd9 upgrading with suggestions from http://docs.webob.org/en/latest/file-example.html
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
67 res.app_iter = FileIterable(filename)
395c6744bcd9 upgrading with suggestions from http://docs.webob.org/en/latest/file-example.html
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
68 res.content_length = os.path.getsize(filename)
395c6744bcd9 upgrading with suggestions from http://docs.webob.org/en/latest/file-example.html
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
69 res.last_modified = os.path.getmtime(filename)
395c6744bcd9 upgrading with suggestions from http://docs.webob.org/en/latest/file-example.html
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
70 res.etag = '%s-%s-%s' % (os.path.getmtime(filename),
395c6744bcd9 upgrading with suggestions from http://docs.webob.org/en/latest/file-example.html
Jeff Hammel <jhammel@mozilla.com>
parents: 24
diff changeset
71 os.path.getsize(filename), hash(filename))
0
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
72 return res
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
73
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
74 class FileApp(object):
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
75 """
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
76 serve static files
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
77 """
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
78
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
79 def __init__(self, filename):
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
80 self.filename = filename
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
81
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
82 def __call__(self, environ, start_response):
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
83 res = file_response(self.filename)
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
84 return res(environ, start_response)
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
85
32
0edb831061f5 test not modified response
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
86
0edb831061f5 test not modified response
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
87 ### class for serving directory indices
0edb831061f5 test not modified response
Jeff Hammel <jhammel@mozilla.com>
parents: 26
diff changeset
88
0
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
89 class DirectoryServer(object):
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
90
24
eb15c8321ad8 sort by default
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
91 def __init__(self, directory, sort=True):
0
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
92 assert os.path.exists(directory), "'%s' does not exist" % directory
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
93 assert os.path.isdir(directory), "'%s' is not a directory" % directory
2
8fb047af207a this now actually serves things
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
94 self.directory = self.normpath(directory)
24
eb15c8321ad8 sort by default
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
95 self.sort = sort
0
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
96
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
97 @staticmethod
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
98 def normpath(path):
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
99 return os.path.normcase(os.path.abspath(path))
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
100
17
27bd18f0a359 fix up security hole
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
101 def check_path(self, path):
27bd18f0a359 fix up security hole
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
102 """
27bd18f0a359 fix up security hole
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
103 if under the root directory, returns the full path
27bd18f0a359 fix up security hole
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
104 otherwise, returns None
27bd18f0a359 fix up security hole
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
105 """
27bd18f0a359 fix up security hole
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
106 path = self.normpath(path)
27bd18f0a359 fix up security hole
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
107 if path == self.directory or path.startswith(self.directory + os.path.sep):
27bd18f0a359 fix up security hole
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
108 return path
27bd18f0a359 fix up security hole
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
109
2
8fb047af207a this now actually serves things
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
110 def index(self, directory):
8fb047af207a this now actually serves things
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
111 """
8fb047af207a this now actually serves things
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
112 generate a directory listing for a given directory
8fb047af207a this now actually serves things
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
113 """
8fb047af207a this now actually serves things
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
114 parts = ['<html><head><title>Simple Index</title></head><body>']
8fb047af207a this now actually serves things
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
115 listings = os.listdir(directory)
24
eb15c8321ad8 sort by default
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
116 if self.sort:
eb15c8321ad8 sort by default
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
117 listings.sort()
2
8fb047af207a this now actually serves things
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
118 listings = [(os.path.isdir(os.path.join(directory, entry)) and entry + '/' or entry, entry)
8fb047af207a this now actually serves things
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
119 for entry in listings]
8fb047af207a this now actually serves things
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
120 for link, entry in listings:
8fb047af207a this now actually serves things
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
121 parts.append('<a href="%s">%s</a><br/>' % (link, entry))
8fb047af207a this now actually serves things
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
122 parts.append('</body></html>')
8fb047af207a this now actually serves things
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
123 return '\n'.join(parts)
8fb047af207a this now actually serves things
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
124
0
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
125 def __call__(self, environ, start_response):
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
126 request = Request(environ)
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
127 # TODO method_not_allowed: Allow: GET, HEAD
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
128 path_info = request.path_info
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
129 if not path_info:
13
e3993fa05b89 cleanup
Jeff Hammel <jhammel@mozilla.com>
parents: 12
diff changeset
130 response = exc.HTTPMovedPermanently(add_slash=True)
e3993fa05b89 cleanup
Jeff Hammel <jhammel@mozilla.com>
parents: 12
diff changeset
131 return response(environ, start_response)
17
27bd18f0a359 fix up security hole
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
132 full = self.check_path(os.path.join(self.directory, path_info.strip('/')))
2
8fb047af207a this now actually serves things
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
133
17
27bd18f0a359 fix up security hole
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
134 if full is None:
0
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
135 # Out of bounds
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
136 return exc.HTTPNotFound()(environ, start_response)
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
137 if not os.path.exists(full):
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
138 return exc.HTTPNotFound()(environ, start_response)
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
139
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
140 if os.path.isdir(full):
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
141 # serve directory index
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
142 if not path_info.endswith('/'):
12
8127dde8da22 fix slashing
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
143 response = exc.HTTPMovedPermanently(add_slash=True)
8127dde8da22 fix slashing
Jeff Hammel <jhammel@mozilla.com>
parents: 2
diff changeset
144 return response(environ, start_response)
0
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
145 index = self.index(full)
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
146 response = Response(index, content_type='text/html')
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
147 return response(environ, start_response)
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
148
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
149 # serve file
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
150 if path_info.endswith('/'):
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
151 # we create the `full` filename above by stripping off
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
152 # '/' from both sides; so we correct here
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
153 return exc.HTTPNotFound()(environ, start_response)
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
154 response = file_response(full)
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
155 return response(environ, start_response)
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
156
1
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
157 def main(args=sys.argv[1:]):
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
158
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
159 # parse command line arguments
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
160 usage = '%prog [options] directory'
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
161 class PlainDescriptionFormatter(optparse.IndentedHelpFormatter):
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
162 """description formatter"""
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
163 def format_description(self, description):
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
164 if description:
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
165 return description + '\n'
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
166 else:
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
167 return ''
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
168 parser = optparse.OptionParser(usage=usage, description=__doc__, formatter=PlainDescriptionFormatter())
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
169 parser.add_option('-p', '--port', dest='port',
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
170 type='int', default=9999,
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
171 help='port [DEFAULT: %default]')
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
172 parser.add_option('-H', '--host', dest='host', default='0.0.0.0',
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
173 help='host [DEFAULT: %default]')
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
174 options, args = parser.parse_args(args)
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
175
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
176 # get the directory
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
177 if not len(args) == 1:
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
178 parser.print_help()
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
179 sys.exit(1)
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
180 directory = args[0]
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
181 if not os.path.exists(directory):
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
182 parser.error("'%s' not found" % directory)
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
183 if not os.path.isdir(directory):
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
184 parser.error("'%s' not a directory" % directory)
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
185
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
186 # serve
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
187 app = DirectoryServer(directory)
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
188 try:
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
189 print 'http://%s:%s/' % (options.host, options.port)
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
190 make_server(options.host, options.port, app).serve_forever()
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
191 except KeyboardInterrupt, ki:
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
192 print "Cio, baby!"
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
193 except BaseException, e:
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
194 sys.exit("Problem initializing server: %s" % e)
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
195
0
8d31e36f084e initial stubbing
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
196 if __name__ == '__main__':
1
89d4f742ed1a include cli front end
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
197 main()