From ba26952042ff8591b223fdb7413946cd5df91de3 Mon Sep 17 00:00:00 2001 From: Faiyaz Ahmed Date: Tue, 17 Jun 2008 18:47:22 +0000 Subject: [PATCH] Timeout curl in the event Apache (PLC side) opens the XMLRPC session, but returns no data for specified timeout. --- curlwrapper.py | 23 +++++++++++++++++------ plcapi.py | 2 ++ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/curlwrapper.py b/curlwrapper.py index 54394d9..4aa634d 100644 --- a/curlwrapper.py +++ b/curlwrapper.py @@ -1,25 +1,36 @@ # $Id$ from subprocess import PIPE, Popen +from select import select # raise xmplrpclib.ProtocolError import xmlrpclib +import signal +import os +import logger -def retrieve(url, cacert=None, postdata=None, timeout=300): +class Sopen(Popen): + def kill(self, signal = signal.SIGTERM): + os.kill(self.pid, signal) + +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: # when this triggers, the error sometimes doesn't get printed - print 'curlwrapper.retrieve: raising xmlrpclib.ProtocolError\n (url=%s,code=%d,stderr=%s,post=%r)'\ - %(url,rc,err,postdata) - if cacert: print "Using cacert file %s"%cacert raise xmlrpclib.ProtocolError(url, rc, err, postdata) else: return data diff --git a/plcapi.py b/plcapi.py index 4581fc6..759207e 100644 --- a/plcapi.py +++ b/plcapi.py @@ -1,3 +1,5 @@ +# $Id$ + import safexmlrpc import hmac, sha -- 2.43.0