summaryrefslogtreecommitdiff
path: root/docker
diff options
context:
space:
mode:
authorJoffrey F <joffrey@docker.com>2014-07-03 04:11:34 +0200
committerJoffrey F <joffrey@docker.com>2014-07-03 04:11:34 +0200
commitcf050d28a0b374b22614a331bf4335ca4ab0367b (patch)
tree964a8d3aae03d3bcb7dbeb41bdc9f106c59fdf92 /docker
parent9170219188103022c06afd9c0caebf6aeea7eb5c (diff)
downloaddocker-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.py11
-rw-r--r--docker/utils/__init__.py2
-rw-r--r--docker/utils/utils.py67
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)