diff --git a/src/securescaffold/tests/test_views.py b/src/securescaffold/tests/test_views.py index 92b5d4c..b31cfec 100644 --- a/src/securescaffold/tests/test_views.py +++ b/src/securescaffold/tests/test_views.py @@ -21,6 +21,7 @@ demo_app = flask.Flask(__name__) demo_app.add_url_rule("/", "home", securescaffold.views.lang_redirect) +demo_app.add_url_rule("/", view_func=securescaffold.views.lang_redirect) locale_test_data = [ # LOCALES, Accept-Language header, expected redirect @@ -90,3 +91,17 @@ def test_redirect_with_query_preserves_original_query(self): self.assertEqual(response.status_code, 302) self.assertEqual(response.location, "/test?baz=qux&foo=bar") + + def test_redirect_preserves_path(self): + client = demo_app.test_client() + response = client.get("/foo") + + self.assertEqual(response.status_code, 302) + self.assertEqual(response.location, "/intl/en/foo") + + def test_redirect_preserves_path_and_query(self): + client = demo_app.test_client() + response = client.get("/foo", query_string={"bar": "baz"}) + + self.assertEqual(response.status_code, 302) + self.assertEqual(response.location, "/intl/en/foo?bar=baz") diff --git a/src/securescaffold/views.py b/src/securescaffold/views.py index 5de1852..d8accfd 100644 --- a/src/securescaffold/views.py +++ b/src/securescaffold/views.py @@ -20,7 +20,7 @@ DEFAULT_LANGS = ["en"] -DEFAULT_LANGS_REDIRECT_TO = "/intl/{locale}/" +DEFAULT_LANGS_REDIRECT_TO = "/intl/{locale}{path}" def best_match(requested_langs: LanguageAccept, supported_langs: list) -> Optional[str]: @@ -56,7 +56,7 @@ def add_query_to_url(path: str, qs: str) -> str: return urllib.parse.urlunsplit(parsed) -def lang_redirect(): +def lang_redirect(path: str = ""): """Redirects the user depending on the Accept-Language header. Use this with @flask.before_request or as a view. @@ -73,7 +73,7 @@ def lang_redirect(): else: locale = DEFAULT_LANGS[0] - redirect_to = locales_redirect_to.format(locale=locale) + redirect_to = locales_redirect_to.format(locale=locale, path=flask.request.path) if flask.request.query_string: # Preserve query parameters on redirect.