Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def get_file_stats(path, encodings, stat_cache):
# Primary file has an encoding of None
files = {None: FileEntry(path, stat_cache)}
if encodings:
for encoding, alt_path in encodings.items():
try:
files[encoding] = FileEntry(alt_path, stat_cache)
except MissingFileError:
continue
return files
def get_static_file(self, path, url, stat_cache=None):
# Optimization: bail early if file does not exist
if stat_cache is None and not os.path.exists(path):
raise MissingFileError(path)
headers = Headers([])
self.add_mime_headers(headers, path, url)
self.add_cache_headers(headers, path, url)
if self.allow_all_origins:
headers["Access-Control-Allow-Origin"] = "*"
if self.add_headers_function:
self.add_headers_function(headers, path, url)
return StaticFile(
path,
headers.items(),
stat_cache=stat_cache,
encodings={"gzip": path + ".gz", "br": path + ".br"},
)
def stat_regular_file(path, stat_function):
"""
Wrap `stat_function` to raise appropriate errors if `path` is not a
regular file
"""
try:
stat_result = stat_function(path)
except KeyError:
raise MissingFileError(path)
except OSError as e:
if e.errno in (errno.ENOENT, errno.ENAMETOOLONG):
raise MissingFileError(path)
else:
raise
if not stat.S_ISREG(stat_result.st_mode):
if stat.S_ISDIR(stat_result.st_mode):
raise IsDirectoryError(u"Path is a directory: {0}".format(path))
else:
raise NotARegularFileError(u"Not a regular file: {0}".format(path))
return stat_result
def find_file(self, url):
# Optimization: bail early if the URL can never match a file
if not self.index_file and url.endswith("/"):
return
if not self.url_is_canonical(url):
return
for path in self.candidate_paths_for_url(url):
try:
return self.find_file_at_path(path, url)
except MissingFileError:
pass
def find_file_at_path_with_indexes(self, path, url):
if url.endswith("/"):
path = os.path.join(path, self.index_file)
return self.get_static_file(path, url)
elif url.endswith("/" + self.index_file):
if os.path.isfile(path):
return self.redirect(url, url[: -len(self.index_file)])
else:
try:
return self.get_static_file(path, url)
except IsDirectoryError:
if os.path.isfile(os.path.join(path, self.index_file)):
return self.redirect(url, url + "/")
raise MissingFileError(path)
def find_file_at_path(self, path, url):
if self.is_compressed_variant(path):
raise MissingFileError(path)
if self.index_file:
return self.find_file_at_path_with_indexes(path, url)
else:
return self.get_static_file(path, url)
headers.append(("Location", quote(location.encode("utf8"))))
self.response = Response(HTTPStatus.FOUND, headers, None)
def get_response(self, method, request_headers):
return self.response
class NotARegularFileError(Exception):
pass
class MissingFileError(NotARegularFileError):
pass
class IsDirectoryError(MissingFileError):
pass
class FileEntry(object):
def __init__(self, path, stat_cache=None):
stat_function = os.stat if stat_cache is None else stat_cache.__getitem__
self.stat = self.stat_regular_file(path, stat_function)
self.path = path
@staticmethod
def stat_regular_file(path, stat_function):
"""
Wrap `stat_function` to raise appropriate errors if `path` is not a
regular file
"""
try: