From 08156558afdd37fdf2bb62a97e1814aab1f21945 Mon Sep 17 00:00:00 2001 From: Bryan Newbold Date: Thu, 22 Oct 2020 19:01:13 -0700 Subject: web: basic Accept-Language HTTP negotiation --- fatcat_scholar/hacks.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'fatcat_scholar/hacks.py') diff --git a/fatcat_scholar/hacks.py b/fatcat_scholar/hacks.py index 710a25f..fc16564 100644 --- a/fatcat_scholar/hacks.py +++ b/fatcat_scholar/hacks.py @@ -51,3 +51,29 @@ class Jinja2Templates: media_type=media_type, background=background, ) + + +def parse_accept_lang(header: str, options: typing.List[str]) -> typing.Optional[str]: + """ + Crude HTTP Accept-Language content negotiation. + Assumes that languages are specified in order of priority, etc. + """ + if not header: + return None + chunks = [v.split(";")[0].split("-")[0] for v in header.split(",")] + for c in chunks: + if len(c) == 2 and c in options: + return c + return None + + +def test_parse_accept_lang() -> None: + assert parse_accept_lang("", []) == None + assert parse_accept_lang("en,de", []) == None + assert parse_accept_lang("en,de", ["en"]) == "en" + assert parse_accept_lang("en-GB,de", ["en"]) == "en" + assert parse_accept_lang("en,de", ["de"]) == "de" + assert ( + parse_accept_lang("en-ca,en;q=0.8,en-us;q=0.6,de-de;q=0.4,de;q=0.2", ["de"]) + == "de" + ) -- cgit v1.2.3