on master help sign in
Merge pull request #2656 from return42/fix-url_for

[fix] url_for(..., _external=True) in templates

commit7089526723394e7492762b7e5cdd112e1da28990 authorAlexandre Flament <alex@al-f.net> dateMon 5 Apr 2021, 14:50 (6 years ago) parentba90c5a87e4c47
2 files changed+32−24
searx/templates/__common__/opensearch.xml+2−2 searx/webapp.py+30−22
searx/templates/__common__/opensearch.xml+2−2
@@ -3,7 +3,7 @@
33 <ShortName>{{ instance_name }}</ShortName>
44 <Description>a privacy-respecting, hackable metasearch engine</Description>
55 <InputEncoding>UTF-8</InputEncoding>
6− <Image>{{ urljoin(host, url_for('static', filename='img/favicon.png')) }}</Image>
6+ <Image>{{ url_for('static', filename='img/favicon.png', _external=True) }}</Image>
77 <LongName>searx metasearch</LongName>
88 {% if opensearch_method == 'get' %}
99 <Url rel="results" type="text/html" method="get" template="{{ url_for('search', _external=True) }}?q={searchTerms}"/>
@@ -13,7 +13,7 @@
1313 </Url>
1414 {% endif %}
1515 {% if autocomplete %}
16− <Url rel="suggestions" type="application/x-suggestions+json" template="{{ host }}autocompleter?q={searchTerms}"/>
16+ <Url rel="suggestions" type="application/x-suggestions+json" template="{{ url_for('autocompleter', _external=True) }}?q={searchTerms}"/>
1717 {% endif %}
1818
1919 <Url type="application/opensearchdescription+xml"
searx/webapp.py+30−22
@@ -40,7 +40,7 @@ from datetime import datetime, timedelta
4040from time import time
4141from html import escape
4242from io import StringIO
43−from urllib.parse import urlencode, urljoin, urlparse
43+from urllib.parse import urlencode, urlparse
4444
4545from pygments import highlight
4646from pygments.lexers import get_lexer_by_name
@@ -270,14 +270,7 @@ def extract_domain(url):
270270
271271
272272def get_base_url():
273− if settings['server']['base_url']:
274− hostname = settings['server']['base_url']
275− else:
276− scheme = 'http'
277− if request.is_secure:
278− scheme = 'https'
279− hostname = url_for('index', _external=True, _scheme=scheme)
280− return hostname
273+ return url_for('index', _external=True)
281274
282275
283276def get_current_theme_name(override=None):
@@ -310,10 +303,6 @@ def url_for_theme(endpoint, override_theme=None, **values):
310303 if filename_with_theme in static_files:
311304 values['filename'] = filename_with_theme
312305 url = url_for(endpoint, **values)
313− if settings['server']['base_url']:
314− if url.startswith('/'):
315− url = url[1:]
316− url = urljoin(settings['server']['base_url'], url)
317306 return url
318307
319308
@@ -824,7 +813,7 @@ def preferences():
824813
825814 # save preferences
826815 if request.method == 'POST':
827− resp = make_response(redirect(urljoin(settings['server']['base_url'], url_for('index'))))
816+ resp = make_response(url_for('index', _external=True))
828817 try:
829818 request.preferences.parse_form(request.form)
830819 except ValidationException:
@@ -1013,11 +1002,11 @@ def opensearch():
10131002 if request.headers.get('User-Agent', '').lower().find('webkit') >= 0:
10141003 method = 'get'
10151004
1016− ret = render('opensearch.xml',
1017− opensearch_method=method,
1018− host=get_base_url(),
1019− urljoin=urljoin,
1020− override_theme='__common__')
1005+ ret = render(
1006+ 'opensearch.xml',
1007+ opensearch_method=method,
1008+ override_theme='__common__'
1009+ )
10211010
10221011 resp = Response(response=ret,
10231012 status=200,
@@ -1038,7 +1027,7 @@ def favicon():
10381027
10391028@app.route('/clear_cookies')
10401029def clear_cookies():
1041− resp = make_response(redirect(urljoin(settings['server']['base_url'], url_for('index'))))
1030+ resp = make_response(redirect(url_for('index', _external=True)))
10421031 for cookie_name in request.cookies:
10431032 resp.delete_cookie(cookie_name)
10441033 return resp
@@ -1131,19 +1120,38 @@ class ReverseProxyPathFix:
11311120 '''
11321121
11331122 def __init__(self, app):
1123+
11341124 self.app = app
1125+ self.script_name = None
1126+ self.scheme = None
1127+ self.server = None
1128+
1129+ if settings['server']['base_url']:
1130+
1131+ # If base_url is specified, then these values from are given
1132+ # preference over any Flask's generics.
1133+
1134+ base_url = urlparse(settings['server']['base_url'])
1135+ self.script_name = base_url.path
1136+ self.scheme = base_url.scheme
1137+ self.server = base_url.netloc
11351138
11361139 def __call__(self, environ, start_response):
1137− script_name = environ.get('HTTP_X_SCRIPT_NAME', '')
1140+
1141+ script_name = self.script_name or environ.get('HTTP_X_SCRIPT_NAME', '')
11381142 if script_name:
11391143 environ['SCRIPT_NAME'] = script_name
11401144 path_info = environ['PATH_INFO']
11411145 if path_info.startswith(script_name):
11421146 environ['PATH_INFO'] = path_info[len(script_name):]
11431147
1144− scheme = environ.get('HTTP_X_SCHEME', '')
1148+ scheme = self.scheme or environ.get('HTTP_X_SCHEME', '')
11451149 if scheme:
11461150 environ['wsgi.url_scheme'] = scheme
1151+
1152+ server = self.server or environ.get('HTTP_X_FORWARDED_HOST', '')
1153+ if server:
1154+ environ['HTTP_HOST'] = server
11471155 return self.app(environ, start_response)
11481156
11491157