diff --git a/examples/restified.py b/examples/restified.py index 1428c96cc..99d07a067 100644 --- a/examples/restified.py +++ b/examples/restified.py @@ -34,4 +34,7 @@ logging.debug(authzr) csr = M2Crypto.X509.load_request_string(pkg_resources.resource_string( 'letsencrypt.client.tests', os.path.join('testdata', 'csr.pem'))) -net.request_issuance(csr, (authzr,)) +try: + net.request_issuance(csr, (authzr,)) +except messages2.Error as error: + print error.detail diff --git a/letsencrypt/acme/messages2.py b/letsencrypt/acme/messages2.py index 37a384aa4..903746ae7 100644 --- a/letsencrypt/acme/messages2.py +++ b/letsencrypt/acme/messages2.py @@ -8,7 +8,7 @@ from letsencrypt.acme import other from letsencrypt.acme import util -class Error(jose.JSONObjectWithFields): +class Error(jose.JSONObjectWithFields, Exception): """ACME error. https://tools.ietf.org/html/draft-ietf-appsawg-http-problem-00 @@ -23,10 +23,11 @@ class Error(jose.JSONObjectWithFields): "badCSR": "The CSR is unacceptable (e.g., due to a short key)", } - typ = jose.Field('type') + typ = jose.Field('type', omitempty=True) # Boulder omits, spec requires title = jose.Field('title', omitempty=True) detail = jose.Field('detail') - instance = jose.Field('instance') + # Boulder omits, spec requires + instance = jose.Field('instance', omitempty=True) @typ.encoder def typ(value): diff --git a/letsencrypt/client/network2.py b/letsencrypt/client/network2.py index b2bfb8220..3c68a17c7 100644 --- a/letsencrypt/client/network2.py +++ b/letsencrypt/client/network2.py @@ -33,9 +33,16 @@ class Network(object): payload=dumps, key=self.key, alg=self.alg).json_dumps() def _post(self, uri, data): + """Send POST data. + + :raises letsencrypt.acme.messages2.Error: + + """ logging.debug('Sending data: %s', data) response = requests.post(uri, data) logging.debug('Received response %s: %s', response, response.text) + if not response.ok: + raise messages2.Error.from_json(response.json()) return response def _regr_from_response(self, response, uri=None, new_authz_uri=None):