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
8try: # pyparsing>=3.0.0
9 downcaseTokens = pp.common.downcaseTokens
10except AttributeError:
11 downcaseTokens = pp.downcaseTokens
13UNQUOTE_PAIRS = re.compile(r"\\(.)")
14unquote = lambda s, _, t: UNQUOTE_PAIRS.sub(r"\1", t[0][1:-1])
16# https://tools.ietf.org/html/rfc7235#section-1.2
17# https://tools.ietf.org/html/rfc7235#appendix-B
18tchar = "!#$%&'*+-.^_`|~" + pp.nums + pp.alphas
19token = pp.Word(tchar).setName("token")
20token68 = pp.Combine(pp.Word("-._~+/" + pp.nums + pp.alphas) + pp.Optional(pp.Word("=").leaveWhitespace())).setName(
21 "token68"
22)
24quoted_string = pp.dblQuotedString.copy().setName("quoted-string").setParseAction(unquote)
25auth_param_name = token.copy().setName("auth-param-name").addParseAction(downcaseTokens)
26auth_param = auth_param_name + pp.Suppress("=") + (quoted_string | token)
27params = pp.Dict(pp.delimitedList(pp.Group(auth_param)))
29scheme = token("scheme")
30challenge = scheme + (params("params") | token68("token"))
32authentication_info = params.copy()
33www_authenticate = pp.delimitedList(pp.Group(challenge))
36def _parse_authentication_info(headers, headername="authentication-info"):
37 """https://tools.ietf.org/html/rfc7615
38 """
39 header = headers.get(headername, "").strip()
40 if not header:
41 return {}
42 try:
43 parsed = authentication_info.parseString(header)
44 except pp.ParseException:
45 # print(ex.explain(ex))
46 raise MalformedHeader(headername)
48 return parsed.asDict()
51def _parse_www_authenticate(headers, headername="www-authenticate"):
52 """Returns a dictionary of dictionaries, one dict per auth_scheme."""
53 header = headers.get(headername, "").strip()
54 if not header:
55 return {}
56 try:
57 parsed = www_authenticate.parseString(header)
58 except pp.ParseException:
59 # print(ex.explain(ex))
60 raise MalformedHeader(headername)
62 retval = {
63 challenge["scheme"].lower(): challenge["params"].asDict()
64 if "params" in challenge
65 else {"token": challenge.get("token")}
66 for challenge in parsed
67 }
68 return retval