[Twisted-Python] access an XMLRPC service through an HTTP proxy

Antoine Pitrou solipsis at pitrou.net
Wed Dec 29 07:49:17 EST 2004


> I'm using twisted.web.xmlrpc.Proxy to connect to an XMLRPC service.
> Unfortunately there are situations in which I have to go through an HTTP
> proxy, yet there doesn't seem to be an option for this (and looking at
> the code, the connection to the remote server is quite "harwired").

Replying to myself... The following seems to work (I didn't test with
HTTPS) :

import urlparse
import twisted.web.xmlrpc as xmlrpc

class ProxiedXMLRPC:
    """
    A Proxy for making remote XML-RPC calls accross an HTTP proxy.

    Pass the URL of the remote XML-RPC server to the constructor,
    as well as the proxy host and port.

    Use proxy.callRemote('foobar', *args) to call remote method
    'foobar' with *args.
    """

    def __init__(self, reactor, url, proxy_host, proxy_port):
        self.reactor = reactor
        self.url = url
        self.proxy_host = proxy_host
        self.proxy_port = proxy_port
        parts = urlparse.urlparse(url)
        self.remote_host = parts[1]
        self.secure = parts[0] == 'https'

    def callRemote(self, method, *args):
        factory = xmlrpc.QueryFactory(self.url, self.remote_host, method, *args)
        if self.secure:
            from twisted.internet import ssl
            self.reactor.connectSSL(self.proxy_host, self.proxy_port,
                               factory, ssl.ClientContextFactory())
        else:
            self.reactor.connectTCP(self.proxy_host, self.proxy_port, factory)
        return factory.deferred


Regards

Antoine.






More information about the Twisted-Python mailing list