#!/usr/bin/env python
import logging
import os
import sys
import time
import tornado.httpserver
import tornado.ioloop
import tornado.log
import tornado.web
class IndexHandler(tornado.web.RequestHandler):
def get(self, path):
path = os.path.normpath(path)
if os.path.join(path, '').startswith(os.path.join('..', '')) or os.path.isabs(path):
raise tornado.web.HTTPError(403)
if not os.path.isdir(path):
raise tornado.web.HTTPError(404)
self.write('\n
Index of /')
escaped_title = tornado.web.escape.xhtml_escape(path if path != '.' else '')
self.write(escaped_title)
self.write('\n\nIndex of /')
self.write(escaped_title)
self.write('
\n
\n\n')
for f in (['..'] if path != '.' else []) + sorted([i for i in os.listdir(path) if not i.startswith('.')]):
self.write('')
self.write(tornado.web.escape.xhtml_escape(f))
self.write(' | ')
lstat_result = os.lstat(absf)
self.write(tornado.web.escape.xhtml_escape(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(lstat_result.st_mtime))))
self.write(' | ')
self.write(tornado.web.escape.xhtml_escape(str(lstat_result.st_size)))
self.write(' |
\n')
self.finish('
\n
\n\n\n')
def main():
listen_address = ''
listen_port = 8000
try:
if len(sys.argv) == 2:
listen_port = int(sys.argv[1])
elif len(sys.argv) == 3:
listen_address = sys.argv[1]
listen_port = int(sys.argv[2])
assert 0 <= listen_port <= 65535
except (AssertionError, ValueError) as e:
raise ValueError('port must be a number between 0 and 65535')
tornado.log.enable_pretty_logging()
application = tornado.web.Application(
[
('/(.*/)', IndexHandler),
('/()', IndexHandler),
('/(.*)', tornado.web.StaticFileHandler, {'path': '.', 'default_filename': ''}),
],
gzip=False,
static_hash_cache=False,
)
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(listen_port, listen_address)
logging.info('Listening on %s:%s' % (listen_address or '[::]' if ':' not in listen_address else '[%s]' % listen_address, listen_port))
tornado.ioloop.IOLoop.instance().start()
if __name__ == '__main__':
main()