Change handle_httperror in httpapi plugins (#53391)

* Change return of handle_httperror

* Fix restconf for handle_httperror changes
This commit is contained in:
Nathaniel Case 2019-03-06 12:13:58 -05:00 committed by GitHub
parent 662dd2c1de
commit 3fe2013b3f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 27 additions and 30 deletions

View file

@ -277,9 +277,9 @@ class Connection(NetworkConnectionBase):
if is_handled is True: if is_handled is True:
return self.send(path, data, **kwargs) return self.send(path, data, **kwargs)
elif is_handled is False: elif is_handled is False:
raise AnsibleConnectionFailure('Could not connect to {0}: {1}'.format(self._url + path, exc.reason))
else:
raise raise
else:
response = is_handled
except URLError as exc: except URLError as exc:
raise AnsibleConnectionFailure('Could not connect to {0}: {1}'.format(self._url + path, exc.reason)) raise AnsibleConnectionFailure('Could not connect to {0}: {1}'.format(self._url + path, exc.reason))

View file

@ -61,19 +61,20 @@ class HttpApiBase(AnsiblePlugin):
:returns: :returns:
* True if the code has been handled in a way that the request * True if the code has been handled in a way that the request
may be resent without changes. may be resent without changes.
* False if this code indicates a fatal or unknown error which * False if the error cannot be handled or recovered from by the
cannot be handled by the plugin. This will result in an plugin. This will result in the HTTPError being returned to the
AnsibleConnectionFailure being raised. caller to deal with as appropriate.
* Any other response passes the HTTPError along to the caller to * Any other value returned is taken as a valid response from the
deal with as appropriate. server without making another request. In many cases, this can just
""" be the original exception.
"""
if exc.code == 401 and self.connection._auth: if exc.code == 401 and self.connection._auth:
# Stored auth appears to be invalid, clear and retry # Stored auth appears to be invalid, clear and retry
self.connection._auth = None self.connection._auth = None
self.login(self.connection.get_option('remote_user'), self.connection.get_option('password')) self.login(self.connection.get_option('remote_user'), self.connection.get_option('password'))
return True return True
return False return exc
@abstractmethod @abstractmethod
def send_request(self, data, **message_kwargs): def send_request(self, data, **message_kwargs):

View file

@ -217,8 +217,8 @@ class HttpApi(HttpApiBase):
self.connection._auth = None self.connection._auth = None
self.login(self.connection.get_option('remote_user'), self.connection.get_option('password')) self.login(self.connection.get_option('remote_user'), self.connection.get_option('password'))
return True return True
# None means that the exception will be passed further to the caller # False means that the exception will be passed further to the caller
return None return False
def _display(self, http_method, title, msg=''): def _display(self, http_method, title, msg=''):
self.connection.queue_message('vvvv', 'REST:%s:%s:%s\n%s' % (http_method, self.connection._url, title, msg)) self.connection.queue_message('vvvv', 'REST:%s:%s:%s\n%s' % (http_method, self.connection._url, title, msg))

View file

@ -62,30 +62,26 @@ class HttpApi(HttpApiBase):
'Content-Type': message_kwargs.get('content_type') or CONTENT_TYPE, 'Content-Type': message_kwargs.get('content_type') or CONTENT_TYPE,
'Accept': message_kwargs.get('accept') or CONTENT_TYPE, 'Accept': message_kwargs.get('accept') or CONTENT_TYPE,
} }
try: response, response_data = self.connection.send(path, data, headers=headers, method=message_kwargs.get('method'))
response, response_data = self.connection.send(path, data, headers=headers, method=message_kwargs.get('method'))
except HTTPError as exc:
response_data = exc
return handle_response(response_data) return handle_response(response, response_data)
def handle_httperror(self, exc):
return None
def handle_response(response): def handle_response(response, response_data):
try: try:
response_json = json.loads(response.read()) response_data = json.loads(response_data.read())
except ValueError: except ValueError:
if isinstance(response, HTTPError): response_data = response_data.read()
raise ConnectionError(to_text(response), code=response.code)
return response.read()
if 'errors' in response_json and 'jsonrpc' not in response_json: if isinstance(response, HTTPError):
errors = response_json['errors']['error'] if response_data:
if 'errors' in response_data:
errors = response_data['errors']['error']
error_text = '\n'.join((error['error-message'] for error in errors))
else:
error_text = response_data
error_text = '\n'.join((error['error-message'] for error in errors)) raise ConnectionError(error_text, code=response.code)
raise ConnectionError(to_text(response), code=response.code)
raise ConnectionError(error_text, code=response.code) return response_data
return response_json