Don't unfreeze when using FreezeEvent.get_dict, as we are using a JSONEncoder that understands FrozenDict

This commit is contained in:
Erik Johnston 2015-02-11 15:44:28 +00:00
parent 4ebbaf0d43
commit ddb816cf60
6 changed files with 36 additions and 13 deletions

View File

@ -140,10 +140,6 @@ class FrozenEvent(EventBase):
return e
def get_dict(self):
# We need to unfreeze what we return
return unfreeze(super(FrozenEvent, self).get_dict())
def __str__(self):
return self.__repr__()

View File

@ -23,7 +23,8 @@ from twisted.internet import defer
from synapse.util.logutils import log_function
import simplejson as json
from syutil.jsonutil import encode_canonical_json
import logging
@ -70,7 +71,7 @@ class TransactionActions(object):
transaction.transaction_id,
transaction.origin,
code,
json.dumps(response)
encode_canonical_json(response)
)
@defer.inlineCallbacks
@ -100,5 +101,5 @@ class TransactionActions(object):
transaction.transaction_id,
transaction.destination,
response_code,
json.dumps(response_dict)
encode_canonical_json(response_dict)
)

View File

@ -23,6 +23,7 @@ from synapse.api.errors import (
from synapse.api.constants import EventTypes, Membership, RejectedReason
from synapse.util.logutils import log_function
from synapse.util.async import run_on_reactor
from synapse.util.frozenutils import unfreeze
from synapse.crypto.event_signing import (
compute_event_signature, add_hashes_and_signatures,
)
@ -311,9 +312,12 @@ class FederationHandler(BaseHandler):
self.room_queues[room_id] = []
builder = self.event_builder_factory.new(
event.get_pdu_json()
unfreeze(event.get_pdu_json())
)
logger.info("Builder: %s", builder.get_pdu_json())
logger.info("Content: %s", content)
handled_events = set()
try:
@ -324,14 +328,21 @@ class FederationHandler(BaseHandler):
if not hasattr(event, "signatures"):
builder.signatures = {}
logger.info("Content befhahs: %s", builder.content)
add_hashes_and_signatures(
builder,
self.hs.hostname,
self.hs.config.signing_key[0],
)
logger.info("Content aftet hah: %s", builder.content)
logger.info("Content pdu json: %s", builder.get_pdu_json())
new_event = builder.build()
logger.info("Content after build: %s", new_event.content)
# Try the host we successfully got a response to /make_join/
# request first.
try:
@ -340,6 +351,7 @@ class FederationHandler(BaseHandler):
except ValueError:
pass
logger.info(new_event.content)
ret = yield self.replication_layer.send_join(
target_hosts,
new_event
@ -485,6 +497,7 @@ class FederationHandler(BaseHandler):
event.internal_metadata.outlier = False
logger.info(event.content)
context = yield self._handle_new_event(origin, event)
logger.debug(

View File

@ -403,7 +403,9 @@ class RoomMemberHandler(BaseHandler):
"membership": Membership.JOIN,
"content": content,
})
logger.info("Before build: %s", builder.get_pdu_json())
event, context = yield self._create_new_client_event(builder)
logger.info("After build: %s", event.get_dict())
yield self._do_join(event, context, room_hosts=hosts, do_auth=True)
@ -462,7 +464,7 @@ class RoomMemberHandler(BaseHandler):
room_hosts,
room_id,
event.user_id,
event.get_dict()["content"], # FIXME To get a non-frozen dict
event.content, # FIXME To get a non-frozen dict
context
)
else:

View File

@ -298,12 +298,16 @@ class DataStore(RoomMemberStore, RoomStore,
or_replace=True,
)
content = encode_canonical_json(
event.content
).decode("UTF-8")
vals = {
"topological_ordering": event.depth,
"event_id": event.event_id,
"type": event.type,
"room_id": event.room_id,
"content": json.dumps(event.get_dict()["content"]),
"content": content,
"processed": True,
"outlier": outlier,
"depth": event.depth,
@ -323,7 +327,10 @@ class DataStore(RoomMemberStore, RoomStore,
"prev_events",
]
}
vals["unrecognized_keys"] = json.dumps(unrec)
vals["unrecognized_keys"] = encode_canonical_json(
unrec
).decode("UTF-8")
try:
self._simple_insert_txn(

View File

@ -21,6 +21,9 @@ def freeze(o):
if t is dict:
return frozendict({k: freeze(v) for k, v in o.items()})
if t is frozendict:
return o
if t is str or t is unicode:
return o
@ -33,10 +36,11 @@ def freeze(o):
def unfreeze(o):
if isinstance(o, frozendict) or isinstance(o, dict):
t = type(o)
if t is dict or t is frozendict:
return dict({k: unfreeze(v) for k, v in o.items()})
if isinstance(o, basestring):
if t is str or t is unicode:
return o
try: