Skip to content

Commit e336fdd

Browse files
committed
Enhance parsing of Accept-Language quality values
The following cases were not possible: "Accept-Language: en-US; foo=bar; q=0.9" "Accept-Language: en-US; q = 0.9"
1 parent 7689e3f commit e336fdd

File tree

2 files changed

+17
-5
lines changed

2 files changed

+17
-5
lines changed

tornado/test/web_test.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3183,6 +3183,14 @@ def test_accept_language(self):
31833183
response = self.fetch("/", headers={"Accept-Language": "fr-FR; q=0.9"})
31843184
self.assertEqual(response.headers["Content-Language"], "fr-FR")
31853185

3186+
response = self.fetch("/", headers={"Accept-Language": "fr-FR; foo=bar; q=0.9"})
3187+
self.assertEqual(response.headers["Content-Language"], "fr-FR")
3188+
3189+
response = self.fetch(
3190+
"/", headers={"Accept-Language": "fr-FR; foo=bar; q = 0.9"}
3191+
)
3192+
self.assertEqual(response.headers["Content-Language"], "fr-FR")
3193+
31863194
def test_accept_language_ignore(self):
31873195
response = self.fetch("/", headers={"Accept-Language": "fr-FR;q=0"})
31883196
self.assertEqual(response.headers["Content-Language"], "en-US")

tornado/web.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1292,17 +1292,21 @@ def get_browser_locale(self, default: str = "en_US") -> tornado.locale.Locale:
12921292
locales = []
12931293
for language in languages:
12941294
parts = language.strip().split(";")
1295-
if len(parts) > 1 and parts[1].strip().startswith("q="):
1295+
score = 1.0
1296+
for part in (
1297+
x.split("=", 1)[1].strip()
1298+
for x in parts[1:]
1299+
if "=" in x and x.split("=", 1)[0].strip() == "q"
1300+
):
12961301
try:
1297-
score = float(parts[1].strip()[2:])
1302+
score = float(part)
12981303
if score < 0:
12991304
raise ValueError()
13001305
except (ValueError, TypeError):
13011306
score = 0.0
1302-
else:
1303-
score = 1.0
1307+
break
13041308
if score > 0:
1305-
locales.append((parts[0], score))
1309+
locales.append((parts[0].strip(), score))
13061310
if locales:
13071311
locales.sort(key=lambda pair: pair[1], reverse=True)
13081312
codes = [loc[0] for loc in locales]

0 commit comments

Comments
 (0)