diff --git a/tornado/test/web_test.py b/tornado/test/web_test.py index 396ba6dafb..8eeecac2f6 100644 --- a/tornado/test/web_test.py +++ b/tornado/test/web_test.py @@ -3183,6 +3183,14 @@ def test_accept_language(self): response = self.fetch("/", headers={"Accept-Language": "fr-FR; q=0.9"}) self.assertEqual(response.headers["Content-Language"], "fr-FR") + response = self.fetch("/", headers={"Accept-Language": "fr-FR; foo=bar; q=0.9"}) + self.assertEqual(response.headers["Content-Language"], "fr-FR") + + response = self.fetch( + "/", headers={"Accept-Language": "fr-FR; foo=bar; q = 0.9"} + ) + self.assertEqual(response.headers["Content-Language"], "fr-FR") + def test_accept_language_ignore(self): response = self.fetch("/", headers={"Accept-Language": "fr-FR;q=0"}) self.assertEqual(response.headers["Content-Language"], "en-US") diff --git a/tornado/web.py b/tornado/web.py index cd6a81b4b5..7579b657d5 100644 --- a/tornado/web.py +++ b/tornado/web.py @@ -1292,17 +1292,24 @@ def get_browser_locale(self, default: str = "en_US") -> tornado.locale.Locale: locales = [] for language in languages: parts = language.strip().split(";") - if len(parts) > 1 and parts[1].strip().startswith("q="): + score = 1.0 + for part in parts[1:]: try: - score = float(parts[1].strip()[2:]) + pname, part = part.split("=", 1) + except ValueError: + continue + if pname.strip() != "q": + continue + part = part.strip() + try: + score = float(part) if score < 0: raise ValueError() except (ValueError, TypeError): score = 0.0 - else: - score = 1.0 + break if score > 0: - locales.append((parts[0], score)) + locales.append((parts[0].strip(), score)) if locales: locales.sort(key=lambda pair: pair[1], reverse=True) codes = [loc[0] for loc in locales]