diff --git a/synapse/rest/room.py b/synapse/rest/room.py
index 4ca7e7e785..731317227d 100644
--- a/synapse/rest/room.py
+++ b/synapse/rest/room.py
@@ -374,17 +374,41 @@ class RoomMembershipRestServlet(RestServlet):
"(?P<membership_action>join|invite|leave)")
register_txn_path(self, PATTERN, http_server)
+ @defer.inlineCallbacks
def on_POST(self, request, room_id, membership_action):
- return (200, "POST Not implemented")
+ user = yield self.auth.get_user_by_req(request)
+
+ content = _parse_json(request)
+ # target user is you unless it is an invite
+ state_key = user.to_string()
+ if membership_action == "invite":
+ if "user_id" not in content:
+ raise SynapseError(400, "Missing user_id key.")
+ state_key = content["user_id"]
+
+ event = self.event_factory.create_event(
+ etype=RoomMemberEvent.TYPE,
+ content={"membership": unicode(membership_action)},
+ room_id=urllib.unquote(room_id),
+ user_id=user.to_string(),
+ state_key=state_key
+ )
+ handler = self.handlers.room_member_handler
+ yield handler.change_membership(event)
+ defer.returnValue((200, ""))
+
+ @defer.inlineCallbacks
def on_PUT(self, request, room_id, membership_action, txn_id):
- (code, response) = self.txns.get_client_transaction(request, txn_id)
- if code:
- return (code, response)
+ try:
+ defer.returnValue(self.txns.get_client_transaction(request, txn_id))
+ except:
+ pass
+
+ response = yield self.on_POST(request, room_id, membership_action)
- response = (200, "PUT not implemented txnid %s" % txn_id)
self.txns.store_client_transaction(request, txn_id, response)
- return response
+ defer.returnValue(response)
def _parse_json(request):
diff --git a/synapse/rest/transactions.py b/synapse/rest/transactions.py
index 10be10e903..b8aa1ef11c 100644
--- a/synapse/rest/transactions.py
+++ b/synapse/rest/transactions.py
@@ -41,6 +41,7 @@ class HttpTransactionStore(object):
logger.debug("get_response Key: %s TxnId: %s", key, txn_id)
(last_txn_id, response) = self.transactions[key]
if txn_id == last_txn_id:
+ logger.info("get_response: Returning a response for %s", key)
return response
except KeyError:
pass
@@ -78,11 +79,13 @@ class HttpTransactionStore(object):
request must have the transaction ID as the last path segment.
txn_id (str): The transaction ID for this request.
Returns:
- The response tuple or (None, None).
+ The response tuple.
+ Raises:
+ KeyError if the transaction was not found.
"""
response = self.get_response(self._get_key(request), txn_id)
if response is None:
- return (None, None)
+ raise KeyError("Transaction not found.")
return response
def _get_key(self, request):
|