mirror of
https://mau.dev/maunium/synapse.git
synced 2024-12-14 21:43:50 +01:00
Merge pull request #3639 from matrix-org/rav/refactor_error_handling
Clean up handling of errors from outbound requests
This commit is contained in:
commit
1fa98495d0
9 changed files with 124 additions and 142 deletions
1
changelog.d/3639.feature
Normal file
1
changelog.d/3639.feature
Normal file
|
@ -0,0 +1 @@
|
||||||
|
When we fail to join a room over federation, pass the error code back to the client.
|
|
@ -70,20 +70,6 @@ class CodeMessageException(RuntimeError):
|
||||||
self.code = code
|
self.code = code
|
||||||
self.msg = msg
|
self.msg = msg
|
||||||
|
|
||||||
def error_dict(self):
|
|
||||||
return cs_error(self.msg)
|
|
||||||
|
|
||||||
|
|
||||||
class MatrixCodeMessageException(CodeMessageException):
|
|
||||||
"""An error from a general matrix endpoint, eg. from a proxied Matrix API call.
|
|
||||||
|
|
||||||
Attributes:
|
|
||||||
errcode (str): Matrix error code e.g 'M_FORBIDDEN'
|
|
||||||
"""
|
|
||||||
def __init__(self, code, msg, errcode=Codes.UNKNOWN):
|
|
||||||
super(MatrixCodeMessageException, self).__init__(code, msg)
|
|
||||||
self.errcode = errcode
|
|
||||||
|
|
||||||
|
|
||||||
class SynapseError(CodeMessageException):
|
class SynapseError(CodeMessageException):
|
||||||
"""A base exception type for matrix errors which have an errcode and error
|
"""A base exception type for matrix errors which have an errcode and error
|
||||||
|
@ -109,38 +95,28 @@ class SynapseError(CodeMessageException):
|
||||||
self.errcode,
|
self.errcode,
|
||||||
)
|
)
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def from_http_response_exception(cls, err):
|
|
||||||
"""Make a SynapseError based on an HTTPResponseException
|
|
||||||
|
|
||||||
This is useful when a proxied request has failed, and we need to
|
class ProxiedRequestError(SynapseError):
|
||||||
decide how to map the failure onto a matrix error to send back to the
|
"""An error from a general matrix endpoint, eg. from a proxied Matrix API call.
|
||||||
client.
|
|
||||||
|
|
||||||
An attempt is made to parse the body of the http response as a matrix
|
Attributes:
|
||||||
error. If that succeeds, the errcode and error message from the body
|
errcode (str): Matrix error code e.g 'M_FORBIDDEN'
|
||||||
are used as the errcode and error message in the new synapse error.
|
"""
|
||||||
|
def __init__(self, code, msg, errcode=Codes.UNKNOWN, additional_fields=None):
|
||||||
|
super(ProxiedRequestError, self).__init__(
|
||||||
|
code, msg, errcode
|
||||||
|
)
|
||||||
|
if additional_fields is None:
|
||||||
|
self._additional_fields = {}
|
||||||
|
else:
|
||||||
|
self._additional_fields = dict(additional_fields)
|
||||||
|
|
||||||
Otherwise, the errcode is set to M_UNKNOWN, and the error message is
|
def error_dict(self):
|
||||||
set to the reason code from the HTTP response.
|
return cs_error(
|
||||||
|
self.msg,
|
||||||
Args:
|
self.errcode,
|
||||||
err (HttpResponseException):
|
**self._additional_fields
|
||||||
|
)
|
||||||
Returns:
|
|
||||||
SynapseError:
|
|
||||||
"""
|
|
||||||
# try to parse the body as json, to get better errcode/msg, but
|
|
||||||
# default to M_UNKNOWN with the HTTP status as the error text
|
|
||||||
try:
|
|
||||||
j = json.loads(err.response)
|
|
||||||
except ValueError:
|
|
||||||
j = {}
|
|
||||||
errcode = j.get('errcode', Codes.UNKNOWN)
|
|
||||||
errmsg = j.get('error', err.msg)
|
|
||||||
|
|
||||||
res = SynapseError(err.code, errmsg, errcode)
|
|
||||||
return res
|
|
||||||
|
|
||||||
|
|
||||||
class ConsentNotGivenError(SynapseError):
|
class ConsentNotGivenError(SynapseError):
|
||||||
|
@ -309,14 +285,6 @@ class LimitExceededError(SynapseError):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def cs_exception(exception):
|
|
||||||
if isinstance(exception, CodeMessageException):
|
|
||||||
return exception.error_dict()
|
|
||||||
else:
|
|
||||||
logger.error("Unknown exception type: %s", type(exception))
|
|
||||||
return {}
|
|
||||||
|
|
||||||
|
|
||||||
def cs_error(msg, code=Codes.UNKNOWN, **kwargs):
|
def cs_error(msg, code=Codes.UNKNOWN, **kwargs):
|
||||||
""" Utility method for constructing an error response for client-server
|
""" Utility method for constructing an error response for client-server
|
||||||
interactions.
|
interactions.
|
||||||
|
@ -373,7 +341,7 @@ class HttpResponseException(CodeMessageException):
|
||||||
Represents an HTTP-level failure of an outbound request
|
Represents an HTTP-level failure of an outbound request
|
||||||
|
|
||||||
Attributes:
|
Attributes:
|
||||||
response (str): body of response
|
response (bytes): body of response
|
||||||
"""
|
"""
|
||||||
def __init__(self, code, msg, response):
|
def __init__(self, code, msg, response):
|
||||||
"""
|
"""
|
||||||
|
@ -381,7 +349,39 @@ class HttpResponseException(CodeMessageException):
|
||||||
Args:
|
Args:
|
||||||
code (int): HTTP status code
|
code (int): HTTP status code
|
||||||
msg (str): reason phrase from HTTP response status line
|
msg (str): reason phrase from HTTP response status line
|
||||||
response (str): body of response
|
response (bytes): body of response
|
||||||
"""
|
"""
|
||||||
super(HttpResponseException, self).__init__(code, msg)
|
super(HttpResponseException, self).__init__(code, msg)
|
||||||
self.response = response
|
self.response = response
|
||||||
|
|
||||||
|
def to_synapse_error(self):
|
||||||
|
"""Make a SynapseError based on an HTTPResponseException
|
||||||
|
|
||||||
|
This is useful when a proxied request has failed, and we need to
|
||||||
|
decide how to map the failure onto a matrix error to send back to the
|
||||||
|
client.
|
||||||
|
|
||||||
|
An attempt is made to parse the body of the http response as a matrix
|
||||||
|
error. If that succeeds, the errcode and error message from the body
|
||||||
|
are used as the errcode and error message in the new synapse error.
|
||||||
|
|
||||||
|
Otherwise, the errcode is set to M_UNKNOWN, and the error message is
|
||||||
|
set to the reason code from the HTTP response.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
SynapseError:
|
||||||
|
"""
|
||||||
|
# try to parse the body as json, to get better errcode/msg, but
|
||||||
|
# default to M_UNKNOWN with the HTTP status as the error text
|
||||||
|
try:
|
||||||
|
j = json.loads(self.response)
|
||||||
|
except ValueError:
|
||||||
|
j = {}
|
||||||
|
|
||||||
|
if not isinstance(j, dict):
|
||||||
|
j = {}
|
||||||
|
|
||||||
|
errcode = j.pop('errcode', Codes.UNKNOWN)
|
||||||
|
errmsg = j.pop('error', self.msg)
|
||||||
|
|
||||||
|
return ProxiedRequestError(self.code, errmsg, errcode, j)
|
||||||
|
|
|
@ -488,7 +488,7 @@ class FederationClient(FederationBase):
|
||||||
The [Deferred] result of callback, if it succeeds
|
The [Deferred] result of callback, if it succeeds
|
||||||
|
|
||||||
Raises:
|
Raises:
|
||||||
CodeMessageException if the chosen remote server returns a 300/400 code.
|
SynapseError if the chosen remote server returns a 300/400 code.
|
||||||
|
|
||||||
RuntimeError if no servers were reachable.
|
RuntimeError if no servers were reachable.
|
||||||
"""
|
"""
|
||||||
|
@ -504,9 +504,9 @@ class FederationClient(FederationBase):
|
||||||
"Failed to %s via %s: %s",
|
"Failed to %s via %s: %s",
|
||||||
description, destination, e,
|
description, destination, e,
|
||||||
)
|
)
|
||||||
except CodeMessageException as e:
|
except HttpResponseException as e:
|
||||||
if not 500 <= e.code < 600:
|
if not 500 <= e.code < 600:
|
||||||
raise
|
raise e.to_synapse_error()
|
||||||
else:
|
else:
|
||||||
logger.warn(
|
logger.warn(
|
||||||
"Failed to %s via %s: %i %s",
|
"Failed to %s via %s: %i %s",
|
||||||
|
@ -543,7 +543,7 @@ class FederationClient(FederationBase):
|
||||||
Deferred: resolves to a tuple of (origin (str), event (object))
|
Deferred: resolves to a tuple of (origin (str), event (object))
|
||||||
where origin is the remote homeserver which generated the event.
|
where origin is the remote homeserver which generated the event.
|
||||||
|
|
||||||
Fails with a ``CodeMessageException`` if the chosen remote server
|
Fails with a ``SynapseError`` if the chosen remote server
|
||||||
returns a 300/400 code.
|
returns a 300/400 code.
|
||||||
|
|
||||||
Fails with a ``RuntimeError`` if no servers were reachable.
|
Fails with a ``RuntimeError`` if no servers were reachable.
|
||||||
|
@ -599,7 +599,7 @@ class FederationClient(FederationBase):
|
||||||
giving the serer the event was sent to, ``state`` (?) and
|
giving the serer the event was sent to, ``state`` (?) and
|
||||||
``auth_chain``.
|
``auth_chain``.
|
||||||
|
|
||||||
Fails with a ``CodeMessageException`` if the chosen remote server
|
Fails with a ``SynapseError`` if the chosen remote server
|
||||||
returns a 300/400 code.
|
returns a 300/400 code.
|
||||||
|
|
||||||
Fails with a ``RuntimeError`` if no servers were reachable.
|
Fails with a ``RuntimeError`` if no servers were reachable.
|
||||||
|
@ -673,12 +673,17 @@ class FederationClient(FederationBase):
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def send_invite(self, destination, room_id, event_id, pdu):
|
def send_invite(self, destination, room_id, event_id, pdu):
|
||||||
time_now = self._clock.time_msec()
|
time_now = self._clock.time_msec()
|
||||||
code, content = yield self.transport_layer.send_invite(
|
try:
|
||||||
destination=destination,
|
code, content = yield self.transport_layer.send_invite(
|
||||||
room_id=room_id,
|
destination=destination,
|
||||||
event_id=event_id,
|
room_id=room_id,
|
||||||
content=pdu.get_pdu_json(time_now),
|
event_id=event_id,
|
||||||
)
|
content=pdu.get_pdu_json(time_now),
|
||||||
|
)
|
||||||
|
except HttpResponseException as e:
|
||||||
|
if e.code == 403:
|
||||||
|
raise e.to_synapse_error()
|
||||||
|
raise
|
||||||
|
|
||||||
pdu_dict = content["event"]
|
pdu_dict = content["event"]
|
||||||
|
|
||||||
|
@ -709,7 +714,7 @@ class FederationClient(FederationBase):
|
||||||
Return:
|
Return:
|
||||||
Deferred: resolves to None.
|
Deferred: resolves to None.
|
||||||
|
|
||||||
Fails with a ``CodeMessageException`` if the chosen remote server
|
Fails with a ``SynapseError`` if the chosen remote server
|
||||||
returns a 300/400 code.
|
returns a 300/400 code.
|
||||||
|
|
||||||
Fails with a ``RuntimeError`` if no servers were reachable.
|
Fails with a ``RuntimeError`` if no servers were reachable.
|
||||||
|
|
|
@ -26,7 +26,7 @@ from twisted.internet import defer
|
||||||
from synapse.api.errors import (
|
from synapse.api.errors import (
|
||||||
CodeMessageException,
|
CodeMessageException,
|
||||||
Codes,
|
Codes,
|
||||||
MatrixCodeMessageException,
|
HttpResponseException,
|
||||||
SynapseError,
|
SynapseError,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -85,7 +85,6 @@ class IdentityHandler(BaseHandler):
|
||||||
)
|
)
|
||||||
defer.returnValue(None)
|
defer.returnValue(None)
|
||||||
|
|
||||||
data = {}
|
|
||||||
try:
|
try:
|
||||||
data = yield self.http_client.get_json(
|
data = yield self.http_client.get_json(
|
||||||
"https://%s%s" % (
|
"https://%s%s" % (
|
||||||
|
@ -94,11 +93,9 @@ class IdentityHandler(BaseHandler):
|
||||||
),
|
),
|
||||||
{'sid': creds['sid'], 'client_secret': client_secret}
|
{'sid': creds['sid'], 'client_secret': client_secret}
|
||||||
)
|
)
|
||||||
except MatrixCodeMessageException as e:
|
except HttpResponseException as e:
|
||||||
logger.info("getValidated3pid failed with Matrix error: %r", e)
|
logger.info("getValidated3pid failed with Matrix error: %r", e)
|
||||||
raise SynapseError(e.code, e.msg, e.errcode)
|
raise e.to_synapse_error()
|
||||||
except CodeMessageException as e:
|
|
||||||
data = json.loads(e.msg)
|
|
||||||
|
|
||||||
if 'medium' in data:
|
if 'medium' in data:
|
||||||
defer.returnValue(data)
|
defer.returnValue(data)
|
||||||
|
@ -136,7 +133,7 @@ class IdentityHandler(BaseHandler):
|
||||||
)
|
)
|
||||||
logger.debug("bound threepid %r to %s", creds, mxid)
|
logger.debug("bound threepid %r to %s", creds, mxid)
|
||||||
except CodeMessageException as e:
|
except CodeMessageException as e:
|
||||||
data = json.loads(e.msg)
|
data = json.loads(e.msg) # XXX WAT?
|
||||||
defer.returnValue(data)
|
defer.returnValue(data)
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
|
@ -209,12 +206,9 @@ class IdentityHandler(BaseHandler):
|
||||||
params
|
params
|
||||||
)
|
)
|
||||||
defer.returnValue(data)
|
defer.returnValue(data)
|
||||||
except MatrixCodeMessageException as e:
|
except HttpResponseException as e:
|
||||||
logger.info("Proxied requestToken failed with Matrix error: %r", e)
|
|
||||||
raise SynapseError(e.code, e.msg, e.errcode)
|
|
||||||
except CodeMessageException as e:
|
|
||||||
logger.info("Proxied requestToken failed: %r", e)
|
logger.info("Proxied requestToken failed: %r", e)
|
||||||
raise e
|
raise e.to_synapse_error()
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def requestMsisdnToken(
|
def requestMsisdnToken(
|
||||||
|
@ -244,9 +238,6 @@ class IdentityHandler(BaseHandler):
|
||||||
params
|
params
|
||||||
)
|
)
|
||||||
defer.returnValue(data)
|
defer.returnValue(data)
|
||||||
except MatrixCodeMessageException as e:
|
except HttpResponseException as e:
|
||||||
logger.info("Proxied requestToken failed with Matrix error: %r", e)
|
|
||||||
raise SynapseError(e.code, e.msg, e.errcode)
|
|
||||||
except CodeMessageException as e:
|
|
||||||
logger.info("Proxied requestToken failed: %r", e)
|
logger.info("Proxied requestToken failed: %r", e)
|
||||||
raise e
|
raise e.to_synapse_error()
|
||||||
|
|
|
@ -39,12 +39,7 @@ from twisted.web.client import (
|
||||||
from twisted.web.http import PotentialDataLoss
|
from twisted.web.http import PotentialDataLoss
|
||||||
from twisted.web.http_headers import Headers
|
from twisted.web.http_headers import Headers
|
||||||
|
|
||||||
from synapse.api.errors import (
|
from synapse.api.errors import Codes, HttpResponseException, SynapseError
|
||||||
CodeMessageException,
|
|
||||||
Codes,
|
|
||||||
MatrixCodeMessageException,
|
|
||||||
SynapseError,
|
|
||||||
)
|
|
||||||
from synapse.http import cancelled_to_request_timed_out_error, redact_uri
|
from synapse.http import cancelled_to_request_timed_out_error, redact_uri
|
||||||
from synapse.http.endpoint import SpiderEndpoint
|
from synapse.http.endpoint import SpiderEndpoint
|
||||||
from synapse.util.async import add_timeout_to_deferred
|
from synapse.util.async import add_timeout_to_deferred
|
||||||
|
@ -132,6 +127,11 @@ class SimpleHttpClient(object):
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Deferred[object]: parsed json
|
Deferred[object]: parsed json
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
HttpResponseException: On a non-2xx HTTP response.
|
||||||
|
|
||||||
|
ValueError: if the response was not JSON
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# TODO: Do we ever want to log message contents?
|
# TODO: Do we ever want to log message contents?
|
||||||
|
@ -155,7 +155,10 @@ class SimpleHttpClient(object):
|
||||||
|
|
||||||
body = yield make_deferred_yieldable(readBody(response))
|
body = yield make_deferred_yieldable(readBody(response))
|
||||||
|
|
||||||
defer.returnValue(json.loads(body))
|
if 200 <= response.code < 300:
|
||||||
|
defer.returnValue(json.loads(body))
|
||||||
|
else:
|
||||||
|
raise HttpResponseException(response.code, response.phrase, body)
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def post_json_get_json(self, uri, post_json, headers=None):
|
def post_json_get_json(self, uri, post_json, headers=None):
|
||||||
|
@ -169,6 +172,11 @@ class SimpleHttpClient(object):
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Deferred[object]: parsed json
|
Deferred[object]: parsed json
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
HttpResponseException: On a non-2xx HTTP response.
|
||||||
|
|
||||||
|
ValueError: if the response was not JSON
|
||||||
"""
|
"""
|
||||||
json_str = encode_canonical_json(post_json)
|
json_str = encode_canonical_json(post_json)
|
||||||
|
|
||||||
|
@ -193,9 +201,7 @@ class SimpleHttpClient(object):
|
||||||
if 200 <= response.code < 300:
|
if 200 <= response.code < 300:
|
||||||
defer.returnValue(json.loads(body))
|
defer.returnValue(json.loads(body))
|
||||||
else:
|
else:
|
||||||
raise self._exceptionFromFailedRequest(response, body)
|
raise HttpResponseException(response.code, response.phrase, body)
|
||||||
|
|
||||||
defer.returnValue(json.loads(body))
|
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def get_json(self, uri, args={}, headers=None):
|
def get_json(self, uri, args={}, headers=None):
|
||||||
|
@ -213,14 +219,12 @@ class SimpleHttpClient(object):
|
||||||
Deferred: Succeeds when we get *any* 2xx HTTP response, with the
|
Deferred: Succeeds when we get *any* 2xx HTTP response, with the
|
||||||
HTTP body as JSON.
|
HTTP body as JSON.
|
||||||
Raises:
|
Raises:
|
||||||
On a non-2xx HTTP response. The response body will be used as the
|
HttpResponseException On a non-2xx HTTP response.
|
||||||
error message.
|
|
||||||
|
ValueError: if the response was not JSON
|
||||||
"""
|
"""
|
||||||
try:
|
body = yield self.get_raw(uri, args, headers=headers)
|
||||||
body = yield self.get_raw(uri, args, headers=headers)
|
defer.returnValue(json.loads(body))
|
||||||
defer.returnValue(json.loads(body))
|
|
||||||
except CodeMessageException as e:
|
|
||||||
raise self._exceptionFromFailedRequest(e.code, e.msg)
|
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def put_json(self, uri, json_body, args={}, headers=None):
|
def put_json(self, uri, json_body, args={}, headers=None):
|
||||||
|
@ -239,7 +243,9 @@ class SimpleHttpClient(object):
|
||||||
Deferred: Succeeds when we get *any* 2xx HTTP response, with the
|
Deferred: Succeeds when we get *any* 2xx HTTP response, with the
|
||||||
HTTP body as JSON.
|
HTTP body as JSON.
|
||||||
Raises:
|
Raises:
|
||||||
On a non-2xx HTTP response.
|
HttpResponseException On a non-2xx HTTP response.
|
||||||
|
|
||||||
|
ValueError: if the response was not JSON
|
||||||
"""
|
"""
|
||||||
if len(args):
|
if len(args):
|
||||||
query_bytes = urllib.urlencode(args, True)
|
query_bytes = urllib.urlencode(args, True)
|
||||||
|
@ -266,10 +272,7 @@ class SimpleHttpClient(object):
|
||||||
if 200 <= response.code < 300:
|
if 200 <= response.code < 300:
|
||||||
defer.returnValue(json.loads(body))
|
defer.returnValue(json.loads(body))
|
||||||
else:
|
else:
|
||||||
# NB: This is explicitly not json.loads(body)'d because the contract
|
raise HttpResponseException(response.code, response.phrase, body)
|
||||||
# of CodeMessageException is a *string* message. Callers can always
|
|
||||||
# load it into JSON if they want.
|
|
||||||
raise CodeMessageException(response.code, body)
|
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def get_raw(self, uri, args={}, headers=None):
|
def get_raw(self, uri, args={}, headers=None):
|
||||||
|
@ -287,8 +290,7 @@ class SimpleHttpClient(object):
|
||||||
Deferred: Succeeds when we get *any* 2xx HTTP response, with the
|
Deferred: Succeeds when we get *any* 2xx HTTP response, with the
|
||||||
HTTP body at text.
|
HTTP body at text.
|
||||||
Raises:
|
Raises:
|
||||||
On a non-2xx HTTP response. The response body will be used as the
|
HttpResponseException on a non-2xx HTTP response.
|
||||||
error message.
|
|
||||||
"""
|
"""
|
||||||
if len(args):
|
if len(args):
|
||||||
query_bytes = urllib.urlencode(args, True)
|
query_bytes = urllib.urlencode(args, True)
|
||||||
|
@ -311,16 +313,7 @@ class SimpleHttpClient(object):
|
||||||
if 200 <= response.code < 300:
|
if 200 <= response.code < 300:
|
||||||
defer.returnValue(body)
|
defer.returnValue(body)
|
||||||
else:
|
else:
|
||||||
raise CodeMessageException(response.code, body)
|
raise HttpResponseException(response.code, response.phrase, 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.
|
# XXX: FIXME: This is horribly copy-pasted from matrixfederationclient.
|
||||||
# The two should be factored out.
|
# The two should be factored out.
|
||||||
|
|
|
@ -36,7 +36,6 @@ from synapse.api.errors import (
|
||||||
Codes,
|
Codes,
|
||||||
SynapseError,
|
SynapseError,
|
||||||
UnrecognizedRequestError,
|
UnrecognizedRequestError,
|
||||||
cs_exception,
|
|
||||||
)
|
)
|
||||||
from synapse.http.request_metrics import requests_counter
|
from synapse.http.request_metrics import requests_counter
|
||||||
from synapse.util.caches import intern_dict
|
from synapse.util.caches import intern_dict
|
||||||
|
@ -77,16 +76,13 @@ def wrap_json_request_handler(h):
|
||||||
def wrapped_request_handler(self, request):
|
def wrapped_request_handler(self, request):
|
||||||
try:
|
try:
|
||||||
yield h(self, request)
|
yield h(self, request)
|
||||||
except CodeMessageException as e:
|
except SynapseError as e:
|
||||||
code = e.code
|
code = e.code
|
||||||
if isinstance(e, SynapseError):
|
logger.info(
|
||||||
logger.info(
|
"%s SynapseError: %s - %s", request, code, e.msg
|
||||||
"%s SynapseError: %s - %s", request, code, e.msg
|
)
|
||||||
)
|
|
||||||
else:
|
|
||||||
logger.exception(e)
|
|
||||||
respond_with_json(
|
respond_with_json(
|
||||||
request, code, cs_exception(e), send_cors=True,
|
request, code, e.error_dict(), send_cors=True,
|
||||||
pretty_print=_request_user_agent_is_curl(request),
|
pretty_print=_request_user_agent_is_curl(request),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ import re
|
||||||
|
|
||||||
from twisted.internet import defer
|
from twisted.internet import defer
|
||||||
|
|
||||||
from synapse.api.errors import MatrixCodeMessageException, SynapseError
|
from synapse.api.errors import HttpResponseException
|
||||||
from synapse.http.servlet import RestServlet, parse_json_object_from_request
|
from synapse.http.servlet import RestServlet, parse_json_object_from_request
|
||||||
from synapse.types import Requester, UserID
|
from synapse.types import Requester, UserID
|
||||||
from synapse.util.distributor import user_joined_room, user_left_room
|
from synapse.util.distributor import user_joined_room, user_left_room
|
||||||
|
@ -56,11 +56,11 @@ def remote_join(client, host, port, requester, remote_room_hosts,
|
||||||
|
|
||||||
try:
|
try:
|
||||||
result = yield client.post_json_get_json(uri, payload)
|
result = yield client.post_json_get_json(uri, payload)
|
||||||
except MatrixCodeMessageException as e:
|
except HttpResponseException as e:
|
||||||
# We convert to SynapseError as we know that it was a SynapseError
|
# We convert to SynapseError as we know that it was a SynapseError
|
||||||
# on the master process that we should send to the client. (And
|
# on the master process that we should send to the client. (And
|
||||||
# importantly, not stack traces everywhere)
|
# importantly, not stack traces everywhere)
|
||||||
raise SynapseError(e.code, e.msg, e.errcode)
|
raise e.to_synapse_error()
|
||||||
defer.returnValue(result)
|
defer.returnValue(result)
|
||||||
|
|
||||||
|
|
||||||
|
@ -92,11 +92,11 @@ def remote_reject_invite(client, host, port, requester, remote_room_hosts,
|
||||||
|
|
||||||
try:
|
try:
|
||||||
result = yield client.post_json_get_json(uri, payload)
|
result = yield client.post_json_get_json(uri, payload)
|
||||||
except MatrixCodeMessageException as e:
|
except HttpResponseException as e:
|
||||||
# We convert to SynapseError as we know that it was a SynapseError
|
# We convert to SynapseError as we know that it was a SynapseError
|
||||||
# on the master process that we should send to the client. (And
|
# on the master process that we should send to the client. (And
|
||||||
# importantly, not stack traces everywhere)
|
# importantly, not stack traces everywhere)
|
||||||
raise SynapseError(e.code, e.msg, e.errcode)
|
raise e.to_synapse_error()
|
||||||
defer.returnValue(result)
|
defer.returnValue(result)
|
||||||
|
|
||||||
|
|
||||||
|
@ -131,11 +131,11 @@ def get_or_register_3pid_guest(client, host, port, requester,
|
||||||
|
|
||||||
try:
|
try:
|
||||||
result = yield client.post_json_get_json(uri, payload)
|
result = yield client.post_json_get_json(uri, payload)
|
||||||
except MatrixCodeMessageException as e:
|
except HttpResponseException as e:
|
||||||
# We convert to SynapseError as we know that it was a SynapseError
|
# We convert to SynapseError as we know that it was a SynapseError
|
||||||
# on the master process that we should send to the client. (And
|
# on the master process that we should send to the client. (And
|
||||||
# importantly, not stack traces everywhere)
|
# importantly, not stack traces everywhere)
|
||||||
raise SynapseError(e.code, e.msg, e.errcode)
|
raise e.to_synapse_error()
|
||||||
defer.returnValue(result)
|
defer.returnValue(result)
|
||||||
|
|
||||||
|
|
||||||
|
@ -165,11 +165,11 @@ def notify_user_membership_change(client, host, port, user_id, room_id, change):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
result = yield client.post_json_get_json(uri, payload)
|
result = yield client.post_json_get_json(uri, payload)
|
||||||
except MatrixCodeMessageException as e:
|
except HttpResponseException as e:
|
||||||
# We convert to SynapseError as we know that it was a SynapseError
|
# We convert to SynapseError as we know that it was a SynapseError
|
||||||
# on the master process that we should send to the client. (And
|
# on the master process that we should send to the client. (And
|
||||||
# importantly, not stack traces everywhere)
|
# importantly, not stack traces everywhere)
|
||||||
raise SynapseError(e.code, e.msg, e.errcode)
|
raise e.to_synapse_error()
|
||||||
defer.returnValue(result)
|
defer.returnValue(result)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -18,11 +18,7 @@ import re
|
||||||
|
|
||||||
from twisted.internet import defer
|
from twisted.internet import defer
|
||||||
|
|
||||||
from synapse.api.errors import (
|
from synapse.api.errors import CodeMessageException, HttpResponseException
|
||||||
CodeMessageException,
|
|
||||||
MatrixCodeMessageException,
|
|
||||||
SynapseError,
|
|
||||||
)
|
|
||||||
from synapse.events import FrozenEvent
|
from synapse.events import FrozenEvent
|
||||||
from synapse.events.snapshot import EventContext
|
from synapse.events.snapshot import EventContext
|
||||||
from synapse.http.servlet import RestServlet, parse_json_object_from_request
|
from synapse.http.servlet import RestServlet, parse_json_object_from_request
|
||||||
|
@ -83,11 +79,11 @@ def send_event_to_master(clock, store, client, host, port, requester, event, con
|
||||||
# If we timed out we probably don't need to worry about backing
|
# If we timed out we probably don't need to worry about backing
|
||||||
# off too much, but lets just wait a little anyway.
|
# off too much, but lets just wait a little anyway.
|
||||||
yield clock.sleep(1)
|
yield clock.sleep(1)
|
||||||
except MatrixCodeMessageException as e:
|
except HttpResponseException as e:
|
||||||
# We convert to SynapseError as we know that it was a SynapseError
|
# We convert to SynapseError as we know that it was a SynapseError
|
||||||
# on the master process that we should send to the client. (And
|
# on the master process that we should send to the client. (And
|
||||||
# importantly, not stack traces everywhere)
|
# importantly, not stack traces everywhere)
|
||||||
raise SynapseError(e.code, e.msg, e.errcode)
|
raise e.to_synapse_error()
|
||||||
defer.returnValue(result)
|
defer.returnValue(result)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -379,7 +379,7 @@ class MediaRepository(object):
|
||||||
logger.warn("HTTP error fetching remote media %s/%s: %s",
|
logger.warn("HTTP error fetching remote media %s/%s: %s",
|
||||||
server_name, media_id, e.response)
|
server_name, media_id, e.response)
|
||||||
if e.code == twisted.web.http.NOT_FOUND:
|
if e.code == twisted.web.http.NOT_FOUND:
|
||||||
raise SynapseError.from_http_response_exception(e)
|
raise e.to_synapse_error()
|
||||||
raise SynapseError(502, "Failed to fetch remote media")
|
raise SynapseError(502, "Failed to fetch remote media")
|
||||||
|
|
||||||
except SynapseError:
|
except SynapseError:
|
||||||
|
|
Loading…
Reference in a new issue