get rid of curlwrapper.CurlException and raise xmlrpclib.ProtocolError instead
[nodemanager.git] / curlwrapper.py
1 # $Id$
2
3 from subprocess import PIPE, Popen
4 # raise xmplrpclib.ProtocolError
5 import xmlrpclib
6
7 def retrieve(url, cacert=None, postdata=None, timeout=300):
8     options = ('/usr/bin/curl', '--fail', '--silent')
9     if cacert: options += ('--cacert', cacert)
10     if postdata: options += ('--data', '@-')
11     if timeout: options += ('--max-time', str(timeout))
12     p = Popen(options + (url,), stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
13     if postdata: p.stdin.write(postdata)
14     p.stdin.close()
15     data = p.stdout.read()
16     err = p.stderr.read()
17     rc = p.wait()
18     if rc != 0: 
19         # when this triggers, the error sometimes doesn't get printed
20         print 'curlwrapper.retrieve: raising xmlrpclib.ProtocolError\n  (url=%s,code=%d,stderr=%s,post=%r)'\
21             %(url,rc,err,postdata)
22         if cacert: print "Using cacert file %s"%cacert
23         raise xmlrpclib.ProtocolError(url, rc, err, postdata)
24     else: 
25         return data