2 Joshua Dawes - CERN, CMS, The University of Manchester 4 File provides a class that handles pycurl requests. 6 Provides methods for performing/closing the request, as well as getting the request response. 7 Note: user agent string from current version of cmsDbUpload 11 from StringIO
import StringIO
12 from urllib
import urlencode
17 from time
import sleep
21 def __init__(self, url=None, url_data=None, body=None, response_stream=None, timeout=60):
25 self.
_r = pycurl.Curl()
30 self._r.setopt(self._r.CONNECTTIMEOUT, timeout)
31 user_agent =
"User-Agent: ConditionWebServices/1.0 python/%d.%d.%d PycURL/%s" % (sys.version_info[ :3 ] + (pycurl.version_info()[1],))
32 self._r.setopt(self._r.USERAGENT, user_agent)
34 self._r.setopt(self._r.SSL_VERIFYPEER, 0)
35 self._r.setopt(self._r.SSL_VERIFYHOST, 0)
39 if isinstance(body, dict):
40 body = urlencode(body)
41 elif isinstance(body, list):
42 body = json.dumps(body)
44 self._r.setopt(self._r.POSTFIELDS, body)
47 if isinstance(url_data, dict):
48 url_data = urlencode(url_data)
50 exit(
"URL data '%s' for request to URL '%s' was not valid - should be a dictionary." % (
str(url_data), url))
53 self._r.setopt(self._r.URL, url + ((
"?%s" % url_data)
if url_data
else ""))
55 if response_stream
and not isinstance(response_stream, StringIO):
56 response_stream = StringIO()
59 elif not(response_stream):
62 self._r.setopt(self._r.WRITEFUNCTION, self._response.write)
69 while failed
and attempt < max_retries:
74 return self._response.getvalue()
75 except Exception
as e:
80 if isinstance(e, pycurl.error)
and e[0]
in [7, 52]:
82 print(
"Request failed - waiting 3 seconds to retry.")
87 print(
"Unforesoon error occurred when sending data to server.")
89 if attempt == max_retries:
S & print(S &os, JobReport::InputFile const &f)
def __init__(self, url=None, url_data=None, body=None, response_stream=None, timeout=60)