annotate fileserver/web.py @ 26:395c6744bcd9

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