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
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
2from typing import Union
4try:
5 import idna as idna2008
6except ImportError:
7 idna2008 = None
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')
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')
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)
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')
56__all__ = ['ascii_bytes', 'maybe_str', 'parse_name']