From a7eb946628946d609dd5c6504280c23e5df4f335 Mon Sep 17 00:00:00 2001 From: Patrick Cloke Date: Fri, 17 Dec 2021 11:39:13 -0500 Subject: [PATCH] Return JSON errors instead of HTML errors for unknown resources. --- synapse/http/server.py | 11 +++++++++++ synapse/util/httpresourcetree.py | 6 ++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/synapse/http/server.py b/synapse/http/server.py index 7bbbe7648b8f..e15cd2438b28 100644 --- a/synapse/http/server.py +++ b/synapse/http/server.py @@ -559,6 +559,17 @@ def getChildWithDefault(self, path: str, request: Request) -> resource.Resource: return super().getChildWithDefault(path, request) +class MissingResource(resource.Resource): + """Similar to resource.NoResource, but returns a JSON error with proper CORS headers.""" + + def render(self, request: SynapseRequest) -> int: + return_json_error(failure.Failure(UnrecognizedRequestError()), request) + return NOT_DONE_YET + + def getChild(self, name: str, request: Request) -> resource.Resource: + return self + + class RootOptionsRedirectResource(OptionsResource, RootRedirect): pass diff --git a/synapse/util/httpresourcetree.py b/synapse/util/httpresourcetree.py index a0606851f7fb..55b0ff9b549b 100644 --- a/synapse/util/httpresourcetree.py +++ b/synapse/util/httpresourcetree.py @@ -15,7 +15,9 @@ import logging from typing import Dict -from twisted.web.resource import NoResource, Resource +from twisted.web.resource import Resource + +from synapse.http.server import MissingResource logger = logging.getLogger(__name__) @@ -49,7 +51,7 @@ def create_resource_tree( for path_seg in full_path.split(b"/")[1:-1]: if path_seg not in last_resource.listNames(): # resource doesn't exist, so make a "dummy resource" - child_resource: Resource = NoResource() + child_resource: Resource = MissingResource() last_resource.putChild(path_seg, child_resource) res_id = _resource_id(last_resource, path_seg) resource_mappings[res_id] = child_resource