From c6653ffcfb7e52c1fbba2b9894573d8d1520af88 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Sat, 6 Jan 2024 18:15:40 +0000 Subject: [PATCH] web: Consolidate code to deliver files Signed-off-by: Michael Tremer --- src/web/base.py | 32 ++++++++++++++++++++++++++++++++ src/web/docs.py | 8 ++------ src/web/users.py | 19 ++----------------- 3 files changed, 36 insertions(+), 23 deletions(-) diff --git a/src/web/base.py b/src/web/base.py index 468e2139..57dd07dd 100644 --- a/src/web/base.py +++ b/src/web/base.py @@ -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): diff --git a/src/web/docs.py b/src/web/docs.py index 79a9986b..e657302a 100644 --- a/src/web/docs.py +++ b/src/web/docs.py @@ -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): diff --git a/src/web/users.py b/src/web/users.py index 45e87de4..003caebb 100644 --- a/src/web/users.py +++ b/src/web/users.py @@ -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 -- 2.39.5