You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
2.0 KiB
60 lines
2.0 KiB
content_types = { |
|
'css': 'text/css', |
|
'gif': 'image/gif', |
|
'html': 'text/html', |
|
'jpg': 'image/jpeg', |
|
'js': 'application/javascript', |
|
'json': 'application/json', |
|
'png': 'image/png', |
|
'txt': 'text/plain', |
|
} |
|
|
|
|
|
def get_static_file(path, static_files): |
|
"""Return the local filename and content type for the requested static |
|
file URL. |
|
|
|
:param path: the path portion of the requested URL. |
|
:param static_files: a static file configuration dictionary. |
|
|
|
This function returns a dictionary with two keys, "filename" and |
|
"content_type". If the requested URL does not match any static file, the |
|
return value is None. |
|
""" |
|
extra_path = '' |
|
if path in static_files: |
|
f = static_files[path] |
|
else: |
|
f = None |
|
while path != '': |
|
path, last = path.rsplit('/', 1) |
|
extra_path = '/' + last + extra_path |
|
if path in static_files: |
|
f = static_files[path] |
|
break |
|
elif path + '/' in static_files: |
|
f = static_files[path + '/'] |
|
break |
|
if f: |
|
if isinstance(f, str): |
|
f = {'filename': f} |
|
else: |
|
f = f.copy() # in case it is mutated below |
|
if f['filename'].endswith('/') and extra_path.startswith('/'): |
|
extra_path = extra_path[1:] |
|
f['filename'] += extra_path |
|
if f['filename'].endswith('/'): |
|
if '' in static_files: |
|
if isinstance(static_files[''], str): |
|
f['filename'] += static_files[''] |
|
else: |
|
f['filename'] += static_files['']['filename'] |
|
if 'content_type' in static_files['']: |
|
f['content_type'] = static_files['']['content_type'] |
|
else: |
|
f['filename'] += 'index.html' |
|
if 'content_type' not in f: |
|
ext = f['filename'].rsplit('.')[-1] |
|
f['content_type'] = content_types.get( |
|
ext, 'application/octet-stream') |
|
return f
|
|
|