diff options
author | David Baker <dbkr@users.noreply.github.com> | 2017-05-03 11:23:25 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-05-03 11:23:25 +0100 |
commit | 60833c8978d9f25c2d6c59c809c9b14a8f7e89e7 (patch) | |
tree | 1678fc6711c54fecfe94b4608f47a2f6d4ff5529 /synapse/http | |
parent | Merge pull request #2175 from matrix-org/erikj/prefill_state (diff) | |
parent | No need for the exception variable (diff) | |
download | synapse-60833c8978d9f25c2d6c59c809c9b14a8f7e89e7.tar.xz |
Merge pull request #2147 from matrix-org/dbkr/http_request_propagate_error
Propagate errors sensibly from proxied IS requests
Diffstat (limited to 'synapse/http')
-rw-r--r-- | synapse/http/client.py | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/synapse/http/client.py b/synapse/http/client.py index ca2f770f5d..9cf797043a 100644 --- a/synapse/http/client.py +++ b/synapse/http/client.py @@ -16,7 +16,7 @@ from OpenSSL import SSL from OpenSSL.SSL import VERIFY_NONE from synapse.api.errors import ( - CodeMessageException, SynapseError, Codes, + CodeMessageException, MatrixCodeMessageException, SynapseError, Codes, ) from synapse.util.logcontext import preserve_context_over_fn import synapse.metrics @@ -145,6 +145,11 @@ class SimpleHttpClient(object): body = yield preserve_context_over_fn(readBody, response) + if 200 <= response.code < 300: + defer.returnValue(json.loads(body)) + else: + raise self._exceptionFromFailedRequest(response, body) + defer.returnValue(json.loads(body)) @defer.inlineCallbacks @@ -164,8 +169,11 @@ class SimpleHttpClient(object): On a non-2xx HTTP response. The response body will be used as the error message. """ - body = yield self.get_raw(uri, args) - defer.returnValue(json.loads(body)) + try: + body = yield self.get_raw(uri, args) + defer.returnValue(json.loads(body)) + except CodeMessageException as e: + raise self._exceptionFromFailedRequest(e.code, e.msg) @defer.inlineCallbacks def put_json(self, uri, json_body, args={}): @@ -246,6 +254,15 @@ class SimpleHttpClient(object): else: raise CodeMessageException(response.code, body) + def _exceptionFromFailedRequest(self, response, body): + try: + jsonBody = json.loads(body) + errcode = jsonBody['errcode'] + error = jsonBody['error'] + return MatrixCodeMessageException(response.code, error, errcode) + except (ValueError, KeyError): + return CodeMessageException(response.code, body) + # XXX: FIXME: This is horribly copy-pasted from matrixfederationclient. # The two should be factored out. |