diff options
| author | Joffrey F <joffrey@docker.com> | 2014-07-03 04:11:34 +0200 |
|---|---|---|
| committer | Joffrey F <joffrey@docker.com> | 2014-07-03 04:11:34 +0200 |
| commit | cf050d28a0b374b22614a331bf4335ca4ab0367b (patch) | |
| tree | 964a8d3aae03d3bcb7dbeb41bdc9f106c59fdf92 /docker | |
| parent | 9170219188103022c06afd9c0caebf6aeea7eb5c (diff) | |
| download | docker-py-cf050d28a0b374b22614a331bf4335ca4ab0367b.tar.gz | |
Implemented complete parse_host method to handle all accepted values of Client's base_url. Unit tests
Diffstat (limited to 'docker')
| -rw-r--r-- | docker/client.py | 11 | ||||
| -rw-r--r-- | docker/utils/__init__.py | 2 | ||||
| -rw-r--r-- | docker/utils/utils.py | 67 |
3 files changed, 69 insertions, 11 deletions
diff --git a/docker/client.py b/docker/client.py index 532f035..cd275d4 100644 --- a/docker/client.py +++ b/docker/client.py @@ -39,16 +39,9 @@ class Client(requests.Session): def __init__(self, base_url=None, version=DEFAULT_DOCKER_API_VERSION, timeout=DEFAULT_TIMEOUT_SECONDS): super(Client, self).__init__() - if base_url is None: - base_url = "http+unix://var/run/docker.sock" - if 'unix:///' in base_url: + base_url = utils.parse_host(base_url) + if 'http+unix:///' in base_url: base_url = base_url.replace('unix:/', 'unix:') - if base_url.startswith('unix:'): - base_url = "http+" + base_url - if base_url.startswith('tcp:'): - base_url = base_url.replace('tcp:', 'http:') - if base_url.endswith('/'): - base_url = base_url[:-1] self.base_url = base_url self._version = version self._timeout = timeout diff --git a/docker/utils/__init__.py b/docker/utils/__init__.py index 86ddd35..5d2c1b8 100644 --- a/docker/utils/__init__.py +++ b/docker/utils/__init__.py @@ -1,4 +1,4 @@ from .utils import ( compare_version, convert_port_bindings, convert_volume_binds, - mkbuildcontext, ping, tar, parse_repository_tag + mkbuildcontext, ping, tar, parse_repository_tag, parse_host ) # flake8: noqa diff --git a/docker/utils/utils.py b/docker/utils/utils.py index 036a504..e9930e3 100644 --- a/docker/utils/utils.py +++ b/docker/utils/utils.py @@ -20,6 +20,11 @@ from distutils.version import StrictVersion import requests import six +from .. import errors + +DEFAULT_HTTP_HOST = "127.0.0.1" +DEFAULT_UNIX_SOCKET = "http+unix://var/run/docker.sock" + def mkbuildcontext(dockerfile): f = tempfile.NamedTemporaryFile() @@ -139,9 +144,69 @@ def parse_repository_tag(repo): column_index = repo.rfind(':') if column_index < 0: return repo, None - tag = repo[column_index+1:] + tag = repo[column_index + 1:] slash_index = tag.find('/') if slash_index < 0: return repo[:column_index], tag return repo, None + + +# Based on utils.go:ParseHost http://tinyurl.com/nkahcfh +# fd:// protocol unsupported (for obvious reasons) +# Added support for http and https +# Protocol translation: tcp -> http, unix -> http+unix +def parse_host(addr): + proto = "http+unix" + host = DEFAULT_HTTP_HOST + port = None + if not addr or addr.strip() == 'unix://': + return DEFAULT_UNIX_SOCKET + + addr = addr.strip() + if addr.startswith('http://'): + addr = addr.replace('http://', 'tcp://') + + if addr == 'tcp://': + raise errors.DockerException("Invalid bind address format: %s" % addr) + elif addr.startswith('unix://'): + addr = addr[7:] + elif addr.startswith('tcp://'): + proto = "http" + addr = addr[6:] + elif addr.startswith('https://'): + proto = "https" + addr = addr[8:] + elif addr.startswith('fd://'): + raise errors.DockerException("fd protocol is not implemented") + else: + if "://" in addr: + raise errors.DockerException( + "Invalid bind address protocol: %s" % addr + ) + proto = "http" + + if proto != "http+unix" and ":" in addr: + host_parts = addr.split(':') + if len(host_parts) != 2: + raise errors.DockerException( + "Invalid bind address format: %s" % addr + ) + if host_parts[0]: + host = host_parts[0] + + try: + port = int(host_parts[1]) + except Exception: + raise errors.DockerException( + "Invalid port: %s", addr + ) + + elif proto in ("http", "https") and ':' not in addr: + raise errors.DockerException("Bind address needs a port: %s" % addr) + else: + host = addr + + if proto == "http+unix": + return "%s://%s" % (proto, host) + return "%s://%s:%d" % (proto, host, port) |
