set svn:keywords property for proper keywords expansion
[plcapi.git] / pycurl / examples / xmlrpc_curl.py
1 #! /usr/bin/env python
2 # -*- coding: iso-8859-1 -*-
3 # vi:ts=4:et
4 # $Id$
5
6 # We should ignore SIGPIPE when using pycurl.NOSIGNAL - see
7 # the libcurl tutorial for more info.
8 try:
9     import signal
10     from signal import SIGPIPE, SIG_IGN
11     signal.signal(signal.SIGPIPE, signal.SIG_IGN)
12 except ImportError:
13     pass
14 try:
15     from cStringIO import StringIO
16 except ImportError:
17     from StringIO import StringIO
18 import xmlrpclib, pycurl
19
20
21 class CURLTransport(xmlrpclib.Transport):
22     """Handles a cURL HTTP transaction to an XML-RPC server."""
23
24     xmlrpc_h = [ "Content-Type: text/xml" ]
25
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))
34
35     def request(self, host, handler, request_body, verbose=0):
36         b = StringIO()
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
42         try:
43            self.c.perform()
44         except pycurl.error, v:
45             raise xmlrpclib.ProtocolError(
46                 host + handler,
47                 v[0], v[1], None
48                 )
49         b.seek(0)
50         return self.parse_response(b)
51
52
53 if __name__ == "__main__":
54     ## Test
55     server = xmlrpclib.ServerProxy("http://betty.userland.com",
56                                    transport=CURLTransport())
57     print server
58     try:
59         print server.examples.getStateName(41)
60     except xmlrpclib.Error, v:
61         print "ERROR", v