in benchmarking/utils/utilities.py [0:0]
def requestsData(url, **kwargs):
delay = 0
total_delay = 0
timeout = -1
if "timeout" in kwargs:
timeout = kwargs["timeout"]
retry = kwargs.pop("retry", True)
result = None
while True:
try:
"""
When we use multiprocessing to call harness from internal,
requests.Post(url, **kwargs) will get stuck and neither proceeding
ahead nor throwing an error. Instead, we use Session and set
trust_env to False to solve the problem.
Reference: https://stackoverflow.com/a/39822223
"""
with requests.Session() as session:
session.trust_env = False
# This session object can be reused.
# If the CA_CERT file has changed it will not be updated implicitly.
session.verify = ca_cert()
result = session.post(url, **kwargs)
if result.status_code != 200:
getLogger().error(
"Post request failed, receiving code {}".format(result.status_code)
)
else:
if delay > 0:
getLogger().info("Post request successful")
return result
except requests.exceptions.SSLError:
getLogger().exception("Post SSL verification failed")
except requests.ConnectionError:
getLogger().exception("Post Connection failed")
except requests.exceptions.ReadTimeout:
getLogger().exception("Post Readtimeout")
except requests.exceptions.ChunkedEncodingError:
getLogger().exception("Post ChunkedEncodingError")
if not retry:
break
delay = delay + 1 if delay <= 5 else delay
sleep_time = 1 << delay
getLogger().info("wait {} seconds. Retrying...".format(sleep_time))
sleep(sleep_time)
total_delay += sleep_time
if timeout > 0 and total_delay > timeout:
break
getLogger().error(
"Failed to post to {}, retrying after {} seconds...".format(url, total_delay)
)
return result