Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.11/site-packages/yarl/_quoters.py: 72%
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="?/:@")
16# WHATWG mode keeps a "%" that does not start a "%XX" escape in parsed URLs
17WHATWG_PATH_REQUOTER = _Quoter(
18 safe="@:", protected=":/@!$&'()*+,;=", keep_invalid_pct=True
19)
20WHATWG_QUERY_REQUOTER = _Quoter(
21 safe="?/:@", protected="=+&;", qs=True, keep_invalid_pct=True
22)
23WHATWG_FRAGMENT_REQUOTER = _Quoter(safe="?/:@", keep_invalid_pct=True)
25UNQUOTER = _Unquoter()
26PATH_SAFE_UNQUOTER = _Unquoter(ignore="/%")
27# Keeps "%" and the delimiters of an authority encoded in a zone identifier.
28ZONE_ID_UNQUOTER = _Unquoter(ignore="%/:?#[]@")
29QS_UNQUOTER = _Unquoter(qs=True)
30# to match urllib.parse.unquote_plus
31UNQUOTER_PLUS = _Unquoter(plus=True, replace_invalid=True)
34def human_quote(s: str | None, unsafe: str) -> str | None:
35 if not s:
36 return s
37 for c in "%" + unsafe:
38 if c in s:
39 s = s.replace(c, f"%{ord(c):02X}")
40 if s.isprintable():
41 return s
42 return "".join(c if c.isprintable() else quote(c) for c in s)