[Twisted-Python] Queries about connecting to a XML-RPC server over IPv6
Amit Saha
asaha at redhat.com
Thu Dec 12 05:23:40 MST 2013
----- Original Message -----
> From: "Amit Saha" <asaha at redhat.com>
> To: "Twisted general discussion" <twisted-python at twistedmatrix.com>
> Sent: Tuesday, December 10, 2013 11:59:27 AM
> Subject: Re: [Twisted-Python] Queries about connecting to a XML-RPC server over IPv6
>
>
>
> ----- Original Message -----
> > From: "Phil Mayers" <p.mayers at imperial.ac.uk>
> > To: twisted-python at twistedmatrix.com
> > Sent: Monday, December 9, 2013 7:33:17 PM
> > Subject: Re: [Twisted-Python] Queries about connecting to a XML-RPC server
> > over IPv6
> >
> > On 09/12/13 05:28, Amit Saha wrote:
> >
> > > proxy = Proxy('http://localhost6:8000')
> > > proxy.callRemote('my_proxy_method').addCallbacks(printValue, printError)
> > >
> > >
> > > When I run it, i get "No route to host: 101, Network is unreachable".
> > >
> > > However, 'curl -6 localhost:8000' succeeds. What could be going on here?
> >
> > The IPv6 support in Twisted is very new - check your version even *has*
> > it - and it's still a work in progress. You might find that you can't do
> > this. I'd have to read the code to be sure and I don't have time right
> > now, but my guess is that t.w.xmlrpc isn't "getaddrinfo"-ised so won't
> > connect to IPv6 names.
> >
> > If your version of Twisted supports it, you could probably work around
> > this by sub-classing Proxy and calling reactor.connectTCP('::1', 8000)
> > to attach the protocol yourself.
>
> Thanks for your reply, Phil. So, I basically modified twisted/web/xmlrpc.py
> so that
> when it was calling connectTCP(), i substituted '::1' in place of self.host
> and yes the method is called successfully.
>
> I will consider your other hints and see if there is an easy way to work
> around this
> in my particular use case.
I finally ended up doing this:
(Sorry for the +)
+class ProxyIPv6(xmlrpc.Proxy):
+
+ def __init__(self, url, **kwargs):
+
+ xmlrpc.Proxy.__init__(self, url, kwargs)
+ # resolve the LC's host/port to IPv6 address
+ # and overrise self.host
+ retries = 0
+ while retries < 5:
+ try:
+ self.host = socket.getaddrinfo(self.host, self.port,
+ socket.AF_INET6, 0, socket.SOL_TCP)[0][4][0]
+ except:
+ # IPv6 look up failed
+ log.debug('Failed to look up IPv6 address for LC. Sleeping for 5s')
+ time.sleep(5)
+ retries += 1
+ else:
+ log.info('Resolved IPv6 address of the LC.')
+ break
I have the retry loop since I saw that the IPv6 name resolution was failing once, but never happened
after that. The particular use case I am currently applying this is in a daemon process which starts on boot
on a IPv4 and IPv6 system. Then I disable IPv4 and the communication with the XML-RPC proxy server
happens only over IPv6.
Thanks for the pointers earlier.
-Amit.
--
Amit Saha <http://echorand.me>
More information about the Twisted-Python
mailing list