Add support for additional static paths
This commit is contained in:
@@ -52,6 +52,10 @@ parser.add_argument(
|
|||||||
dest='server_cert',
|
dest='server_cert',
|
||||||
action='store',
|
action='store',
|
||||||
required=True)
|
required=True)
|
||||||
|
parser.add_argument(
|
||||||
|
'--static-path',
|
||||||
|
dest='static_paths',
|
||||||
|
action='append')
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'--exec-handler',
|
'--exec-handler',
|
||||||
dest='exec_handlers',
|
dest='exec_handlers',
|
||||||
@@ -185,16 +189,17 @@ class HTTPRequestHandler(object):
|
|||||||
'.iso': 'application/octet-stream',
|
'.iso': 'application/octet-stream',
|
||||||
'.js': 'application/javascript',
|
'.js': 'application/javascript',
|
||||||
'.json': 'application/json',
|
'.json': 'application/json',
|
||||||
|
'.tar': 'application/x-tar',
|
||||||
'.woff': 'application/font-woff',
|
'.woff': 'application/font-woff',
|
||||||
}
|
}
|
||||||
_BLOCK_SIZE = 2 ** 16
|
_BLOCK_SIZE = 2 ** 16
|
||||||
|
|
||||||
def __init__(self, image_path, image_types, exec_handlers, websockets):
|
def __init__(self, image_path, image_types, exec_handlers, static_paths, websockets):
|
||||||
self._static_path = os.path.join(os.path.dirname(sys.argv[0]), 'static')
|
|
||||||
|
|
||||||
self._image_path = image_path
|
self._image_path = image_path
|
||||||
self._image_types = image_types
|
self._image_types = image_types
|
||||||
self._exec_handlers = exec_handlers
|
self._exec_handlers = exec_handlers
|
||||||
|
self._static_paths = static_paths
|
||||||
|
self._static_paths['static'] = os.path.join(os.path.dirname(sys.argv[0]), 'static')
|
||||||
|
|
||||||
slave_ws_handler = GetSlaveWSHandler(image_types, websockets)
|
slave_ws_handler = GetSlaveWSHandler(image_types, websockets)
|
||||||
self._slave_ws_handler = wsgiutils.WebSocketWSGIApplication(
|
self._slave_ws_handler = wsgiutils.WebSocketWSGIApplication(
|
||||||
@@ -212,12 +217,14 @@ class HTTPRequestHandler(object):
|
|||||||
if path == '/':
|
if path == '/':
|
||||||
path = '/static/root.html'
|
path = '/static/root.html'
|
||||||
|
|
||||||
|
for url, file_path in self._static_paths.items():
|
||||||
|
if path.startswith('/%s/' % url):
|
||||||
|
file_name = path[len(url) + 2:]
|
||||||
|
return self._ServeStaticFile(start_response, file_path, file_name)
|
||||||
|
|
||||||
if path.startswith('/image/'):
|
if path.startswith('/image/'):
|
||||||
image_type, image_name = path[7:].split('/', 1)
|
image_type, image_name = path[7:].split('/', 1)
|
||||||
return self._ServeImageFile(start_response, image_type, image_name)
|
return self._ServeImageFile(start_response, image_type, image_name)
|
||||||
elif path.startswith('/static/'):
|
|
||||||
file_name = path[8:]
|
|
||||||
return self._ServeStaticFile(start_response, file_name)
|
|
||||||
elif path.startswith('/exec/'):
|
elif path.startswith('/exec/'):
|
||||||
method = path[6:]
|
method = path[6:]
|
||||||
return self._ServeExec(start_response, method, env['QUERY_STRING'])
|
return self._ServeExec(start_response, method, env['QUERY_STRING'])
|
||||||
@@ -255,13 +262,13 @@ class HTTPRequestHandler(object):
|
|||||||
start_response('404 Not found', [('Content-Type', 'text/plain')])
|
start_response('404 Not found', [('Content-Type', 'text/plain')])
|
||||||
return []
|
return []
|
||||||
|
|
||||||
def _ServeStaticFile(self, start_response, file_name):
|
def _ServeStaticFile(self, start_response, file_path, file_name):
|
||||||
file_name = os.path.basename(file_name)
|
file_name = os.path.basename(file_name)
|
||||||
assert not file_name.startswith('.')
|
assert not file_name.startswith('.')
|
||||||
|
|
||||||
file_path = os.path.join(self._static_path, file_name)
|
full_path = os.path.join(file_path, file_name)
|
||||||
try:
|
try:
|
||||||
with open(file_path, 'rb') as fh:
|
with open(full_path, 'rb') as fh:
|
||||||
start_response('200 OK', [('Content-Type', self._MIMEType(file_name))])
|
start_response('200 OK', [('Content-Type', self._MIMEType(file_name))])
|
||||||
return [fh.read()]
|
return [fh.read()]
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
@@ -284,7 +291,7 @@ class HTTPRequestHandler(object):
|
|||||||
|
|
||||||
class Server(object):
|
class Server(object):
|
||||||
|
|
||||||
def __init__(self, listen_host, listen_port, server_key, server_cert, ca_cert, image_path, image_types, exec_handlers):
|
def __init__(self, listen_host, listen_port, server_key, server_cert, ca_cert, image_path, image_types, exec_handlers, static_paths):
|
||||||
websockets = WebSockets()
|
websockets = WebSockets()
|
||||||
|
|
||||||
wm = pyinotify.WatchManager()
|
wm = pyinotify.WatchManager()
|
||||||
@@ -295,7 +302,8 @@ class Server(object):
|
|||||||
wm.add_watch(type_path, pyinotify.IN_MOVED_TO)
|
wm.add_watch(type_path, pyinotify.IN_MOVED_TO)
|
||||||
|
|
||||||
exec_handlers = dict(x.split('=', 1) for x in (exec_handlers or []))
|
exec_handlers = dict(x.split('=', 1) for x in (exec_handlers or []))
|
||||||
http_handler = HTTPRequestHandler(image_path, image_types, exec_handlers, websockets)
|
static_paths = dict(x.split('=', 1) for x in (static_paths or []))
|
||||||
|
http_handler = HTTPRequestHandler(image_path, image_types, exec_handlers, static_paths, websockets)
|
||||||
self._httpd = geventserver.WSGIServer(
|
self._httpd = geventserver.WSGIServer(
|
||||||
(listen_host, listen_port),
|
(listen_host, listen_port),
|
||||||
http_handler,
|
http_handler,
|
||||||
@@ -321,7 +329,8 @@ def main():
|
|||||||
FLAGS.ca_cert,
|
FLAGS.ca_cert,
|
||||||
FLAGS.image_path,
|
FLAGS.image_path,
|
||||||
set(FLAGS.image_types),
|
set(FLAGS.image_types),
|
||||||
FLAGS.exec_handlers)
|
FLAGS.exec_handlers,
|
||||||
|
FLAGS.static_paths)
|
||||||
server.Serve()
|
server.Serve()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user