Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.11/site-packages/yarl/_quoters.py: 65%

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

26 statements  

1"""Quoting and unquoting utilities for URL parts.""" 

2 

3from urllib.parse import quote 

4 

5from ._quoting import _Quoter, _Unquoter 

6 

7QUOTER = _Quoter(requote=False) 

8REQUOTER = _Quoter() 

9PATH_QUOTER = _Quoter(safe="@:", protected="/+", requote=False) 

10PATH_REQUOTER = _Quoter(safe="@:", protected="/+") 

11QUERY_QUOTER = _Quoter(safe="?/:@", protected="=+&;", qs=True, requote=False) 

12QUERY_REQUOTER = _Quoter(safe="?/:@", protected="=+&;", qs=True) 

13QUERY_PART_QUOTER = _Quoter(safe="?/:@", qs=True, requote=False) 

14FRAGMENT_QUOTER = _Quoter(safe="?/:@", requote=False) 

15FRAGMENT_REQUOTER = _Quoter(safe="?/:@") 

16 

17UNQUOTER = _Unquoter() 

18PATH_UNQUOTER = _Unquoter(unsafe="+") 

19PATH_SAFE_UNQUOTER = _Unquoter(ignore="/%", unsafe="+") 

20QS_UNQUOTER = _Unquoter(qs=True) 

21UNQUOTER_PLUS = _Unquoter(plus=True) # to match urllib.parse.unquote_plus 

22 

23 

24def human_quote(s: str | None, unsafe: str) -> str | None: 

25 if not s: 

26 return s 

27 for c in "%" + unsafe: 

28 if c in s: 

29 s = s.replace(c, f"%{ord(c):02X}") 

30 if s.isprintable(): 

31 return s 

32 return "".join(c if c.isprintable() else quote(c) for c in s)