Source code for PyFoam.Infrastructure.RunHooks.SendToWebservice

"""Call an URL from a webservice"""

import sys

from PyFoam.Infrastructure.RunHook import RunHook
from PyFoam.ThirdParty.six import PY3,iteritems,print_
if PY3:
    import urllib.parse as urllib
else:
    import urllib

import socket
from PyFoam.ThirdParty.six.moves import http_client as httplib

from PyFoam.Error import error
from PyFoam.Basics.TemplateFile import TemplateFile
from PyFoam.ThirdParty.pyratemp import TemplateRenderError

[docs]class SendToWebservice(RunHook): """Sends an URL to a Webservice""" def __init__(self,runner,name): RunHook.__init__(self,runner,name) self.host=self.conf().get("host") self.url=self.conf().get("url",default="") self.method=self.conf().get("method",default="POST") self.useSSL=self.conf().getboolean("useSSL",False) self.parameters={} for name,val in list(self.conf().items()): if name.find("param_")==0: self.parameters[name[len("param_"):]]=val self.headers={} for name,val in list(self.conf().items()): if name.find("header_")==0: self.headers[name[len("header_"):]]=val self.templates=self.conf().get("templates",default="").split() for t in self.templates: if t not in self.parameters: error("Tempalte parameter",t,"not in specified parameters", self.parameters) def __call__(self): if self.useSSL: meth=httplib.HTTPSConnection else: meth=httplib.HTTPConnection conn=meth(self.host) parameters={} for n,val in iteritems(self.parameters): if n in self.templates: template=TemplateFile(content=val, expressionDelimiter="|-", encoding="ascii") try: parameters[n]=str(template.getString(self.runner.getData())) except TemplateRenderError: e = sys.exc_info()[1] # Needed because python 2.5 does not support 'as e' error("Template error",e,"while rendering",val) else: parameters[n]=val encoded=urllib.urlencode(parameters) try: conn.request(self.method, self.url, encoded, self.headers) except socket.error: e = sys.exc_info()[1] # Needed because python 2.5 does not support 'as e' error("Could not connect to",self.host,":",e) result=conn.getresponse() print_("\n",self.name,"Result of request:",result.status,result.reason,result.read())
# Should work with Python3 and Python2