Skip to content

Commit 1130647

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 1130647

File tree

2 files changed

+16
-5
lines changed

2 files changed

+16
-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: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1292,17 +1292,20 @@ 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 parts[1:]:
1297+
if "=" not in part or part.split("=", 1)[0].strip() != "q":
1298+
continue
1299+
part = part.split("=", 1)[1].strip()
12961300
try:
1297-
score = float(parts[1].strip()[2:])
1301+
score = float(part)
12981302
if score < 0:
12991303
raise ValueError()
13001304
except (ValueError, TypeError):
13011305
score = 0.0
1302-
else:
1303-
score = 1.0
1306+
break
13041307
if score > 0:
1305-
locales.append((parts[0], score))
1308+
locales.append((parts[0].strip(), score))
13061309
if locales:
13071310
locales.sort(key=lambda pair: pair[1], reverse=True)
13081311
codes = [loc[0] for loc in locales]

0 commit comments

Comments
 (0)