]> git.ipfire.org Git - ipfire.org.git/commitdiff
web: Consolidate code to deliver files
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 6 Jan 2024 18:15:40 +0000 (18:15 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 6 Jan 2024 18:15:40 +0000 (18:15 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/web/base.py
src/web/docs.py
src/web/users.py

index 468e21391f624b05ebcd9a023c2d632f26d442e7..57dd07dd95c69f3839fc5b1772ca657e6b5caf3b 100644 (file)
@@ -7,6 +7,8 @@ import functools
 import http.client
 import ipaddress
 import logging
+import magic
+import mimetypes
 import time
 import tornado.locale
 import tornado.web
@@ -193,6 +195,36 @@ class BaseHandler(tornado.web.RequestHandler):
                except KeyError:
                        return None
 
+       # Initialize libmagic
+       magic = magic.Magic(mime=True, uncompress=True)
+
+       # File
+
+       def _deliver_file(self, data, filename=None, prefix=None):
+               # Guess content type
+               mimetype = self.magic.from_buffer(data)
+
+               # Send the mimetype
+               self.set_header("Content-Type", mimetype or "application/octet-stream")
+
+               # Fetch the file extension
+               if not filename and prefix:
+                       ext = mimetypes.guess_extension(mimetype)
+
+                       # Compose a new filename
+                       filename = "%s%s" % (prefix, ext)
+
+               # Set filename
+               if filename:
+                       self.set_header("Content-Disposition", "inline; filename=\"%s\"" % filename)
+
+               # Set size
+               if data:
+                       self.set_header("Content-Length", len(data))
+
+               # Deliver payload
+               self.finish(data)
+
        # Login stuff
 
        def get_current_user(self):
index 79a9986bdc97ce2b0b491dcdfc12219f52f001f3..e657302a9c971992f9fc66c259bded6f3532a54b 100644 (file)
@@ -142,15 +142,11 @@ class FileHandler(base.BaseHandler):
                else:
                        blob = file.blob
 
-               # Set headers
-               self.set_header("Content-Type", file.mimetype or "application/octet-stream")
-               self.set_header("Content-Length", len(blob))
-
                # Set expires
                self.set_expires(3600)
 
-               # Deliver content
-               self.finish(blob)
+               # Send the payload
+               self._deliver_file(blob, filename=file.filename)
 
 
 class EditHandler(base.BaseHandler):
index 45e87de4b4a53b95635c8634b3c7c2dcf8ceb172..003caebbbeea280b76c345d452874d434fa729be 100644 (file)
@@ -4,8 +4,6 @@ import PIL
 import io
 import ldap
 import logging
-import magic
-import mimetypes
 import os.path
 import tornado.web
 
@@ -81,21 +79,8 @@ class AvatarHandler(base.BaseHandler):
                        # Generate a random avatar with only one letter
                        avatar = await self._get_avatar(account, size=size, format=format)
 
-               m = magic.Magic(mime=True, uncompress=True)
-
-               # Guess content type
-               mimetype = m.from_buffer(avatar)
-
-               # Fetch the file extension
-               ext = mimetypes.guess_extension(mimetype)
-
-               # Set headers about content
-               self.set_header("Content-Disposition", "inline; filename=\"%s%s\"" % (account.uid, ext))
-               if mimetype:
-                       self.set_header("Content-Type", mimetype)
-
-               # Deliver payload
-               self.finish(avatar)
+               # Deliver the data
+               self._deliver_file(avatar, prefix=account.uid)
 
        async def _get_avatar(self, account, size=None, format=None, **args):
                letters = account.initials