Ejemplo n.º 1
0
 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)
Ejemplo n.º 2
0
 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
Ejemplo n.º 3
0
 def _handle_invalid_response(self, code, content):
     mapping = {401: "6",
                }.get(code, "8")
     raise securetrading.ConnectionError(mapping, http_status_code=code)
Ejemplo n.º 4
0
    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)