28 lines
984 B
Python
28 lines
984 B
Python
from flask import request, current_app, url_for
|
|
from urllib.parse import urlsplit, urlunsplit
|
|
|
|
|
|
def prefixed_url_for(endpoint, **values):
|
|
prefix = request.headers.get('X-Forwarded-Prefix', '')
|
|
scheme = request.headers.get('X-Forwarded-Proto', request.scheme)
|
|
host = request.headers.get('Host', request.host)
|
|
|
|
external = values.pop('_external', False)
|
|
generated_url = url_for(endpoint, **values)
|
|
|
|
if external:
|
|
path, query, fragment = urlsplit(generated_url)[2:5]
|
|
# Check if the prefix is already present in the path
|
|
if prefix and not path.startswith(prefix):
|
|
new_path = prefix + path
|
|
else:
|
|
new_path = path
|
|
return urlunsplit((scheme, host, new_path, query, fragment))
|
|
else:
|
|
# Check if the prefix is already present in the generated URL
|
|
if prefix and not generated_url.startswith(prefix):
|
|
return prefix + generated_url
|
|
else:
|
|
return generated_url
|
|
|