if "unix" in env_redis.lower():
# channels_redis socket format, looks like:
# "unix:///path/to/redis.sock"
- return (f"redis+socket:{path}", env_redis)
+ if "?db=" in env_redis:
+ path, number = path.split("?db=")
+ return (f"redis+socket:{path}?virtual_host={number}", env_redis)
+ else:
+ return (f"redis+socket:{path}", env_redis)
elif "+socket" in env_redis.lower():
# celery socket style, looks like:
# "redis+socket:///path/to/redis.sock"
- return (env_redis, f"unix:{path}")
+ if "?virtual_host=" in env_redis:
+ # Virtual host (aka db number)
+ path, number = path.split("?virtual_host=")
+ return (env_redis, f"unix:{path}?db={number}")
+ else:
+ return (env_redis, f"unix:{path}")
# Not a socket
return (env_redis, env_redis)
"""
for input, expected in [
+ # Nothing is set
(None, ("redis://localhost:6379", "redis://localhost:6379")),
+ # celery style
(
"redis+socket:///run/redis/redis.sock",
(
"unix:///run/redis/redis.sock",
),
),
+ # redis-py / channels-redis style
(
"unix:///run/redis/redis.sock",
(
"unix:///run/redis/redis.sock",
),
),
+ # celery style with db
+ (
+ "redis+socket:///run/redis/redis.sock?virtual_host=5",
+ (
+ "redis+socket:///run/redis/redis.sock?virtual_host=5",
+ "unix:///run/redis/redis.sock?db=5",
+ ),
+ ),
+ # redis-py / channels-redis style with db
+ (
+ "unix:///run/redis/redis.sock?db=10",
+ (
+ "redis+socket:///run/redis/redis.sock?virtual_host=10",
+ "unix:///run/redis/redis.sock?db=10",
+ ),
+ ),
]:
result = _parse_redis_url(input)
self.assertTupleEqual(expected, result)