def from_response(response, message=None, traceback=None, method=None, url=None): """Return an HttpError instance based on response from httplib/requests.""" error_body = {} if message: error_body['message'] = message if traceback: error_body['details'] = traceback if hasattr(response, 'status') and not hasattr(response, 'status_code'): # NOTE(akurilin): These modifications around response object give # ability to get all necessary information in method `from_response` # from common code, which expecting response object from `requests` # library instead of object from `httplib/httplib2` library. response.status_code = response.status response.headers = { 'Content-Type': response.getheader('content-type', "") } if hasattr(response, 'status_code'): # NOTE(jiangfei): These modifications allow SessionClient # to handle faultstring. response.json = lambda: {'error': error_body} return exceptions.from_response(response, method=method, url=url)
def from_response(response, message=None, traceback=None, method=None, url=None): """Return an HttpError instance based on response from httplib/requests.""" error_body = {} if message: error_body['message'] = message if traceback: error_body['details'] = traceback if hasattr(response, 'status') and not hasattr(response, 'status_code'): # NOTE(akurilin): These modifications around response object give # ability to get all necessary information in method `from_response` # from common code, which expecting response object from `requests` # library instead of object from `httplib/httplib2` library. response.status_code = response.status response.headers = { 'Content-Type': response.getheader('content-type', "")} if hasattr(response, 'status_code'): # NOTE(jiangfei): These modifications allow SessionClient # to handle faultstring. response.json = lambda: {'error': error_body} return exceptions.from_response(response, method=method, url=url)
def test_from_response_with_text_response_format_with_no_body(self): method = "GET" url = "/fake-wsme" status_code = http_client.UNAUTHORIZED ex = exceptions.from_response( FakeResponse(status_code=status_code, headers={"Content-Type": "text/html"}), method, url) self.assertIsInstance(ex, exceptions.Unauthorized) self.assertEqual('', ex.details) self.assertEqual(method, ex.method) self.assertEqual(url, ex.url) self.assertEqual(status_code, ex.http_status)
def test_from_response_with_text_response_format_with_no_body(self): method = "GET" url = "/fake-wsme" status_code = 401 ex = exceptions.from_response( FakeResponse(status_code=status_code, headers={"Content-Type": "text/html"}), method, url ) self.assertIsInstance(ex, exceptions.Unauthorized) self.assertEqual("", ex.details) self.assertEqual(method, ex.method) self.assertEqual(url, ex.url) self.assertEqual(status_code, ex.http_status)
def test_from_response_with_text_response_format(self): method = "GET" url = "/fake-wsme" status_code = 400 text_data1 = "error_message: fake message" ex = exceptions.from_response( FakeResponse(status_code=status_code, headers={"Content-Type": "text/html"}, text=text_data1), method, url ) self.assertIsInstance(ex, exceptions.BadRequest) self.assertEqual(text_data1, ex.details) self.assertEqual(method, ex.method) self.assertEqual(url, ex.url) self.assertEqual(status_code, ex.http_status)
def test_from_response_with_text_response_format(self): method = "GET" url = "/fake-wsme" status_code = http_client.BAD_REQUEST text_data1 = "error_message: fake message" ex = exceptions.from_response( FakeResponse(status_code=status_code, headers={"Content-Type": "text/html"}, text=text_data1), method, url) self.assertIsInstance(ex, exceptions.BadRequest) self.assertEqual(text_data1, ex.details) self.assertEqual(method, ex.method) self.assertEqual(url, ex.url) self.assertEqual(status_code, ex.http_status)
def assert_exception( self, ex_cls, method, url, status_code, json_data, error_msg=None, error_details=None, check_description=True ): ex = exceptions.from_response( FakeResponse(status_code=status_code, headers={"Content-Type": "application/json"}, json_data=json_data), method, url, ) self.assertIsInstance(ex, ex_cls) if check_description: expected_msg = error_msg or json_data["error"]["message"] expected_details = error_details or json_data["error"]["details"] self.assertEqual(expected_msg, ex.message) self.assertEqual(expected_details, ex.details) self.assertEqual(method, ex.method) self.assertEqual(url, ex.url) self.assertEqual(status_code, ex.http_status)
def assert_exception(self, ex_cls, method, url, status_code, json_data, error_msg=None, error_details=None, check_description=True): ex = exceptions.from_response( FakeResponse(status_code=status_code, headers={"Content-Type": "application/json"}, json_data=json_data), method, url) self.assertIsInstance(ex, ex_cls) if check_description: expected_msg = error_msg or json_data["error"]["message"] expected_details = error_details or json_data["error"]["details"] self.assertEqual(expected_msg, ex.message) self.assertEqual(expected_details, ex.details) self.assertEqual(method, ex.method) self.assertEqual(url, ex.url) self.assertEqual(status_code, ex.http_status)