fix: overwrite_domain accepts a bare IPv6 replacement instead of rejecting any ':'
the guard rejected any replacement containing ':', which over-rejected a valid bare IPv6
literal host ('::1', '2001:db8::1') that yarl's URL.with_host() accepts and brackets. it now
delegates the check to yarl (try with_host, catch ValueError), so a bare IPv6 is accepted
(rewrites to http://[::1]/...) while a genuine host:port or pre-bracketed form still raises.
Signed-off-by: disqualifier <dev@disqualifier.me>
This commit is contained in:
+11
-9
@@ -188,17 +188,19 @@ class ExtendedSession:
|
|||||||
def overwrite_domain(self, target, replacement):
|
def overwrite_domain(self, target, replacement):
|
||||||
"""register a host-substring rewrite (target -> replacement)
|
"""register a host-substring rewrite (target -> replacement)
|
||||||
|
|
||||||
raises:
|
raises ValueError if the replacement is not a valid host for yarl's with_host()
|
||||||
ValueError: if replacement contains a port (e.g. 'host:1234') - yarl's
|
(e.g. a 'host:port' string or a pre-bracketed '[::1]') - caught here rather than
|
||||||
with_host() rejects any ':' in a host at request time, deep inside
|
deep in yarl at request time. a bare IPv6 literal ('::1', '2001:db8::1') is valid
|
||||||
yarl with a stack trace far from this call; caught here instead
|
and accepted: yarl brackets it itself.
|
||||||
"""
|
"""
|
||||||
if ":" in replacement:
|
try:
|
||||||
|
URL("http://placeholder").with_host(replacement)
|
||||||
|
except ValueError as exc:
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
f"overwrite_domain replacement {replacement!r} contains a port - "
|
f"overwrite_domain replacement {replacement!r} is not a valid host: {exc}; "
|
||||||
"yarl's URL.with_host() cannot take a host:port string; rewrite the "
|
"pass a bare hostname or IP (a bare IPv6 literal is fine), not a host:port or "
|
||||||
"port separately or via a full URL override, not domain_overwrites"
|
"bracketed form - rewrite a port via a full URL override, not domain_overwrites"
|
||||||
)
|
) from exc
|
||||||
self.domain_overwrites[target] = replacement
|
self.domain_overwrites[target] = replacement
|
||||||
|
|
||||||
def _apply_domain_overwrites(self, url: str) -> str:
|
def _apply_domain_overwrites(self, url: str) -> str:
|
||||||
|
|||||||
Reference in New Issue
Block a user