diff options
author | Klaas van Schelven <klaas@vanschelven.com> | 2022-08-21 12:46:31 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-21 13:46:31 +0300 |
commit | b5ebada842c715e9ee74ea638a7e6d11afcddae1 (patch) | |
tree | f0aea59523208dbc4dc38c30ba01869a351ada8f | |
parent | fde03fbd45981c204908fe2a82999acf8e95bbc4 (diff) | |
download | redis-py-b5ebada842c715e9ee74ea638a7e6d11afcddae1.tar.gz |
Be more strict about url scheme parsing (#2343)
The error message implied that urls had to start with `scheme://`.
However, if the double slash was left out, the url parsed just fine
and the part that was ostensibly intended to be the hostname ended
up as part of the path, whereas the default (localhost) would be
used for the hostname. This commit makes the check as strict as the
error message implies by including a check for the double slash.
Co-authored-by: dvora-h <67596500+dvora-h@users.noreply.github.com>
-rwxr-xr-x | redis/connection.py | 17 | ||||
-rw-r--r-- | tests/test_connection_pool.py | 8 |
2 files changed, 19 insertions, 6 deletions
diff --git a/redis/connection.py b/redis/connection.py index 3438baf..96645ba 100755 --- a/redis/connection.py +++ b/redis/connection.py @@ -1166,6 +1166,16 @@ URL_QUERY_ARGUMENT_PARSERS = { def parse_url(url): + if not ( + url.startswith("redis://") + or url.startswith("rediss://") + or url.startswith("unix://") + ): + raise ValueError( + "Redis URL must specify one of the following " + "schemes (redis://, rediss://, unix://)" + ) + url = urlparse(url) kwargs = {} @@ -1192,7 +1202,7 @@ def parse_url(url): kwargs["path"] = unquote(url.path) kwargs["connection_class"] = UnixDomainSocketConnection - elif url.scheme in ("redis", "rediss"): + else: # implied: url.scheme in ("redis", "rediss"): if url.hostname: kwargs["host"] = unquote(url.hostname) if url.port: @@ -1208,11 +1218,6 @@ def parse_url(url): if url.scheme == "rediss": kwargs["connection_class"] = SSLConnection - else: - raise ValueError( - "Redis URL must specify one of the following " - "schemes (redis://, rediss://, unix://)" - ) return kwargs diff --git a/tests/test_connection_pool.py b/tests/test_connection_pool.py index a836f5b..636b04e 100644 --- a/tests/test_connection_pool.py +++ b/tests/test_connection_pool.py @@ -339,6 +339,14 @@ class TestConnectionPoolURLParsing: "(redis://, rediss://, unix://)" ) + def test_invalid_scheme_raises_error_when_double_slash_missing(self): + with pytest.raises(ValueError) as cm: + redis.ConnectionPool.from_url("redis:foo.bar.com:12345") + assert str(cm.value) == ( + "Redis URL must specify one of the following schemes " + "(redis://, rediss://, unix://)" + ) + class TestConnectionPoolUnixSocketURLParsing: def test_defaults(self): |