summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAsk Solem <ask@celeryproject.org>2013-11-18 14:44:59 +0000
committerAsk Solem <ask@celeryproject.org>2013-11-18 14:44:59 +0000
commit4e032f0c57eb28a10b0002932ffc2f2265c1d3f4 (patch)
treee557aa020da1421f7f17680ad9c8743de006dba7
parent86a79c76ab6113d4ecf3044911f9c3face335680 (diff)
downloadkombu-4e032f0c57eb28a10b0002932ffc2f2265c1d3f4.tar.gz
Redis Unixsocket: Support setting virtual host in query
Example url with virtual host set: redis+socket:///tmp/redis.sock?virtual_host=3 Related to Issue #238
-rw-r--r--kombu/transport/redis.py44
1 files changed, 26 insertions, 18 deletions
diff --git a/kombu/transport/redis.py b/kombu/transport/redis.py
index 2283f93b..1f0c6805 100644
--- a/kombu/transport/redis.py
+++ b/kombu/transport/redis.py
@@ -21,6 +21,7 @@ from kombu.log import get_logger
from kombu.utils import cached_property, uuid
from kombu.utils.eventio import poll, READ, ERR
from kombu.utils.encoding import bytes_to_str
+from kombu.utils.url import _parse_url
NO_ROUTE_ERROR = """
Cannot route message for exchange {0!r}: Table empty or key no longer exists.
@@ -639,33 +640,40 @@ class Channel(virtual.Channel):
pass
super(Channel, self).close()
- def _connparams(self):
- conninfo = self.connection.client
- database = conninfo.virtual_host
- if not isinstance(database, int):
- if not database or database == '/':
- database = DEFAULT_DB
- elif database.startswith('/'):
- database = database[1:]
+ def _prepare_virtual_host(self, vhost):
+ if not isinstance(vhost, int):
+ if not vhost or vhost == '/':
+ vhost = DEFAULT_DB
+ elif vhost.startswith('/'):
+ vhost = vhost[1:]
try:
- database = int(database)
+ vhost = int(vhost)
except ValueError:
raise ValueError(
- 'Database name must be int between 0 and limit - 1')
- host = conninfo.hostname or '127.0.0.1'
- connparams = {'host': host,
+ 'Database is int between 0 and limit - 1, not {0}'.format(
+ vhost,
+ ))
+ return vhost
+
+ def _connparams(self):
+ conninfo = self.connection.client
+ connparams = {'host': conninfo.hostname or '127.0.0.1',
'port': conninfo.port or DEFAULT_PORT,
- 'db': database,
+ 'virtual_host': conninfo.virtual_host,
'password': conninfo.password,
'max_connections': self.max_connections,
'socket_timeout': self.socket_timeout}
- if host.split('://')[0] == 'socket':
- connparams.update({
- 'connection_class': redis.UnixDomainSocketConnection,
- 'path': host.split('://')[1]})
+ host = connparams['host']
+ if '://' in host:
+ scheme, _, _, _, _, path, query = _parse_url(host)
+ if scheme == 'socket':
+ connparams.update({
+ 'connection_class': redis.UnixDomainSocketConnection,
+ 'path': '/' + path}, **query)
connparams.pop('host', None)
connparams.pop('port', None)
-
+ connparams['db'] = self._prepare_virtual_host(
+ connparams.pop('virtual_host', None))
return connparams
def _create_client(self):