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
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
1"""Quoting and unquoting utilities for URL parts."""
3from urllib.parse import quote
5from ._quoting import _Quoter, _Unquoter
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="?/:@")
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
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)