Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.11/site-packages/pycares/utils.py: 29%

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

42 statements  

1 

2from typing import Union 

3 

4try: 

5 import idna as idna2008 

6except ImportError: 

7 idna2008 = None 

8 

9 

10def ascii_bytes(data): 

11 if isinstance(data, str): 

12 return data.encode('ascii') 

13 if isinstance(data, bytes): 

14 return data 

15 raise TypeError('only str (ascii encoding) and bytes are supported') 

16 

17 

18def maybe_str(data): 

19 if isinstance(data, str): 

20 return data 

21 if isinstance(data, bytes): 

22 try: 

23 return data.decode('ascii') 

24 except UnicodeDecodeError: 

25 return data 

26 raise TypeError('only str (ascii encoding) and bytes are supported') 

27 

28 

29def parse_name_idna2008(name: str) -> str: 

30 parts = name.split('.') 

31 r = [] 

32 for part in parts: 

33 if part.isascii(): 

34 r.append(part.encode('ascii')) 

35 elif len(part) > 253: 

36 raise RuntimeError( 

37 f"domains can only be less than 253 characters in length not {len(name)}" 

38 ) 

39 else: 

40 r.append(idna2008.encode(part)) 

41 return b'.'.join(r) 

42 

43 

44def parse_name(name: Union[str, bytes]) -> bytes: 

45 if isinstance(name, str): 

46 if name.isascii(): 

47 return name.encode('ascii') 

48 if idna2008 is not None: 

49 return parse_name_idna2008(name) 

50 return name.encode('idna') 

51 if isinstance(name, bytes): 

52 return name 

53 raise TypeError('only str and bytes are supported') 

54 

55 

56__all__ = ['ascii_bytes', 'maybe_str', 'parse_name'] 

57