1 """Call an URL from a webservice"""
2
3 import sys
4
5 from PyFoam.Infrastructure.RunHook import RunHook
6 from PyFoam.ThirdParty.six import PY3,iteritems,print_
7 if PY3:
8 import urllib.parse as urllib
9 else:
10 import urllib
11
12 import socket
13 from PyFoam.ThirdParty.six.moves import http_client as httplib
14
15 from PyFoam.Error import error
16 from PyFoam.Basics.TemplateFile import TemplateFile
17 from PyFoam.ThirdParty.pyratemp import TemplateRenderError
18
20 """Sends an URL to a Webservice"""
22 RunHook.__init__(self,runner,name)
23
24 self.host=self.conf().get("host")
25 self.url=self.conf().get("url",default="")
26 self.method=self.conf().get("method",default="POST")
27 self.useSSL=self.conf().getboolean("useSSL",False)
28 self.parameters={}
29 for name,val in list(self.conf().items()):
30 if name.find("param_")==0:
31 self.parameters[name[len("param_"):]]=val
32 self.headers={}
33 for name,val in list(self.conf().items()):
34 if name.find("header_")==0:
35 self.headers[name[len("header_"):]]=val
36 self.templates=self.conf().get("templates",default="").split()
37 for t in self.templates:
38 if t not in self.parameters:
39 error("Tempalte parameter",t,"not in specified parameters",
40 self.parameters)
41
43 if self.useSSL:
44 meth=httplib.HTTPSConnection
45 else:
46 meth=httplib.HTTPConnection
47
48 conn=meth(self.host)
49
50 parameters={}
51 for n,val in iteritems(self.parameters):
52 if n in self.templates:
53 template=TemplateFile(content=val,
54 expressionDelimiter="|-",
55 encoding="ascii")
56 try:
57 parameters[n]=str(template.getString(self.runner.getData()))
58 except TemplateRenderError:
59 e = sys.exc_info()[1]
60 error("Template error",e,"while rendering",val)
61 else:
62 parameters[n]=val
63 encoded=urllib.urlencode(parameters)
64 try:
65 conn.request(self.method,
66 self.url,
67 encoded,
68 self.headers)
69 except socket.error:
70 e = sys.exc_info()[1]
71 error("Could not connect to",self.host,":",e)
72
73 result=conn.getresponse()
74 print_("\n",self.name,"Result of request:",result.status,result.reason,result.read())
75
76
77