Setup the error handling for the underlying requests library
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/9be69cc0 Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/9be69cc0 Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/9be69cc0 Branch: refs/heads/requests Commit: 9be69cc0fa3b2563b315281a9dfa688fa9e16b36 Parents: 6326f98 Author: anthony-shaw <anthony.p.s...@gmail.com> Authored: Wed Mar 30 14:44:21 2016 +1100 Committer: anthony-shaw <anthony.p.s...@gmail.com> Committed: Wed Mar 30 14:44:21 2016 +1100 ---------------------------------------------------------------------- libcloud/common/base.py | 24 +++++++----------------- libcloud/common/exceptions.py | 1 - libcloud/test/__init__.py | 21 +++++++++++++++++++-- libcloud/test/test_connection.py | 4 ++-- libcloud/test/test_httplib_ssl.py | 2 +- 5 files changed, 29 insertions(+), 23 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/libcloud/blob/9be69cc0/libcloud/common/base.py ---------------------------------------------------------------------- diff --git a/libcloud/common/base.py b/libcloud/common/base.py index badce2c..40d9c39 100644 --- a/libcloud/common/base.py +++ b/libcloud/common/base.py @@ -32,6 +32,8 @@ try: except: import json +import requests + import libcloud from libcloud.utils.py3 import PY3, PY25 @@ -149,26 +151,13 @@ class Response(object): # names self.headers = lowercase_keys(dict(response.getheaders())) self.error = response.reason - self.status = response.status - - # This attribute is set when using LoggingConnection. - original_data = getattr(response, '_original_data', None) - - if original_data: - # LoggingConnection already decompresses data so it can log it - # which means we don't need to decompress it here. - self.body = response._original_data - else: - self.body = self._decompress_response(body=response.read(), - headers=self.headers) + self.status = response.status_code - if PY3: - self.body = b(self.body).decode('utf-8') + self.body = response.text if not self.success(): raise exception_from_message(code=self.status, - message=self.parse_error(), - headers=self.headers) + message=self.parse_error()) self.object = self.parse_body() @@ -204,7 +193,8 @@ class Response(object): :rtype: ``bool`` :return: ``True`` or ``False`` """ - return self.status in [httplib.OK, httplib.CREATED] + return self.status in [requests.codes.ok, requests.codes.created, + httplib.OK, httplib.CREATED] def _decompress_response(self, body, headers): """ http://git-wip-us.apache.org/repos/asf/libcloud/blob/9be69cc0/libcloud/common/exceptions.py ---------------------------------------------------------------------- diff --git a/libcloud/common/exceptions.py b/libcloud/common/exceptions.py index 14dcea8..a286ccd 100644 --- a/libcloud/common/exceptions.py +++ b/libcloud/common/exceptions.py @@ -70,6 +70,5 @@ def exception_from_message(code, message, headers=None): if headers and 'retry_after' in headers: kwargs['retry_after'] = headers['retry_after'] - cls = _code_map.get(code, BaseHTTPError) return cls(**kwargs) http://git-wip-us.apache.org/repos/asf/libcloud/blob/9be69cc0/libcloud/test/__init__.py ---------------------------------------------------------------------- diff --git a/libcloud/test/__init__.py b/libcloud/test/__init__.py index 747b02c..cfd076c 100644 --- a/libcloud/test/__init__.py +++ b/libcloud/test/__init__.py @@ -15,6 +15,7 @@ import sys import random +import requests from libcloud.utils.py3 import httplib from libcloud.utils.py3 import StringIO @@ -78,14 +79,14 @@ class MockResponse(object): A mock HTTPResponse """ headers = {} - body = StringIO() + body = None status = 0 reason = '' version = 11 def __init__(self, status, body=None, headers=None, reason=None): self.status = status - self.body = StringIO(u(body)) if body else StringIO() + self.body = body self.headers = headers or self.headers self.reason = reason or self.reason @@ -110,6 +111,17 @@ class MockResponse(object): def msg(self): raise NotImplemented + @property + def status_code(self): + return self.status + + def raise_for_status(self): + raise requests.exceptions.HTTPError(self.status) + + @property + def text(self): + return self.body + class BaseMockHttpObject(object): def _get_method_name(self, type, use_param, qs, path): @@ -327,6 +339,11 @@ class MockRawResponse(BaseMockHttpObject): return self._status @property + def status_code(self): + self._get_response_if_not_availale() + return self._status + + @property def headers(self): self._get_response_if_not_availale() return self._headers http://git-wip-us.apache.org/repos/asf/libcloud/blob/9be69cc0/libcloud/test/test_connection.py ---------------------------------------------------------------------- diff --git a/libcloud/test/test_connection.py b/libcloud/test/test_connection.py index 5a97b45..53cd979 100644 --- a/libcloud/test/test_connection.py +++ b/libcloud/test/test_connection.py @@ -86,7 +86,7 @@ class BaseConnectionClassTestCase(unittest.TestCase): proxy_url = 'http://127.0.0.4:3128' conn = LibcloudConnection(host='localhost', port=80, - proxy_url=proxy_url) + proxy_url=proxy_url) self.assertEqual(conn.proxy_scheme, 'http') self.assertEqual(conn.proxy_host, '127.0.0.4') self.assertEqual(conn.proxy_port, 3128) @@ -94,7 +94,7 @@ class BaseConnectionClassTestCase(unittest.TestCase): os.environ['http_proxy'] = proxy_url proxy_url = 'http://127.0.0.5:3128' conn = LibcloudConnection(host='localhost', port=80, - proxy_url=proxy_url) + proxy_url=proxy_url) self.assertEqual(conn.proxy_scheme, 'http') self.assertEqual(conn.proxy_host, '127.0.0.5') self.assertEqual(conn.proxy_port, 3128) http://git-wip-us.apache.org/repos/asf/libcloud/blob/9be69cc0/libcloud/test/test_httplib_ssl.py ---------------------------------------------------------------------- diff --git a/libcloud/test/test_httplib_ssl.py b/libcloud/test/test_httplib_ssl.py index 8f5885d..55d1b23 100644 --- a/libcloud/test/test_httplib_ssl.py +++ b/libcloud/test/test_httplib_ssl.py @@ -36,7 +36,7 @@ class TestHttpLibSSLTests(unittest.TestCase): def setUp(self): libcloud.security.VERIFY_SSL_CERT = False libcloud.security.CA_CERTS_PATH = ORIGINAL_CA_CERS_PATH - self.httplib_object = LibcloudConnection('foo.bar') + self.httplib_object = LibcloudConnection('foo.bar', port=80) def test_custom_ca_path_using_env_var_doesnt_exist(self): os.environ['SSL_CERT_FILE'] = '/foo/doesnt/exist'