Browse Source

#243: static file server

Rafał Pitoń 11 years ago
parent
commit
423a9302c3
1 changed files with 46 additions and 0 deletions
  1. 46 0
      misago/core/fileserver.py

+ 46 - 0
misago/core/fileserver.py

@@ -0,0 +1,46 @@
+import os
+
+from django.conf import settings
+from django.http import HttpResponse, StreamingHttpResponse
+
+
+SERVED_PATHS = (
+    settings.MISAGO_ATTACHMENTS_ROOT,
+    settings.MISAGO_AVATAR_CACHE,
+)
+
+
+def send_file(file_path, content_type, attachment=None):
+    file_size = os.path.getsize(file_path)
+
+    if settings.MISAGO_SENDFILE_HEADER:
+        return send_header(file_path, content_type, file_size, attachment)
+    else:
+        return send_stream(file_path, content_type, file_size, attachment)
+
+
+def send_header(file_path, content_type, file_size, attachment=None):
+    if settings.MISAGO_SENDFILE_LOCATIONS_PATH:
+        for path in SERVED_PATHS:
+            if file_path.startswith(path):
+                file_path = file_path[len(path):]
+                file_path = '/%s' % settings.MISAGO_SENDFILE_LOCATIONS_PATH
+                break
+
+    response = HttpResponse()
+    response[settings.MISAGO_SENDFILE_HEADER] = file_path
+    del response['Content-Type']
+
+    return response
+
+
+def send_stream(file_path, content_type, file_size, attachment=None):
+    response = StreamingHttpResponse(open(file_path, 'r'))
+
+    response['Content-Type'] = content_type
+    response['Content-Length'] = file_size
+    if attachment:
+        header = 'attachment; filename="%s"' % attachment
+        response['Content-Disposition'] = header
+
+    return response