summary refs log tree commit diff
diff options
context:
space:
mode:
authorKegan Dougal <kegan@matrix.org>2014-09-03 16:27:01 +0100
committerKegan Dougal <kegan@matrix.org>2014-09-03 16:27:01 +0100
commit581c54bebef865039352f4ec141c98413cb45f53 (patch)
tree4f249c2cbe11122152594a96eec1b2a59fb673d8
parentFix up directory server to not require uploading room hosts. Update the room ... (diff)
downloadsynapse-581c54bebef865039352f4ec141c98413cb45f53.tar.xz
Add exception handling to directory servlet, so we don't 500. Mark directory API as volatile in the api docs.
-rw-r--r--docs/client-server/swagger_matrix/api-docs-directory2
-rw-r--r--synapse/rest/directory.py18
2 files changed, 18 insertions, 2 deletions
diff --git a/docs/client-server/swagger_matrix/api-docs-directory b/docs/client-server/swagger_matrix/api-docs-directory
index 380ec3f477..ce12be8c96 100644
--- a/docs/client-server/swagger_matrix/api-docs-directory
+++ b/docs/client-server/swagger_matrix/api-docs-directory
@@ -13,6 +13,7 @@
         {
           "method": "GET",
           "summary": "Get the room ID corresponding to this room alias.",
+          "notes": "Volatile: This API is likely to change.",
           "type": "DirectoryResponse",
           "nickname": "get_room_id_for_alias",
           "parameters": [
@@ -28,6 +29,7 @@
         {
           "method": "PUT",
           "summary": "Create a new mapping from room alias to room ID.",
+          "notes": "Volatile: This API is likely to change.",
           "type": "void",
           "nickname": "add_room_alias",
           "parameters": [
diff --git a/synapse/rest/directory.py b/synapse/rest/directory.py
index 29ace4f1d3..d02b15395b 100644
--- a/synapse/rest/directory.py
+++ b/synapse/rest/directory.py
@@ -16,6 +16,7 @@
 
 from twisted.internet import defer
 
+from synapse.api.errors import SynapseError, Codes
 from base import RestServlet, client_path_pattern
 
 import json
@@ -44,8 +45,10 @@ class ClientDirectoryServer(RestServlet):
 
     @defer.inlineCallbacks
     def on_PUT(self, request, room_alias):
-        # TODO(erikj): Exceptions
-        content = json.loads(request.content.read())
+        content = _parse_json(request)
+        if not "room_id" in content:
+            raise SynapseError(400, "Missing room_id key",
+                               errcode=Codes.BAD_JSON)
 
         logger.debug("Got content: %s", content)
 
@@ -72,3 +75,14 @@ class ClientDirectoryServer(RestServlet):
             logger.exception("Failed to create association")
 
         defer.returnValue((200, {}))
+
+
+def _parse_json(request):
+    try:
+        content = json.loads(request.content.read())
+        if type(content) != dict:
+            raise SynapseError(400, "Content must be a JSON object.",
+                               errcode=Codes.NOT_JSON)
+        return content
+    except ValueError:
+        raise SynapseError(400, "Content not JSON.", errcode=Codes.NOT_JSON)