summary refs log tree commit diff
path: root/synapse/http
diff options
context:
space:
mode:
authorAndrew Morgan <andrew@amorgan.xyz>2019-03-08 18:22:47 +0000
committerAndrew Morgan <andrew@amorgan.xyz>2019-03-08 18:22:47 +0000
commit64ff11019e11a712278fdb4fbc0a5f8307f83ddb (patch)
treef83770944a0640bbbee485c3a2b64754c9fc2a69 /synapse/http
parentRemove trailing slashes from outbound federation requests (diff)
downloadsynapse-64ff11019e11a712278fdb4fbc0a5f8307f83ddb.tar.xz
Retry certain federation requests on 404
Diffstat (limited to 'synapse/http')
-rw-r--r--synapse/http/matrixfederationclient.py45
1 files changed, 45 insertions, 0 deletions
diff --git a/synapse/http/matrixfederationclient.py b/synapse/http/matrixfederationclient.py
index 1682c9af13..8776639d6a 100644
--- a/synapse/http/matrixfederationclient.py
+++ b/synapse/http/matrixfederationclient.py
@@ -644,6 +644,51 @@ class MatrixFederationHttpClient(object):
         defer.returnValue(body)
 
     @defer.inlineCallbacks
+    def get_json_with_trailing_slashes_on_404(self, args={}):
+        """Runs client.get_json under the hood, but if receiving a 404, tries
+        the request again with a trailing slash. This is a result of removing
+        trailing slashes from some federation endpoints and in an effort to
+        remain backwards compatible with older versions of Synapse, we try
+        again if a server requires a trailing slash.
+
+        Args:
+            args (dict): A dictionary of arguments matching those provided by put_json.
+        Returns:
+            Deferred[dict|list]: Succeeds when we get a 2xx HTTP response. The
+            result will be the decoded JSON body.
+        """
+        response = yield self.get_json(**args)
+
+        # Retry with a trailing slash if we received a 404
+        if response.code == 404:
+            args["path"] += "/"
+            response = yield self.get_json(**args)
+
+        defer.returnValue(response)
+
+    @defer.inlineCallbacks
+    def put_json_with_trailing_slashes_on_404(self, args={}):
+        """Runs client.put_json under the hood, but if receiving a 404, tries
+        the request again with a trailing slash.
+
+        See get_json_with_trailing_slashes_on_404 for more details.
+
+        Args:
+            args (dict): A dictionary of arguments matching those provided by put_json.
+        Returns:
+            Deferred[dict|list]: Succeeds when we get a 2xx HTTP response. The
+            result will be the decoded JSON body.
+        """
+        response = yield self.put_json(**args)
+
+        # Retry with a trailing slash if we received a 404
+        if response.code == 404:
+            args["path"] += "/"
+            response = yield self.put_json(**args)
+
+        defer.returnValue(response)
+
+    @defer.inlineCallbacks
     def delete_json(self, destination, path, long_retries=False,
                     timeout=None, ignore_backoff=False, args={}):
         """Send a DELETE request to the remote expecting some json response