letsencrypt: Improve error handling (#2868)

* letsencrypt: improve error handling

Use the new "body" field of the info dict in case of a HTTPError.

* letsencrypt: HTTP 202 is a valid status while polling
This commit is contained in:
Michael Grüner 2016-09-14 14:16:51 +02:00 committed by Matt Clay
parent b57b74e40b
commit 3dd0752746

View file

@ -169,14 +169,18 @@ def simple_get(module,url):
result = None result = None
try: try:
content = resp.read() content = resp.read()
except AttributeError:
if info['body']:
content = info['body']
if content:
if info['content-type'].startswith('application/json'): if info['content-type'].startswith('application/json'):
result = module.from_json(content.decode('utf8')) try:
result = module.from_json(content.decode('utf8'))
except ValueError:
module.fail_json(msg="Failed to parse the ACME response: {0} {1}".format(url,content))
else: else:
result = content result = content
except AttributeError:
result = None
except ValueError:
module.fail_json(msg="Failed to parse the ACME response: {0} {1}".format(url,content))
if info['status'] >= 400: if info['status'] >= 400:
module.fail_json(msg="ACME request failed: CODE: {0} RESULT:{1}".format(info['status'],result)) module.fail_json(msg="ACME request failed: CODE: {0} RESULT:{1}".format(info['status'],result))
@ -370,14 +374,18 @@ class ACMEAccount(object):
result = None result = None
try: try:
content = resp.read() content = resp.read()
except AttributeError:
if info['body']:
content = info['body']
if content:
if info['content-type'].startswith('application/json'): if info['content-type'].startswith('application/json'):
result = self.module.from_json(content.decode('utf8')) try:
result = self.module.from_json(content.decode('utf8'))
except ValueError:
self.module.fail_json(msg="Failed to parse the ACME response: {0} {1}".format(url,content))
else: else:
result = content result = content
except AttributeError:
result = None
except ValueError:
self.module.fail_json(msg="Failed to parse the ACME response: {0} {1}".format(url,content))
return result,info return result,info
@ -637,7 +645,7 @@ class ACMEClient(object):
"keyAuthorization": keyauthorization, "keyAuthorization": keyauthorization,
} }
result, info = self.account.send_signed_request(uri, challenge_response) result, info = self.account.send_signed_request(uri, challenge_response)
if info['status'] != 200: if info['status'] not in [200,202]:
self.module.fail_json(msg="Error validating challenge: CODE: {0} RESULT: {1}".format(info['status'], result)) self.module.fail_json(msg="Error validating challenge: CODE: {0} RESULT: {1}".format(info['status'], result))
status = '' status = ''