import warnings
from collections.abc import MutableMapping
from http.cookiejar import Cookie, CookieJar
-from urllib.parse import parse_qsl, urlencode
+from urllib.parse import parse_qsl, quote, unquote, urlencode
import chardet
import rfc3986
@property
def username(self) -> str:
userinfo = self._uri_reference.userinfo or ""
- return userinfo.partition(":")[0]
+ return unquote(userinfo.partition(":")[0])
@property
def password(self) -> str:
userinfo = self._uri_reference.userinfo or ""
- return userinfo.partition(":")[2]
+ return unquote(userinfo.partition(":")[2])
@property
def host(self) -> str:
):
host = kwargs.pop("host", self.host)
port = kwargs.pop("port", self.port)
- username = kwargs.pop("username", self.username)
- password = kwargs.pop("password", self.password)
+ username = quote(kwargs.pop("username", self.username) or "")
+ password = quote(kwargs.pop("password", self.password) or "")
authority = host
if port is not None:
def join(self, url: URLTypes) -> "URL":
"""
- Return an absolute URL, using given this URL as the base.
+ Return an absolute URL, using this URL as the base.
"""
if self.is_relative_url:
return URL(url)
assert str(new) == "https://username:password@example.net:444"
+def test_url_copywith_for_userinfo():
+ copy_with_kwargs = {
+ "username": "tom@example.org",
+ "password": "abc123@ %",
+ }
+ url = URL("https://example.org")
+ new = url.copy_with(**copy_with_kwargs)
+ assert str(new) == "https://tom%40example.org:abc123%40%20%25@example.org"
+ assert new.username == "tom@example.org"
+ assert new.password == "abc123@ %"
+
+
def test_url_invalid():
with pytest.raises(InvalidURL):
URL("https://😇/")