mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-05-02 22:14:55 -04:00
Refactor matrixfederationclient to fix logging (#3906)
We want to wait until we have read the response body before we log the request as complete, otherwise a confusing thing happens where the request appears to have completed, but we later fail it. To do this, we factor the salient details of a request out to a separate object, which can then keep track of the txn_id, so that it can be logged.
This commit is contained in:
parent
c600886d47
commit
31c15dcb80
5 changed files with 359 additions and 186 deletions
|
@ -280,3 +280,84 @@ def get_clock():
|
|||
clock = ThreadedMemoryReactorClock()
|
||||
hs_clock = Clock(clock)
|
||||
return (clock, hs_clock)
|
||||
|
||||
|
||||
@attr.s
|
||||
class FakeTransport(object):
|
||||
"""
|
||||
A twisted.internet.interfaces.ITransport implementation which sends all its data
|
||||
straight into an IProtocol object: it exists to connect two IProtocols together.
|
||||
|
||||
To use it, instantiate it with the receiving IProtocol, and then pass it to the
|
||||
sending IProtocol's makeConnection method:
|
||||
|
||||
server = HTTPChannel()
|
||||
client.makeConnection(FakeTransport(server, self.reactor))
|
||||
|
||||
If you want bidirectional communication, you'll need two instances.
|
||||
"""
|
||||
|
||||
other = attr.ib()
|
||||
"""The Protocol object which will receive any data written to this transport.
|
||||
|
||||
:type: twisted.internet.interfaces.IProtocol
|
||||
"""
|
||||
|
||||
_reactor = attr.ib()
|
||||
"""Test reactor
|
||||
|
||||
:type: twisted.internet.interfaces.IReactorTime
|
||||
"""
|
||||
|
||||
disconnecting = False
|
||||
buffer = attr.ib(default=b'')
|
||||
producer = attr.ib(default=None)
|
||||
|
||||
def getPeer(self):
|
||||
return None
|
||||
|
||||
def getHost(self):
|
||||
return None
|
||||
|
||||
def loseConnection(self):
|
||||
self.disconnecting = True
|
||||
|
||||
def abortConnection(self):
|
||||
self.disconnecting = True
|
||||
|
||||
def pauseProducing(self):
|
||||
self.producer.pauseProducing()
|
||||
|
||||
def unregisterProducer(self):
|
||||
if not self.producer:
|
||||
return
|
||||
|
||||
self.producer = None
|
||||
|
||||
def registerProducer(self, producer, streaming):
|
||||
self.producer = producer
|
||||
self.producerStreaming = streaming
|
||||
|
||||
def _produce():
|
||||
d = self.producer.resumeProducing()
|
||||
d.addCallback(lambda x: self._reactor.callLater(0.1, _produce))
|
||||
|
||||
if not streaming:
|
||||
self._reactor.callLater(0.0, _produce)
|
||||
|
||||
def write(self, byt):
|
||||
self.buffer = self.buffer + byt
|
||||
|
||||
def _write():
|
||||
if getattr(self.other, "transport") is not None:
|
||||
self.other.dataReceived(self.buffer)
|
||||
self.buffer = b""
|
||||
return
|
||||
|
||||
self._reactor.callLater(0.0, _write)
|
||||
|
||||
_write()
|
||||
|
||||
def writeSequence(self, seq):
|
||||
for x in seq:
|
||||
self.write(x)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue