Skip to content

Commit

Permalink
Merge pull request #9 from alex-oleshkevich/issue-8
Browse files Browse the repository at this point in the history
Fix accept header parsing
  • Loading branch information
alex-oleshkevich authored Nov 30, 2024
2 parents db1951b + d2a9d14 commit e1390cf
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 7 deletions.
9 changes: 6 additions & 3 deletions starlette_babel/locale.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,13 +106,16 @@ def __call__(self, conn: HTTPConnection) -> str | None:
def _get_languages_from_header(self, header: str) -> list[tuple[str, float]]:
parts = header.split(",")
result = []
priority = 1.0
for part in parts:
if ";" in part:
locale, priority_ = part.split(";")
priority = float(priority_[2:])
locale, *priorities = part.split(";")
try:
priority = float(priorities[0][2:])
except ValueError:
pass
else:
locale = part
priority = 1.0
result.append((locale, priority))
return sorted(result, key=lambda x: x[1], reverse=True)

Expand Down
18 changes: 14 additions & 4 deletions tests/test_locale.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import pytest
from babel import Locale
from starlette.requests import HTTPConnection, Request
from starlette.responses import JSONResponse
Expand Down Expand Up @@ -46,12 +47,21 @@ def test_locale_middleware_detects_locale_from_cookie_using_custom_name() -> Non
assert client.get("/").json() == ["be", "BY"]


def test_locale_middleware_detects_locale_from_header() -> None:
@pytest.mark.parametrize(
"header",
(
"en-US,en;q=0.9,ru-BY;q=0.8,ru;q=0.7,be-BY;q=0.6,be;q=0.5,pl;q=0.4,de;q=0.3",
"en-US,en;q=0.9;q=0.8,ru-BY;q=0.8,ru;q=0.7,be-BY;q=0.6,be;q=0.5,pl;q=0.4,de;q=0.3",
"be_BY;q=0.9;q=0.8",
"be_BY;q=",
"be_BY;",
"be_BY",
),
)
def test_locale_middleware_detects_locale_from_header(header: str) -> None:
"""It should read and set locale from the accept-language header."""
client = TestClient(LocaleMiddleware(app, locales=["be_BY"]))
assert client.get(
"/", headers={"accept-language": "en-US,en;q=0.9,ru-BY;q=0.8,ru;q=0.7,be-BY;q=0.6,be;q=0.5,pl;q=0.4,de;q=0.3"}
).json() == ["be", "BY"]
assert client.get("/", headers={"accept-language": header}).json() == ["be", "BY"]


def test_locale_middleware_detects_locale_from_header_with_wildcard() -> None:
Expand Down

0 comments on commit e1390cf

Please sign in to comment.