From 7d053cfe10c7be4327b774c6552d21594dcdd2be Mon Sep 17 00:00:00 2001
From: Andrew Morgan <andrew@amorgan.xyz>
Date: Wed, 13 Mar 2019 12:10:33 +0000
Subject: [PATCH] Retry on 400:M_UNRECOGNIZED

---
 synapse/http/matrixfederationclient.py | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/synapse/http/matrixfederationclient.py b/synapse/http/matrixfederationclient.py
index 7efa7b7572..fc8cf92067 100644
--- a/synapse/http/matrixfederationclient.py
+++ b/synapse/http/matrixfederationclient.py
@@ -474,8 +474,7 @@ class MatrixFederationHttpClient(object):
                  long_retries=False, timeout=None,
                  ignore_backoff=False,
                  backoff_on_404=False,
-                 try_trailing_slash_on_404=False,
-            ):
+                 try_trailing_slash_on_404=False):
         """ Sends the specifed json data using PUT
 
         Args:
@@ -662,14 +661,19 @@ class MatrixFederationHttpClient(object):
 
         response = yield self._send_request(**send_request_args)
 
+        body = yield _handle_json_response(
+            self.hs.get_reactor(), self.default_timeout, request, response,
+        )
+
         # If enabled, retry with a trailing slash if we received a 404
-        if try_trailing_slash_on_404 and response.code == 404:
+        # or if a 400 with "M_UNRECOGNIZED" which some endpoints return
+        if (try_trailing_slash_on_404 and
+           (response.code == 404
+            or (response.code == 400
+                and body.get("errcode") == "M_UNRECOGNIZED"))):
             args["path"] += "/"
             response = yield self._send_request(**send_request_args)
 
-        body = yield _handle_json_response(
-            self.hs.get_reactor(), self.default_timeout, request, response,
-        )
         defer.returnValue(body)
 
     @defer.inlineCallbacks
-- 
GitLab