X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=curlwrapper.py;h=4aa634d76e30be6e8e465900778cdf312ae42883;hb=93888d28005417008aaf2004628d029c9bf1e5b6;hp=e2595789ac0304b28203fbe69c5b3c234b150e8d;hpb=6e33efd318ed633236365efc648137e6d91e3782;p=nodemanager.git diff --git a/curlwrapper.py b/curlwrapper.py index e259578..4aa634d 100644 --- a/curlwrapper.py +++ b/curlwrapper.py @@ -1,18 +1,36 @@ -from subprocess import PIPE, Popen +# $Id$ +from subprocess import PIPE, Popen +from select import select +# raise xmplrpclib.ProtocolError +import xmlrpclib +import signal +import os +import logger -class CurlException(Exception): pass +class Sopen(Popen): + def kill(self, signal = signal.SIGTERM): + os.kill(self.pid, signal) -def retrieve(url, cacert=None, postdata=None, timeout=300): +def retrieve(url, cacert=None, postdata=None, timeout=90): options = ('/usr/bin/curl', '--fail', '--silent') if cacert: options += ('--cacert', cacert) if postdata: options += ('--data', '@-') - if timeout: options += ('--max-time', str(timeout)) - p = Popen(options + (url,), stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True) + if timeout: + options += ('--max-time', str(timeout)) + options += ('--connect-timeout', str(timeout)) + p = Sopen(options + (url,), stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True) if postdata: p.stdin.write(postdata) p.stdin.close() + sout, sin, serr = select([p.stdout,p.stderr],[],[], timeout) + if len(sout) == 0 and len(sin) == 0 and len(serr) == 0: + logger.verbose("curlwrapper: timed out after %s" % timeout) + p.kill(signal.SIGKILL) data = p.stdout.read() err = p.stderr.read() rc = p.wait() - if rc != 0: raise CurlException(err) - else: return data + if rc != 0: + # when this triggers, the error sometimes doesn't get printed + raise xmlrpclib.ProtocolError(url, rc, err, postdata) + else: + return data