[Twisted-Python] NetstringReceiver
Albert Brandl
albert.brandl at weiermayer.com
Fri Mar 26 06:25:48 EDT 2010
On Thu, Mar 25, 2010 at 09:22:03AM +1100, Andrew Bennetts wrote:
>
> No; I think once loseConnection has been called dataReceived won't be
> called again, so there's no point checking for brokenPeer in
> dataReceived.
There is a unittest that assumes that dataReceives still works after
sending in garbage:
def test_illegal(self):
"""
Assert that illegal strings cause the transport to be closed.
"""
for s in self.illegalStrings:
r = self.getProtocol()
for c in s:
r.dataReceived(c)
self.assertTrue(r.transport.disconnecting)
self.illegalStrings is defined as
illegalStrings = [
'9999999999999999999999', 'abc', '4:abcde',
'51:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab,',]
In this implementation, the dataReceived method has to be functional
even after the NetstringReceiver has detected that the received
data are garbage. And there is no direct information that the
received string was no valid netstring - you have to check for
r.transport.disconnecting.
That's why I thought it might be a good idea to raise an appropriate
exception if the receiver is no longer functional. I use a generator-
based approach to parsing the netstring (for details see
http://twistedmatrix.com/trac/attachment/ticket/4378/ticket_4378.patch),
and the generator raises a StopIteration exception.
But I'd prefer to raise an exception that explains what happened at a
higher level - that's why I asked if there was some predefined exception
that would match this kind of problem.
> There are some existing tests for NetstringReceiver in
> twisted/test/test_protocols.py.
Thanks, this was very helpful.
Regards,
--
DI Albert Brandl
Weiermayer Solutions GmbH
4813 Altmünster | Abteistraße 12 | Austria
Fon: +43(0)720 70 30 14 | Fax: +43 (0) 7612 88081
More information about the Twisted-Python
mailing list