Source code for wheezy.web.handlers.file

"""
"""

import mimetypes
import os.path

from wheezy.http import HTTPResponse
from wheezy.http import forbidden
from wheezy.http import not_found
from wheezy.web.handlers.method import MethodHandler


HTTP_HEADER_ACCEPT_RANGE_NONE = ('Accept-Ranges', 'none')


[docs]def file_handler(root): """ Serves static files out of some directory. """ abspath = os.path.abspath(root) assert os.path.exists(abspath) assert os.path.isdir(abspath) return lambda request: FileHandler( request, root=abspath)
[docs]class FileHandler(MethodHandler): """ Serves static files out of some directory. """ def __init__(self, request, root): self.root = root super(FileHandler, self).__init__(request) def head(self): return self.get(skip_body=True) def get(self, skip_body=False): route_args = self.route_args path = route_args['path'] assert path abspath = os.path.abspath(os.path.join(self.root, path)) if not abspath.startswith(self.root): return forbidden() if not os.path.exists(abspath): return not_found() if not os.path.isfile(abspath): return forbidden() mime_type, encoding = mimetypes.guess_type(abspath) response = HTTPResponse(mime_type or 'plain/text', encoding) if not skip_body: response.headers.append(HTTP_HEADER_ACCEPT_RANGE_NONE) file = open(abspath, 'rb') try: response.write_bytes(file.read()) finally: file.close() return response