diff options
-rwxr-xr-x | doc/invocations-http-server/server.py | 18 | ||||
-rw-r--r-- | doc/invocations-http-server/templates/blob.html | 2 |
2 files changed, 17 insertions, 3 deletions
diff --git a/doc/invocations-http-server/server.py b/doc/invocations-http-server/server.py index 940e03a1..68955841 100755 --- a/doc/invocations-http-server/server.py +++ b/doc/invocations-http-server/server.py @@ -36,6 +36,9 @@ class HashIdentifierConverter(werkzeug.routing.BaseConverter): class InvocationIdentifierConverter(werkzeug.routing.BaseConverter): regex = '[-:_a-zA-Z0-9]{1,200}' +class FileIdentifierConverter(werkzeug.routing.BaseConverter): + regex = '[-:_.a-zA-Z0-9]{3,200}' + class InvocationServer: def __init__(self, logsdir, *, just_mr = None, @@ -59,6 +62,9 @@ class InvocationServer: rule("/blob/<hashidentifier:blob>", methods=("GET",), endpoint="get_blob"), + rule("/blob/<hashidentifier:blob>/<fileidentifier:name>", + methods=("GET",), + endpoint="get_blob_as"), rule("/tree/<hashidentifier:tree>", methods=("GET",), endpoint="get_tree"), @@ -68,6 +74,7 @@ class InvocationServer: ], converters=dict( invocationidentifier=InvocationIdentifierConverter, hashidentifier=HashIdentifierConverter, + fileidentifier=FileIdentifierConverter, )) @Request.application @@ -132,7 +139,7 @@ class InvocationServer: pass return self.render("failure.html", params) - def do_get_blob(self, blob): + def do_get_blob(self, blob, *, download_as=None): cmd = self.just_mr + ["install-cas", "--remember", blob] blob_data = subprocess.run(cmd, stdout=subprocess.PIPE, @@ -142,17 +149,22 @@ class InvocationServer: try: blob_content = blob_data.stdout.decode('utf-8') except: - # Not utf-8, so return as binary file + # Not utf-8, so return as binary file to download separately + download_as = download_as or blob + if download_as: response = Response() response.content_type = "application/octet-stream" response.data = blob_data.stdout response.headers['Content-Disposition'] = \ - "attachement; filename=%s" %(blob,) + "attachement; filename=%s" %(download_as,) return response return self.render("blob.html", {"name": blob, "data": blob_content}) + def do_get_blob_as(self, blob, name): + return self.do_get_blob(blob, download_as=name) + def do_get_tree(self, tree): cmd = self.just_mr + ["install-cas", "%s::t" % (tree,)] tree_data = subprocess.run(cmd, diff --git a/doc/invocations-http-server/templates/blob.html b/doc/invocations-http-server/templates/blob.html index 2a64d064..d88368fe 100644 --- a/doc/invocations-http-server/templates/blob.html +++ b/doc/invocations-http-server/templates/blob.html @@ -6,5 +6,7 @@ Blob {{ name | e }} {% block content %} <h1>Blob {{ name | e }}</h1> +<a href="/blob/{{ name | e }}/{{ name | e}}">download</a> + <pre>{{ data | e}}</pre> {% endblock %} |