Merge from trunk
[plcapi.git] / trunk / pycurl / examples / xmlrpc_curl.py
diff --git a/trunk/pycurl/examples/xmlrpc_curl.py b/trunk/pycurl/examples/xmlrpc_curl.py
new file mode 100644 (file)
index 0000000..462bc97
--- /dev/null
@@ -0,0 +1,61 @@
+#! /usr/bin/env python
+# -*- coding: iso-8859-1 -*-
+# vi:ts=4:et
+# $Id$
+
+# We should ignore SIGPIPE when using pycurl.NOSIGNAL - see
+# the libcurl tutorial for more info.
+try:
+    import signal
+    from signal import SIGPIPE, SIG_IGN
+    signal.signal(signal.SIGPIPE, signal.SIG_IGN)
+except ImportError:
+    pass
+try:
+    from cStringIO import StringIO
+except ImportError:
+    from StringIO import StringIO
+import xmlrpclib, pycurl
+
+
+class CURLTransport(xmlrpclib.Transport):
+    """Handles a cURL HTTP transaction to an XML-RPC server."""
+
+    xmlrpc_h = [ "Content-Type: text/xml" ]
+
+    def __init__(self, username=None, password=None):
+        self.c = pycurl.Curl()
+        self.c.setopt(pycurl.POST, 1)
+        self.c.setopt(pycurl.NOSIGNAL, 1)
+        self.c.setopt(pycurl.CONNECTTIMEOUT, 30)
+        self.c.setopt(pycurl.HTTPHEADER, self.xmlrpc_h)
+        if username != None and password != None:
+            self.c.setopt(pycurl.USERPWD, '%s:%s' % (username, password))
+
+    def request(self, host, handler, request_body, verbose=0):
+        b = StringIO()
+        self.c.setopt(pycurl.URL, 'http://%s%s' % (host, handler))
+        self.c.setopt(pycurl.POSTFIELDS, request_body)
+        self.c.setopt(pycurl.WRITEFUNCTION, b.write)
+        self.c.setopt(pycurl.VERBOSE, verbose)
+        self.verbose = verbose
+        try:
+           self.c.perform()
+        except pycurl.error, v:
+            raise xmlrpclib.ProtocolError(
+                host + handler,
+                v[0], v[1], None
+                )
+        b.seek(0)
+        return self.parse_response(b)
+
+
+if __name__ == "__main__":
+    ## Test
+    server = xmlrpclib.ServerProxy("http://betty.userland.com",
+                                   transport=CURLTransport())
+    print server
+    try:
+        print server.examples.getStateName(41)
+    except xmlrpclib.Error, v:
+        print "ERROR", v