Esempio n. 1
0
    def __send_to_contract__(self,
                             method,
                             encrypted_session_key,
                             encrypted_request,
                             encoding='raw'):
        request_identifier = self.request_identifier
        self.request_identifier += 1
        try:
            url = '{0}/{1}'.format(self.ServiceURL, method)
            request_headers = {
                'x-request-identifier': 'request{0}'.format(request_identifier)
            }
            content_headers = {}
            if encoding == 'base64':
                encrypted_session_key = base64.b64encode(encrypted_session_key)
                encrypted_request = base64.b64encode(encrypted_request)
                content_headers['Content-Transfer-Encoding'] = 'base64'

            request = dict()
            request['encrypted_session_key'] = (None, encrypted_session_key,
                                                'application/octet-stream',
                                                content_headers)
            request['encrypted_request'] = (None, encrypted_request,
                                            'application/octet-stream',
                                            content_headers)

            response = self.session.post(url,
                                         files=request,
                                         headers=request_headers,
                                         timeout=self.default_timeout,
                                         stream=False)
            response.raise_for_status()

            encoding = response.headers.get('Content-Transfer-Encoding', '')
            content = response.content

            if encoding == 'base64':
                return base64.b64decode(content)

            return content

        except requests.Timeout as e:
            logger.warn('[%d] requests timeout (invoke)', request_identifier)
            raise MessageException(str(e)) from e

        except requests.ConnectionError as e:
            logger.warn('[%d] connection error (invoke); %s',
                        request_identifier, e.strerror)
            raise MessageException(str(e)) from e

        except requests.HTTPError as e:
            logger.warn(
                '[%d] network error connecting to service (invoke); %s',
                request_identifier, str(e))
            raise MessageException(str(e)) from e

        except Exception as e:
            logger.warn('[%d] unknown exception (invoke); %s',
                        request_identifier, str(e))
            raise EnclaveException(str(e)) from e
    def get_enclave_public_info(self):
        try:
            url = '{0}/info'.format(self.ServiceURL)
            while True:
                response = self.session.get(url, timeout=self.default_timeout)
                if response.status_code == 429:
                    logger.info('prepare to resubmit the request')
                    sleeptime = min(
                        1.0, float(response.headers.get('retry-after', 1.0)))
                    time.sleep(sleeptime)
                    continue

                response.raise_for_status()
                return response.json()

        except (requests.HTTPError, requests.ConnectionError,
                requests.Timeout) as e:
            logger.warn(
                'network error connecting to service (get_enclave_public_info); %s',
                str(e))
            raise MessageException(str(e)) from e

        except Exception as e:
            logger.warn('unknown exception (get_enclave_public_info); %s',
                        str(e))
            raise EnclaveException(str(e)) from e
    def verify_secrets(self, contract_id, owner_id, secret_list):
        request = dict()
        request['contract_id'] = contract_id
        request['creator_id'] = owner_id
        request['secrets'] = secret_list

        try:
            url = '{0}/verify'.format(self.ServiceURL)
            while True:
                response = self.session.post(url,
                                             json=request,
                                             timeout=self.default_timeout,
                                             stream=False)
                if response.status_code == 429:
                    logger.info('prepare to resubmit the request')
                    sleeptime = min(
                        1.0, float(response.headers.get('retry-after', 1.0)))
                    time.sleep(sleeptime)
                    continue

                response.raise_for_status()
                return response.json()

        except (requests.HTTPError, requests.ConnectionError,
                requests.Timeout) as e:
            logger.warn(
                'network error connecting to service (verify_secrets); %s',
                str(e))
            raise MessageException(str(e)) from e

        except Exception as e:
            logger.warn('unknown exception (verify_secrets); %s', str(e))
            raise EnclaveException(str(e)) from e