summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrederick Yin <fkfd@macaw.me>2020-07-10 20:30:54 +0800
committerFrederick Yin <fkfd@macaw.me>2020-07-10 20:30:54 +0800
commit109ec9a7d86bcadb16541873d95068f737586692 (patch)
tree405116ed82038be22f8fb0a234f57ebd1dc65400
parenteb1bd1e074b81a428cb689d3a381e86e2fd530dd (diff)
Enhance blob view
Changes: - set maximum size of displayable blobs - raw blobs are now of type `bytes` - do not try to decode handle binary blobs
-rw-r--r--git-gmi/const.py3
-rw-r--r--git-gmi/gateway.py3
-rw-r--r--git-gmi/git.py25
3 files changed, 23 insertions, 8 deletions
diff --git a/git-gmi/const.py b/git-gmi/const.py
index 44818c6..f1f757f 100644
--- a/git-gmi/const.py
+++ b/git-gmi/const.py
@@ -2,4 +2,5 @@ STATUS_SUCCESS = "20"
STATUS_NOT_FOUND = "51 NOT FOUND"
STATUS_TEMPORARY_FAILURE = "40 TEMPORARY FAILURE"
META_GEMINI = "text/gemini"
-META_PLAINTEXT = "text/plain" \ No newline at end of file
+META_PLAINTEXT = "text/plain"
+MAX_DISPLAYED_BLOB_SIZE = 500 * 1024 # 500KB
diff --git a/git-gmi/gateway.py b/git-gmi/gateway.py
index 29f0268..b0c9b0a 100644
--- a/git-gmi/gateway.py
+++ b/git-gmi/gateway.py
@@ -2,6 +2,7 @@ from git import *
from const import *
from config import *
from os import environ, listdir
+import sys
# be careful when using print(); stdout is passed to the client.
# this cgi uses \n as newline.
@@ -56,7 +57,7 @@ def handle_cgi_request(path: str, query: str):
except FileNotFoundError: # is file
try:
if query == "raw":
- print(repo.view_raw_blob(branch, location))
+ sys.stdout.buffer.write(repo.view_raw_blob(branch, location))
else:
print(repo.view_blob(branch, location))
except FileNotFoundError:
diff --git a/git-gmi/git.py b/git-gmi/git.py
index 3de904e..f249ec5 100644
--- a/git-gmi/git.py
+++ b/git-gmi/git.py
@@ -263,16 +263,29 @@ class GitGmiRepo:
f"{STATUS_SUCCESS} {META_GEMINI}\r\n"
+ self.generate_header()
+ f"## {self.name}/{'/'.join(location)} | {convert_filesize(blob.size)}\n\n"
- f"=> {blob.name}?raw view raw\n\n"
- f"```\n"
)
- response += blob.data.decode("utf-8") + "\n```"
+
+ if blob.is_binary:
+ response += (
+ "This file seems to be binary. Open link below to download.\n"
+ f"=> {blob.name}?raw download"
+ )
+ elif blob.size < MAX_DISPLAYED_BLOB_SIZE:
+ response += (
+ f"=> {blob.name}?raw view raw\n\n"
+ "```\n" + blob.data.decode("utf-8") + "\n```"
+ )
+ else:
+ response += (
+ "This file is too large to be displayed. Open link below to download.\n"
+ f"=> {blob.name}?raw download\n\n"
+ )
return response
- def view_raw_blob(self, branch: str, location=[]) -> str:
+ def view_raw_blob(self, branch: str, location=[]) -> bytes:
blob = self.get_blob(branch, location)
# if mimetypes can't make out the type, set it to plaintext
guessed_mimetype = mimetypes.guess_type(blob.name)[0] or META_PLAINTEXT
- response = f"{STATUS_SUCCESS} {guessed_mimetype}\r\n"
- response += blob.data.decode("utf-8")
+ response = bytes(f"{STATUS_SUCCESS} {guessed_mimetype}\r\n", encoding="utf-8")
+ response += blob.data
return response