Coverage for /pythoncovmergedfiles/medio/medio/src/httplib2/httplib2/auth.py: 51%
Shortcuts on this page
r m x toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
Shortcuts on this page
r m x toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1import re
3import pyparsing as pp
5from .error import MalformedHeader
8UNQUOTE_PAIRS = re.compile(r"\\(.)")
9unquote = lambda s, _, t: UNQUOTE_PAIRS.sub(r"\1", t[0][1:-1])
11# https://tools.ietf.org/html/rfc7235#section-1.2
12# https://tools.ietf.org/html/rfc7235#appendix-B
13tchar = "!#$%&'*+-.^_`|~" + pp.nums + pp.alphas
14token = pp.Word(tchar).set_name("token")
15token68 = pp.Combine(pp.Word("-._~+/" + pp.nums + pp.alphas) + pp.Optional(pp.Word("=").leave_whitespace())).set_name(
16 "token68"
17)
19quoted_string = pp.dbl_quoted_string.copy().set_name("quoted-string").set_parse_action(unquote)
20auth_param_name = token.copy().set_name("auth-param-name").add_parse_action(pp.common.downcase_tokens)
21auth_param = auth_param_name + pp.Suppress("=") + (quoted_string | token)
22params = pp.Dict(pp.DelimitedList(pp.Group(auth_param)))
24scheme = token("scheme")
25challenge = scheme + (params("params") | token68("token"))
27authentication_info = params.copy()
28www_authenticate = pp.DelimitedList(pp.Group(challenge))
31def _parse_authentication_info(headers, headername="authentication-info"):
32 """https://tools.ietf.org/html/rfc7615
33 """
34 header = headers.get(headername, "").strip()
35 if not header:
36 return {}
37 try:
38 parsed = authentication_info.parse_string(header)
39 except pp.ParseException:
40 # print(ex.explain(ex))
41 raise MalformedHeader(headername)
43 return parsed.as_dict()
46def _parse_www_authenticate(headers, headername="www-authenticate"):
47 """Returns a dictionary of dictionaries, one dict per auth_scheme."""
48 header = headers.get(headername, "").strip()
49 if not header:
50 return {}
51 try:
52 parsed = www_authenticate.parse_string(header)
53 except pp.ParseException:
54 # print(ex.explain(ex))
55 raise MalformedHeader(headername)
57 retval = {
58 challenge["scheme"].lower(): challenge["params"].as_dict()
59 if "params" in challenge
60 else {"token": challenge.get("token")}
61 for challenge in parsed
62 }
63 return retval