[Twisted-Python] A bug of the DNSDatagramProtocol

exarkun at twistedmatrix.com exarkun at twistedmatrix.com
Fri Jun 7 05:38:56 MDT 2013


On 03:24 am, z858570636 at gmail.com wrote:
>when i run the code:
>        df = Deferred()
>        name = Name('version.bind')
>        axf = AXFRController(name,df)
>        dns = DNSDatagramProtocol(axf)
>        d = dns.query((ip,53),[Query('version.bind',TXT,CH)])
>it raise the error :
>Traceback (most recent call last):
>  File "/usr/local/lib/python2.7/site-packages/twisted/python/log.py", 
>line
>73, in callWithContext
>    return context.call({ILogContext: newCtx}, func, *args, **kw)
>  File "/usr/local/lib/python2.7/site- 
>packages/twisted/python/context.py",
>line 118, in callWithContext
>    return self.currentContext().callWithContext(ctx, func, *args, **kw)
>  File "/usr/local/lib/python2.7/site- 
>packages/twisted/python/context.py",
>line 81, in callWithContext
>    return func(*args,**kw)
>  File
>"/usr/local/lib/python2.7/site-packages/twisted/internet/posixbase.py",
>line 614, in _doReadOrWrite
>    why = selectable.doRead()
>--- <exception caught here> ---
>  File "/usr/local/lib/python2.7/site-packages/twisted/internet/udp.py",
>line 149, in doRead
>    self.protocol.datagramReceived(data, addr)
>  File "/usr/local/lib/python2.7/site-packages/twisted/names/dns.py", 
>line
>1936, in datagramReceived
>    self.controller.messageReceived(m, self, addr)
>exceptions.TypeError: messageReceived() takes exactly 3 arguments (4 
>given)
>Unhandled Error
>
>and the I set the DNSDatagramProtocol.datagramReceived's last row
>self.controller.messageReceived(m, self, addr)
>to
>self.controller.messageReceived(m, self)
>it'ok!
>And this is a bug????

Hello,

I tried turning your code into an <http://sscce.org/>:

    from __future__ import print_function

    from twisted.internet.defer import Deferred
    from twisted.names.dns import TXT, CH, Name, Query, 
DNSDatagramProtocol
    from twisted.names.client import AXFRController

    from twisted.internet.task import react

    def main(reactor):
        ip = '8.8.8.8'
        df = Deferred()
        name = Name('version.bind')
        axf = AXFRController(name,df)
        dns = DNSDatagramProtocol(axf)
        d = dns.query((ip,53),[Query('version.bind',TXT,CH)])
        d.addCallback(print)
        return d

    react(main, [])

But I wasn't able to reproduce the error you encountered, instead I get 
the output:

    <twisted.names.dns.Message instance at 0x18642d8>

Perhaps the error has something to do with how the DNS server responds. 
If so, can you expand this minimal example to include a server that 
sends a response that triggers the bug (Twisted Names itself can be used 
as such a server, or you could hard-code the response you're seeing 
locally)?  Alternatively if you could turn this into a unit test that 
doesn't actually interact with a network, that would also be great.

Thanks,
Jean-Paul



More information about the Twisted-Python mailing list