def _handle_exception(self, e): # We may get an IOError if requests does not believe the # certificate file is valid if isinstance(e, (requests.exceptions.RequestException, IOError)): raise securetrading.ConnectionError("7", data=e) else: raise securetrading.ConnectionError("8", data=e)
def _main(self, url, request_data, request_reference, request): info = "{0} Begin transport".format(request_reference) securetrading.util.logger.info(info) connect_start = time.time() try: self._connect(url) except Exception as e: debug = "{0} Connect error: {1}".format(request_reference, e) securetrading.util.logger.debug(debug, exc_info=True) raise securetrading.ConnectionError("7", data=e) conn_time_taken = time.time() - connect_start info = "{0} Connect time {1:.2f}".format(request_reference, conn_time_taken) securetrading.util.logger.info(info) try: recv_start = time.time() try: self._send(url, request_data, request_reference) (status_code, response) = self._receive() response_headers = self._get_response_headers() except (securetrading.SecureTradingError) as e: securetrading.util.logger.debug(e, exc_info=True) raise except Exception as e: debug = "{0} Receiving error".format(request_reference) securetrading.util.logger.debug(debug, exc_info=True) raise securetrading.SendReceiveError("4", data=e) finally: recv_time_taken = time.time() - recv_start info = "{0} Receive time: {1:.2f}".format(request_reference, recv_time_taken) securetrading.util.logger.info(info) try: self._verify_response(status_code, response, response_headers) finally: recv_time_taken = time.time() - recv_start info = "{0} Finished transport: {1:.2f}".format( request_reference, recv_time_taken) securetrading.util.logger.info(info) finally: self._close() return response, response_headers
def _handle_invalid_response(self, code, content): mapping = {401: "6", }.get(code, "8") raise securetrading.ConnectionError(mapping, http_status_code=code)
def _send(self, url, request_data, request_reference): auth = requests.auth.HTTPBasicAuth( self.config.username, self.config.password) method = "POST" headers = self._get_headers(request_reference) final = False start_time = time.time() current_retry_count = 0 while not final: msg = None (timed_out, connect_time_out) = self._get_connection_time_out( start_time) if timed_out: msg = "{0} Maximum time reached whilst trying to connect to \ {1}".format(request_reference, url) elif current_retry_count > self.config.http_max_retries: msg = "{0} Maximum number of attempts reached whilst trying \ to connect to {1}".format(request_reference, url) if msg is not None: raise securetrading.ConnectionError("7", data=[msg]) try: msg = "{0} Connect to {1}".format(request_reference, url) securetrading.util.logger.debug(msg, exc_info=True) # Future - we should be implementing the Retry logic using a # HTTPAdapter: # http://docs.python-requests.org/en/latest/user/advanced/#t # ransport-adapters # as shown below. But currently the Adapters do not support # having both a count and timelimit on the retry logic. When # this is done we can go back and put this in. # import requests.packages.urllib3.util.retry # import requests.packages.urllib3 # retry=requests.packages.urllib3.Retry( # total=10,#self.config.httpMaxRetries, # connect=10,#self.config.httpMaxRetries, # read=0, # backoff_factor=0.001, # ) # s = requests.Session() # a = requests.adapters.HTTPAdapter(max_retries=retry) # s.mount('https://', a) # The list of trusted CA's come from the request library. kwargs = {"method": method, "url": url, "data": request_data, "auth": auth, "headers": headers, "verify": True, "proxies": self.proxies, "timeout": (connect_time_out, self.read_time_out), } if self.config.ssl_certificate_file is not None: kwargs["verify"] = self.config.ssl_certificate_file self.response = requests.request(**kwargs) final = True except (requests.exceptions.ConnectTimeout, requests.exceptions.ConnectionError) as e: msg = "{0} Connection attempt {1} failed due to {2}, \ maximum allowed {3}".format(request_reference, current_retry_count, e, self.config.http_max_retries) securetrading.util.logger.info(msg) current_retry_count += 1 time.sleep(self.config.http_retry_sleep) except Exception as e: final = True self.response = None self._handle_exception(e)