diff options
author | Ask Solem <ask@celeryproject.org> | 2013-11-18 14:44:59 +0000 |
---|---|---|
committer | Ask Solem <ask@celeryproject.org> | 2013-11-18 14:44:59 +0000 |
commit | 4e032f0c57eb28a10b0002932ffc2f2265c1d3f4 (patch) | |
tree | e557aa020da1421f7f17680ad9c8743de006dba7 | |
parent | 86a79c76ab6113d4ecf3044911f9c3face335680 (diff) | |
download | kombu-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.py | 44 |
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): |