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

39 statements  

1import re 

2 

3import pyparsing as pp 

4 

5from .error import MalformedHeader 

6 

7 

8try: # pyparsing>=3.0.0 

9 downcaseTokens = pp.common.downcaseTokens 

10except AttributeError: 

11 downcaseTokens = pp.downcaseTokens 

12 

13UNQUOTE_PAIRS = re.compile(r"\\(.)") 

14unquote = lambda s, _, t: UNQUOTE_PAIRS.sub(r"\1", t[0][1:-1]) 

15 

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) 

23 

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))) 

28 

29scheme = token("scheme") 

30challenge = scheme + (params("params") | token68("token")) 

31 

32authentication_info = params.copy() 

33www_authenticate = pp.delimitedList(pp.Group(challenge)) 

34 

35 

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) 

47 

48 return parsed.asDict() 

49 

50 

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) 

61 

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