2 # -*- coding: iso-8859-1 -*-
6 # We should ignore SIGPIPE when using pycurl.NOSIGNAL - see
7 # the libcurl tutorial for more info.
10 from signal import SIGPIPE, SIG_IGN
11 signal.signal(signal.SIGPIPE, signal.SIG_IGN)
15 from cStringIO import StringIO
17 from StringIO import StringIO
18 import xmlrpclib, pycurl
21 class CURLTransport(xmlrpclib.Transport):
22 """Handles a cURL HTTP transaction to an XML-RPC server."""
24 xmlrpc_h = [ "Content-Type: text/xml" ]
26 def __init__(self, username=None, password=None):
27 self.c = pycurl.Curl()
28 self.c.setopt(pycurl.POST, 1)
29 self.c.setopt(pycurl.NOSIGNAL, 1)
30 self.c.setopt(pycurl.CONNECTTIMEOUT, 30)
31 self.c.setopt(pycurl.HTTPHEADER, self.xmlrpc_h)
32 if username != None and password != None:
33 self.c.setopt(pycurl.USERPWD, '%s:%s' % (username, password))
35 def request(self, host, handler, request_body, verbose=0):
37 self.c.setopt(pycurl.URL, 'http://%s%s' % (host, handler))
38 self.c.setopt(pycurl.POSTFIELDS, request_body)
39 self.c.setopt(pycurl.WRITEFUNCTION, b.write)
40 self.c.setopt(pycurl.VERBOSE, verbose)
41 self.verbose = verbose
44 except pycurl.error, v:
45 raise xmlrpclib.ProtocolError(
50 return self.parse_response(b)
53 if __name__ == "__main__":
55 server = xmlrpclib.ServerProxy("http://betty.userland.com",
56 transport=CURLTransport())
59 print server.examples.getStateName(41)
60 except xmlrpclib.Error, v: