]> git.mxchange.org Git - quix0rs-apt-p2p.git/blob - xmlrpcclient.py
grab the remote end's IP address
[quix0rs-apt-p2p.git] / xmlrpcclient.py
1 from twisted.internet.protocol import ClientFactory
2 from twisted.protocols.http import HTTPClient
3 from twisted.internet.defer import Deferred
4
5 from xmlrpclib import loads, dumps
6 import socket
7
8 USER_AGENT = 'Python/Twisted XMLRPC 0.1'
9 class XMLRPCClient(HTTPClient):
10     def connectionMade(self):
11         payload = dumps(self.args, self.method)
12         self.sendCommand('POST', '/RPC2')
13         self.sendHeader('User-Agent', USER_AGENT)
14         self.sendHeader('Content-Type', 'text/xml')
15         self.sendHeader('Content-Length', len(payload))
16         self.endHeaders()
17         self.transport.write(payload)
18         self.transport.write('\r\n')
19         
20     def handleResponse(self, buf):
21         try:
22             self.thehost = self.transport.getHost()[1]
23         except:
24             self.thehost = None
25         try:
26             args, name = loads(buf)
27         except Exception, e:
28             print "response decode error: " + `e`
29             self.d.errback()
30         else:
31             l = []
32             for i in args:
33                 l.append(i)
34             l.append({'host' : self.thehost})
35             apply(self.d.callback, (l,))
36
37 class XMLRPCClientFactory(ClientFactory):
38     def __init__(self, method, args, callback=None, errback=None):
39         self.method = method
40         self.args = args
41         self.d = Deferred()
42         if callback:
43             self.d.addCallback(callback)
44         if errback:
45             self.d.addErrback(errback)
46             
47     def buildProtocol(self, addr):
48         prot =  XMLRPCClient()
49         prot.method = self.method
50         prot.args = self.args
51         prot.d = self.d
52         return prot
53
54     def clientConnectionFailed(self, connector, reason):
55         self.d.errback()