Skip to content

Commit b292f0f

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 4ca9618 commit b292f0f

File tree

2 files changed

+15
-5
lines changed

2 files changed

+15
-5
lines changed

tornado/test/web_test.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3183,6 +3183,12 @@ 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("/", headers={"Accept-Language": "fr-FR; foo=bar; q = 0.9"})
3190+
self.assertEqual(response.headers["Content-Language"], "fr-FR")
3191+
31863192
def test_accept_language_ignore(self):
31873193
response = self.fetch("/", headers={"Accept-Language": "fr-FR;q=0"})
31883194
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
@@ -1286,17 +1286,21 @@ def get_browser_locale(self, default: str = "en_US") -> tornado.locale.Locale:
12861286
locales = []
12871287
for language in languages:
12881288
parts = language.strip().split(";")
1289-
if len(parts) > 1 and parts[1].strip().startswith("q="):
1289+
score = 1.0
1290+
for part in (
1291+
x.split("=", 1)[1].strip()
1292+
for x in parts[1:]
1293+
if "=" in x and x.split("=", 1)[0].strip() == "q"
1294+
):
12901295
try:
1291-
score = float(parts[1].strip()[2:])
1296+
score = float(part)
12921297
if score < 0:
12931298
raise ValueError()
12941299
except (ValueError, TypeError):
12951300
score = 0.0
1296-
else:
1297-
score = 1.0
1301+
break
12981302
if score > 0:
1299-
locales.append((parts[0], score))
1303+
locales.append((parts[0].strip(), score))
13001304
if locales:
13011305
locales.sort(key=lambda pair: pair[1], reverse=True)
13021306
codes = [loc[0] for loc in locales]

0 commit comments

Comments
 (0)