Support RFC-1738 URLs

Fixes #149
This commit is contained in:
Rémy HUBSCHER
2014-11-14 15:42:37 +01:00
committed by Honza Král
parent 03a817690d
commit 923ee018cf
3 changed files with 29 additions and 15 deletions
+18 -12
View File
@@ -1,9 +1,10 @@
from __future__ import unicode_literals
import weakref
import logging
from ..transport import Transport
from ..exceptions import NotFoundError, TransportError
from ..compat import string_types
from ..compat import string_types, urlparse
from .indices import IndicesClient
from .cluster import ClusterClient
from .cat import CatClient
@@ -30,22 +31,27 @@ def _normalize_hosts(hosts):
# normalize hosts to dicts
for i, host in enumerate(hosts):
if isinstance(host, string_types):
host = host.strip('/')
# remove schema information
if '://' in host:
if '://' not in host:
host = "//%s" % host
parsed_url = urlparse(host)
h = {"host": parsed_url.hostname}
if parsed_url.port:
h["port"] = parsed_url.port
if parsed_url.scheme == "https":
h['port'] = parsed_url.port or 443
h['use_ssl'] = True
elif parsed_url.scheme == "http":
logger.warning(
"List of nodes should not include schema information (http://): %r.",
host
)
host = host[host.index('://') + 3:]
h = {"host": host}
if ':' in host:
# TODO: detect auth urls
host, port = host.rsplit(':', 1)
if port.isdigit():
port = int(port)
h = {"host": host, "port": port}
if parsed_url.username or parsed_url.password:
h['http_auth'] = '%s:%s' % (parsed_url.username, parsed_url.password)
out.append(h)
else:
out.append(host)
+2 -1
View File
@@ -5,8 +5,9 @@ PY2 = sys.version_info[0] == 2
if PY2:
string_types = basestring,
from urllib import quote_plus, urlencode
from urlparse import urlparse
from itertools import imap as map
else:
string_types = str, bytes
from urllib.parse import quote_plus, urlencode
from urllib.parse import quote_plus, urlencode, urlparse
map = map
+9 -2
View File
@@ -13,12 +13,19 @@ class TestNormalizeHosts(TestCase):
def test_strings_are_used_as_hostnames(self):
self.assertEquals([{"host": "elasticsearch.org"}], _normalize_hosts(["elasticsearch.org"]))
def test_strings_are_parsed_for_port(self):
def test_strings_are_parsed_for_port_and_user(self):
self.assertEquals(
[{"host": "elasticsearch.org", "port": 42}, {"host": "user:secret@elasticsearch.com"}],
[{"host": "elasticsearch.org", "port": 42}, {"host": "elasticsearch.com", "http_auth": "user:secret"}],
_normalize_hosts(["elasticsearch.org:42", "user:[email protected]"])
)
def test_strings_are_parsed_for_scheme(self):
self.assertEquals(
[{"host": "elasticsearch.org", "port": 42, "use_ssl": True},
{"host": "elasticsearch.com", "http_auth": "user:secret", "use_ssl": True, "port": 443}],
_normalize_hosts(["https://elasticsearch.org:42", "https://user:[email protected]"])
)
def test_dicts_are_left_unchanged(self):
self.assertEquals([{"host": "local", "extra": 123}], _normalize_hosts([{"host": "local", "extra": 123}]))