def _send_attestation_request()

in cvm-attestation/src/AttestationProvider.py [0:0]


  def _send_attestation_request(self, payload):
    """
    Sends an attestation request to the provider with retries and exponential backoff.
    """
    max_retries = 5
    backoff_factor = 1
    retries = 0

    while retries < max_retries:
      try:
        self.log.info("Sending attestation request to provider...")

        response = requests.post(
          self.endpoint,
          data=json.dumps(payload),
          headers=DEFAULT_HEADERS
        )

        if response.status_code == 200:
          self.log.info("Received token from attestation provider")
          response_json = json.loads(response.text)
          encoded_token = response_json['token']

          return encoded_token
        elif response.status_code == 400:
          self.log.error(
            f"Failed to verify evidence due to invalid collateral, error: {response.text}"
          )
          return None
        elif response.status_code == 429:
          self.log.warning(f"Too many requests, error: {response.text}")
          retries += 1
          if retries < max_retries:
            retry_after = response.headers.get('Retry-After')
            if retry_after:
              sleep_time = int(retry_after)
              self.log.info(f"Retrying in {sleep_time} seconds...")
              time.sleep(sleep_time)
            else:
              sleep_time = backoff_factor * (2 ** (retries - 1))
              self.log.info(f"Retrying in {sleep_time} seconds...")
              time.sleep(sleep_time)
          else:
            raise AttestationProviderException(
              f"Unexpected Error. Status code: {response.status_code}, error: {response.text}"
            )
        else:
          self.log.error(
            f"Failed to verify evidence, status code: {response.status_code}, error: {response.text}"
          )
          retries += 1
          if retries < max_retries:
            sleep_time = backoff_factor * (2 ** (retries - 1))
            self.log.info(f"Retrying in {sleep_time} seconds...")
            time.sleep(sleep_time)
          else:
            raise AttestationProviderException(
              f"Unexpected status code: {response.status_code}, error: {response.text}"
            )

      except RequestException as e:
        self.log.error(f"Request failed with an exception: {e}")
        retries += 1
        if retries < max_retries:
          sleep_time = backoff_factor * (2 ** (retries - 1))
          self.log.info(f"Retrying in {sleep_time} seconds...")
          time.sleep(sleep_time)
        else:
          self.log.error(
            f"Request failed after all retries have been exhausted. Error: {e}"
          )
          raise AttestationProviderException(
            f"Request failed after all retries have been exhausted. Error: {e}"
          )