dockercloud
This commit is contained in:
parent
86f4a232ff
commit
2d9586a8a1
41 changed files with 2701 additions and 2 deletions
64
dockercloud/api/http.py
Normal file
64
dockercloud/api/http.py
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
from __future__ import absolute_import
|
||||
|
||||
import logging
|
||||
|
||||
from requests import Request, Session
|
||||
from requests import utils
|
||||
from urllib.parse import urljoin
|
||||
|
||||
import dockercloud
|
||||
from .exceptions import ApiError, AuthError
|
||||
|
||||
logger = logging.getLogger("python-dockercloud")
|
||||
|
||||
|
||||
def send_request(method, path, inject_header=True, **kwargs):
|
||||
json = None
|
||||
url = urljoin(dockercloud.rest_host.rstrip("/"), path.strip("/").encode("ascii", "ignore"))
|
||||
if not url.endswith("/"):
|
||||
url = "%s/" % url
|
||||
user_agent = 'python-dockercloud/%s' % dockercloud.__version__
|
||||
if dockercloud.user_agent:
|
||||
user_agent = "%s %s" % (dockercloud.user_agent, user_agent)
|
||||
|
||||
# construct headers
|
||||
headers = {'Content-Type': 'application/json', 'User-Agent': user_agent}
|
||||
headers.update(dockercloud.auth.get_auth_header())
|
||||
logger.info("Request: %s, %s, %s, %s" % (method, url, headers, kwargs))
|
||||
|
||||
# construct request
|
||||
s = Session()
|
||||
req = Request(method, url, headers=headers, **kwargs)
|
||||
|
||||
# get environment proxies
|
||||
env_proxies = utils.get_environ_proxies(url) or {}
|
||||
kw_args = {'proxies': env_proxies}
|
||||
|
||||
# make the request
|
||||
response = s.send(req.prepare(), **kw_args)
|
||||
status_code = getattr(response, 'status_code', None)
|
||||
logger.info("Response: Status %s, %s, %s" % (str(status_code), response.headers, response.text))
|
||||
|
||||
# handle the response
|
||||
if not status_code:
|
||||
# Most likely network trouble
|
||||
raise ApiError("No Response (%s %s)" % (method, url))
|
||||
elif 200 <= status_code <= 299:
|
||||
# Success
|
||||
if status_code != 204:
|
||||
# Try to parse the response.
|
||||
try:
|
||||
json = response.json()
|
||||
if response.headers and inject_header:
|
||||
json["dockercloud_action_uri"] = response.headers.get("X-DockerCloud-Action-URI", "")
|
||||
except TypeError:
|
||||
raise ApiError("JSON Parse Error (%s %s). Response: %s" % (method, url, response.text))
|
||||
else:
|
||||
json = None
|
||||
else:
|
||||
# Server returned an error
|
||||
if status_code == 401:
|
||||
raise AuthError("Not authorized")
|
||||
else:
|
||||
raise ApiError("Status %s (%s %s). Response: %s" % (str(status_code), method, url, response.text))
|
||||
return json
|
||||
Loading…
Add table
Add a link
Reference in a new issue