Example #1
0
    async def _create_credential_async(self, url=None):
        tea_request = TeaRequest()
        tea_request.headers[
            'host'] = url if url else self.__metadata_service_host
        if not url:
            tea_request.pathname = self.__url_in_ecs_metadata + self.role_name

        # request
        response = await TeaCore.async_do_action(tea_request)

        if response.status_code != 200:
            raise CredentialException(self.__ecs_metadata_fetch_error_msg +
                                      " HttpCode=" + str(response.status_code))

        dic = json.loads(response.body.decode('utf-8'))
        content_code = dic.get('Code')
        content_access_key_id = dic.get('AccessKeyId')
        content_access_key_secret = dic.get('AccessKeySecret')
        content_security_token = dic.get('SecurityToken')
        content_expiration = dic.get('Expiration')

        if content_code != "Success":
            raise CredentialException(self.__ecs_metadata_fetch_error_msg)

        # 先转换为时间数组
        time_array = time.strptime(content_expiration, "%Y-%m-%dT%H:%M:%SZ")
        # 转换为时间戳
        time_stamp = calendar.timegm(time_array)
        return credentials.EcsRamRoleCredential(content_access_key_id,
                                                content_access_key_secret,
                                                content_security_token,
                                                time_stamp, self)
Example #2
0
    def test_do_action(self):
        request = TeaRequest()
        request.headers['host'] = "www.alibabacloud.com"
        request.pathname = "/s/zh"
        request.query["k"] = "ecs"
        option = {
            "readTimeout": 20000,
            "connectTimeout": 10000,
            "httpProxy": None,
            "httpsProxy": None,
            "noProxy": None,
            "maxIdleConns": None,
            "retry": {
                "retryable": None,
                "maxAttempts": None
            },
            "backoff": {
                "policy": None,
                "period": None
            },
            'debug': 'sdk',
            "ignoreSSL": None
        }
        resp = TeaCore.do_action(request, option)
        self.assertTrue(resp.headers.get('server'))
        self.assertIsNotNone(bytes.decode(resp.body))

        option['httpProxy'] = '127.0.0.1'
        option['httpsProxy'] = '127.0.0.1'
        option['noProxy'] = '127.0.0.1'
        try:
            TeaCore.do_action(request, option)
            assert False
        except Exception as e:
            self.assertIsInstance(e, RetryError)
Example #3
0
 def test_get_signature(self):
     request = TeaRequest()
     request.pathname = '/test/a/b'
     request.query = {
         'key': 'test'
     }
     request.headers = {
         'content-md5': '098f6bcd4621d373cade4e832627b4f6'
     }
     result = OpensearchUtil.get_signature(request, 'AccessKeyId', 'AccessKeySecret')
     self.assertEqual('OPENSEARCH AccessKeyId:Puo3jkoIu0S1F8x3jHDxSpNhnQU=', result)
Example #4
0
 async def _get_role_name_async(self, url=None):
     tea_request = TeaRequest()
     tea_request.headers[
         'host'] = url if url else self.__metadata_service_host
     if not url:
         tea_request.pathname = self.__url_in_ecs_metadata
     response = await TeaCore.async_do_action(tea_request)
     if response.status_code != 200:
         raise CredentialException(self.__ecs_metadata_fetch_error_msg +
                                   " HttpCode=" + str(response.status_code))
     self.role_name = response.body.decode('utf-8')
Example #5
0
    def test_init(self):
        request = TeaRequest()
        self.assertEqual({}, request.query)
        self.assertEqual({}, request.headers)
        self.assertEqual('http', request.protocol)
        self.assertEqual(80, request.port)
        self.assertEqual('GET', request.method)
        self.assertEqual("", request.pathname)
        self.assertEqual(None, request.body)

        request.query = None
        self.assertEqual({}, request.query)
Example #6
0
    def test_get_signature_v2(self):
        request = TeaRequest()
        signature = Client.get_signature(request, "bucket", "accessKeyId",
                                         "accessKeySecret", "v2", None)
        self.assertEqual(
            "OSS2 AccessKeyId:accessKeyId,Signature:61mT0P8eZxBI5cfj7YfqctSz4Zwtp0sltgTS5JZZc1M=",
            signature)

        request = TeaRequest()
        request.pathname = 'test?aa'
        request.headers = {
            'x-oss-test': 'test',
            'content-type': 'type',
            'content-md5': 'md5',
        }
        request.query = {
            'testQuery': 'testQuery',
            'queryKey': 'queryValue',
            "x-oss-test": "test"
        }
        res = Client.get_signature(request, 'test', 'ak', 'sk', 'v2',
                                   ['headers', 'sign2'])
        self.assertEqual(
            'OSS2 AccessKeyId:ak,AdditionalHeaders:headers;'
            'sign2,Signature:l8RDYSFtqTP0NhyoTyrRqAtrnUO6lCjrOF/MK2zV0nU=',
            res)

        request.pathname = 'test?zz'
        res = Client.get_signature(request, 'test', 'ak', 'sk', 'v2',
                                   ['headers'])
        self.assertEqual(
            'OSS2 AccessKeyId:ak,AdditionalHeaders:headers,Signature:kbg4BGoZbDGm2OBRt1kOTh9z6dToFSg1L55PXTmGdQw=',
            res)
Example #7
0
    def test_get_authorization(self):
        # request method is 'GET'
        request = TeaRequest()
        request.query = {'test': 'ok', 'empty': ''}
        request.headers = {'x-acs-test': 'http', 'x-acs-TEST': 'https'}

        res = Client.get_authorization(
            request, 'ACS3-HMAC-SHA256',
            '55e12e91650d2fec56ec74e1d3e4ddbfce2ef3a65890c2a19ecf88a307e76a23',
            'acesskey', 'secret')
        self.assertEqual(
            'ACS3-HMAC-SHA256 Credential=acesskey,SignedHea'
            'ders=x-acs-test,Signature=d16b30a7699ae9e43875b13195b2f81bcc3ed10c14a9b5eb780e51619aa50be1',
            res)
Example #8
0
    def test_get_authorization(self):
        # request method is 'GET'
        request = TeaRequest()
        request.query = {'test': 'ok', 'empty': ''}
        request.headers = {'x-acs-test': 'http', 'x-acs-TEST': 'https'}

        res = Client.get_authorization(
            request, 'ACS3-HMAC-SHA256',
            '55e12e91650d2fec56ec74e1d3e4ddbfce2ef3a65890c2a19ecf88a307e76a23',
            'acesskey', 'secret')
        self.assertEqual(
            'ACS3-HMAC-SHA256 Credential=acesskey,SignedHea'
            'ders=x-acs-test,Signature=910e59dd385879346de704a06c96613f8157aa7124e6d1c4f2bdffa1e5588187',
            res)
Example #9
0
 def test_get_signature_v1(self):
     request = TeaRequest()
     request.headers = {
         'x-oss-test': 'test',
         'content-type': 'type',
         'content-md5': 'md5'
     }
     request.query = {
         'testQuery': 'testQuery',
         'queryKey': 'queryValue',
         'x-oss-process': 'value',
         'location': 'test'
     }
     res = Client.get_signature(request, 'test', "ak", "sk", "v1", None)
     self.assertEqual('OSS ak:EutyeRVaRDNJSPiaBHmN/Cip8lw=', res)
     res = Client.get_signature(request, 'test', "ak", "sk", None, None)
     self.assertEqual('OSS ak:EutyeRVaRDNJSPiaBHmN/Cip8lw=', res)
Example #10
0
    def test_get_signature(self):
        request = TeaRequest()
        request.pathname = "/test"
        request.method = "GET"
        signedStr = Client.get_signature("accessKeyId", "accessKeySecret",
                                         request, "/version")
        self.assertEqual(
            "FC accessKeyId:tvvm2KiUDmXlQiuwz21CtN59JcKTT5QzIcrc122DKVo=",
            signedStr)

        header = {}
        header["x-fc-test"] = "test"
        request.headers = header
        signedStr = Client.get_signature("accessKeyId", "accessKeySecret",
                                         request, "/version")
        self.assertEqual(
            "FC accessKeyId:lP6dXPCXlQNI7VY+f0brnZ4bwluNvGqcwdDf5GoM9ag=",
            signedStr)

        query = {}
        query["testQuery"] = "test"
        request.query = query
        request.pathname = "/version/proxy/"
        signedStr = Client.get_signature("accessKeyId", "accessKeySecret",
                                         request, "/version")
        self.assertEqual(
            "FC accessKeyId:aCD88kzuMQYKQGo7kq7DeqhT72nVrNSEqAJtiHNj9L0=",
            signedStr)
 def test_unretryable_exception(self):
     request = TeaRequest()
     ex = Exception()
     ex.message = "test exception"
     try:
         raise UnretryableException(request, ex)
     except UnretryableException as e:
         self.assertIsNotNone(e)
         self.assertIsNotNone(e.last_request)
         self.assertEqual("Retry failed:test exception", e.message)
Example #12
0
    def _create_credential(self, turl=None):
        tea_request = TeaRequest()
        tea_request.query = {
            'Action': 'GenerateSessionAccessKey',
            'Format': 'JSON',
            'Version': '2015-04-01',
            'DurationSeconds': str(self.duration_seconds),
            'AccessKeyId': self.access_key_id,
            'RegionId': self.region_id,
        }

        str_to_sign = ph.compose_string_to_sign('GET', tea_request.query)
        signature = ph.sign_string(str_to_sign, self.access_key_id + '&')
        tea_request.query['Signature'] = signature
        tea_request.protocol = 'https'
        tea_request.headers['host'] = turl if turl else 'sts.aliyuncs.com'
        # request
        response = TeaCore.do_action(tea_request)
        if response.status_code == 200:
            dic = json.loads(response.body.decode('utf-8'))
            if "SessionAccessKey" in dic:
                cre = dic.get("SessionAccessKey")
                time_array = time.strptime(cre.get("Expiration"),
                                           "%Y-%m-%dT%H:%M:%SZ")
                expiration = calendar.timegm(time_array)
                return credentials.RsaKeyPairCredential(
                    cre.get("SessionAccessKeyId"),
                    cre.get("SessionAccessKeySecret"), expiration, self)
        raise CredentialException(response.body.decode('utf-8'))
Example #13
0
 def __refresh_access_token(self):
     tea_request = TeaRequest()
     tea_request.method = "POST"
     tea_request.pathname = "/v2/oauth/token"
     headers = {
         "host": self.__get_host(self.__endpoint, self.__domain_id + ".api.alicloudccp.com"),
         "content-type": "application/x-www-form-urlencoded; charset=utf-8",
         "date": datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT'),
         "accept": "application/json",
         "x-acs-signature-method": "HMAC-SHA1",
         "x-acs-signature-version": "1.0"
     }
     tea_request.headers = headers
     body_str = "grant_type=refresh_token&refresh_token={0}&client_id={1}&client_secret={2}".format(
         self.__refresh_token, self.__client_id, self.__client_secret)
     tea_request.body = bytes(body_str, encoding="utf-8")
     response = TeaCore.do_action(tea_request)
     dic = json.loads(str(response.body, encoding="utf-8"))
     if 400 <= response.status_code < 600:
         raise TeaException({
                     "code": str(dic.get('code')) + "Error",
                     "message": "code: " + str(response.status_code) + ", " + str(dic.get('message')) +
                                " requestid: " + str(dic.get('requestId')),
                     "data": dic
                 })
     else:
         self.__expire_time = dic.get("expire_time")
         self.__access_token = dic.get("access_token")
         self.__refresh_token = dic.get("refresh_token")
Example #14
0
 def refresh_access_token(self):
     tea_request = TeaRequest()
     tea_request.method = "POST"
     tea_request.pathname = "/v2/oauth/token"
     headers = {
         "host":
         self._endpoint if self._endpoint else self._domain_id +
         ".api.aliyunpds.com",
         "content-type":
         "application/x-www-form-urlencoded; charset=utf-8",
         "date":
         datetime.datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT'),
         "accept":
         "application/json",
         "x-acs-signature-method":
         "HMAC-SHA1",
         "x-acs-signature-version":
         "1.0"
     }
     tea_request.headers = headers
     body_str = "grant_type=refresh_token&refresh_token={0}&client_id={1}&client_secret={2}".format(
         self._refresh_token, self._client_id, self._client_secret)
     tea_request.body = bytes(body_str, encoding="utf-8")
     response = TeaCore.do_action(tea_request)
     dic = json.loads(str(response.body, encoding="utf-8"))
     if response.status_code == 200:
         self._expire_time = dic.get("expire_time")
         self._access_token = dic.get("access_token")
         self._refresh_token = dic.get("refresh_token")
     else:
         raise TeaException(dic)
Example #15
0
 def test_do_action(self):
     request = TeaRequest()
     request.headers['host'] = "www.alibabacloud.com"
     request.pathname = "/s/zh"
     request.query["k"] = "ecs"
     option = {
         "readTimeout": 0,
         "connectTimeout": 0,
         "httpProxy": None,
         "httpsProxy": None,
         "noProxy": None,
         "maxIdleConns": None,
         "retry": {
             "retryable": None,
             "maxAttempts": None
         },
         "backoff": {
             "policy": None,
             "period": None
         },
         "ignoreSSL": None
     }
     resp = TeaCore.do_action(request, option)
     self.assertIsNotNone(bytes.decode(resp.body))
Example #16
0
 def test_async_stream_upload(self):
     request = TeaRequest()
     request.method = 'POST'
     request.protocol = 'http'
     request.headers['host'] = "127.0.0.1:8888"
     loop = asyncio.get_event_loop()
     task = asyncio.ensure_future(TeaCore.async_do_action(request))
     f = TeaStream()
     request.body = f
     loop.run_until_complete(task)
     self.assertEqual(b'{"result": "tea test"}', task.result().body)
Example #17
0
    def test_unretryable_exception(self):
        request = TeaRequest()
        ex = RetryError("test exception")
        try:
            raise UnretryableException(request, ex)
        except UnretryableException as e:
            self.assertIsNotNone(e)
            self.assertIsNotNone(e.last_request)
            self.assertEqual("test exception", str(e.inner_exception))

        e = TeaException({
            'code': 'error code',
            'message': 'error message',
            'data': 'data',
        })
        try:
            raise UnretryableException(request, e)
        except UnretryableException as e:
            self.assertEqual('Error: error code error message Response: data', str(e))
            self.assertEqual('error code', e.inner_exception.code)
            self.assertEqual('error message', e.inner_exception.message)
            self.assertEqual('data', e.inner_exception.data)
Example #18
0
    def test_async_do_action(self):
        request = TeaRequest()
        request.headers['host'] = "www.alibabacloud.com"
        request.protocol = 'https'
        request.pathname = "/s/zh"
        request.query["k"] = "ecs"
        option = {
            "readTimeout": 20000,
            "connectTimeout": 10000,
            "httpProxy": None,
            "httpsProxy": None,
            "noProxy": None,
            "maxIdleConns": None,
            "retry": {
                "retryable": None,
                "maxAttempts": None
            },
            "backoff": {
                "policy": None,
                "period": None
            },
            "ignoreSSL": None
        }
        loop = asyncio.get_event_loop()
        task = asyncio.ensure_future(TeaCore.async_do_action(request, option))
        loop.run_until_complete(task)
        response = task.result()
        self.assertTrue(response.headers.get('server'))
        self.assertIsNotNone(bytes.decode(response.body))

        request.protocol = 'http'
        option['httpProxy'] = 'http://127.0.0.1'
        try:
            loop.run_until_complete(TeaCore.async_do_action(request, option))
            assert False
        except Exception as e:
            self.assertIsInstance(e, RetryError)
Example #19
0
 async def _create_credentials_async(self, turl=None):
     # 获取credential 先实现签名用工具类
     tea_request = TeaRequest()
     tea_request.query = {
         'Action': 'AssumeRole',
         'Format': 'JSON',
         'Version': '2015-04-01',
         'DurationSeconds': str(self.duration_seconds),
         'RoleArn': self.role_arn,
         'AccessKeyId': self.access_key_id,
         'RegionId': self.region_id,
         'RoleSessionName': self.role_session_name
     }
     if self.policy is not None:
         tea_request.query["Policy"] = self.policy
     string_to_sign = ph.compose_string_to_sign("GET", tea_request.query)
     signature = ph.sign_string(string_to_sign,
                                self.access_key_secret + "&")
     tea_request.query["Signature"] = signature
     tea_request.protocol = 'https'
     tea_request.headers['host'] = turl if turl else 'sts.aliyuncs.com'
     # request
     response = await TeaCore.async_do_action(tea_request)
     if response.status_code == 200:
         dic = json.loads(response.body.decode('utf-8'))
         if "Credentials" in dic:
             cre = dic.get("Credentials")
             # 先转换为时间数组
             time_array = time.strptime(cre.get("Expiration"),
                                        "%Y-%m-%dT%H:%M:%SZ")
             # 转换为时间戳
             expiration = calendar.timegm(time_array)
             return credentials.RamRoleArnCredential(
                 cre.get("AccessKeyId"), cre.get("AccessKeySecret"),
                 cre.get("SecurityToken"), expiration, self)
     raise CredentialException(response.body.decode('utf-8'))
Example #20
0
    def execute(self, params, request, runtime):
        """
        Encapsulate the request and invoke the network

        @param action: api name

        @param version: product version

        @param protocol: http or https

        @param method: e.g. GET

        @param auth_type: authorization type e.g. AK

        @param body_type: response body type e.g. String

        @param request: object of OpenApiRequest

        @param runtime: which controls some details of call api, such as retry times

        @rtype: dict
        @return: the response
        """
        params.validate()
        request.validate()
        runtime.validate()
        _runtime = {
            'timeouted': 'retry',
            'readTimeout': UtilClient.default_number(runtime.read_timeout, self._read_timeout),
            'connectTimeout': UtilClient.default_number(runtime.connect_timeout, self._connect_timeout),
            'httpProxy': UtilClient.default_string(runtime.http_proxy, self._http_proxy),
            'httpsProxy': UtilClient.default_string(runtime.https_proxy, self._https_proxy),
            'noProxy': UtilClient.default_string(runtime.no_proxy, self._no_proxy),
            'socks5Proxy': UtilClient.default_string(runtime.socks_5proxy, self._socks_5proxy),
            'socks5NetWork': UtilClient.default_string(runtime.socks_5net_work, self._socks_5net_work),
            'maxIdleConns': UtilClient.default_number(runtime.max_idle_conns, self._max_idle_conns),
            'retry': {
                'retryable': runtime.autoretry,
                'maxAttempts': UtilClient.default_number(runtime.max_attempts, 3)
            },
            'backoff': {
                'policy': UtilClient.default_string(runtime.backoff_policy, 'no'),
                'period': UtilClient.default_number(runtime.backoff_period, 1)
            },
            'ignoreSSL': runtime.ignore_ssl
        }
        _last_request = None
        _last_exception = None
        _now = time.time()
        _retry_times = 0
        while TeaCore.allow_retry(_runtime.get('retry'), _retry_times, _now):
            if _retry_times > 0:
                _backoff_time = TeaCore.get_backoff_time(_runtime.get('backoff'), _retry_times)
                if _backoff_time > 0:
                    TeaCore.sleep(_backoff_time)
            _retry_times = _retry_times + 1
            try:
                _request = TeaRequest()
                # spi = new Gateway();//Gateway implements SPI,这一步在产品 SDK 中实例化
                headers = self.get_rpc_headers()
                request_context = spi_models.InterceptorContextRequest(
                    headers=TeaCore.merge(request.headers,
                        headers),
                    query=request.query,
                    body=request.body,
                    stream=request.stream,
                    host_map=request.host_map,
                    pathname=params.pathname,
                    product_id=self._product_id,
                    action=params.action,
                    version=params.version,
                    protocol=UtilClient.default_string(self._protocol, params.protocol),
                    method=UtilClient.default_string(self._method, params.method),
                    auth_type=params.auth_type,
                    body_type=params.body_type,
                    req_body_type=params.req_body_type,
                    style=params.style,
                    credential=self._credential,
                    signature_version=self._signature_version,
                    signature_algorithm=self._signature_algorithm,
                    user_agent=self.get_user_agent()
                )
                configuration_context = spi_models.InterceptorContextConfiguration(
                    region_id=self._region_id,
                    endpoint=UtilClient.default_string(request.endpoint_override, self._endpoint),
                    endpoint_rule=self._endpoint_rule,
                    endpoint_map=self._endpoint_map,
                    endpoint_type=self._endpoint_type,
                    network=self._network,
                    suffix=self._suffix
                )
                interceptor_context = spi_models.InterceptorContext(
                    request=request_context,
                    configuration=configuration_context
                )
                attribute_map = spi_models.AttributeMap()
                # 1. spi.modifyConfiguration(context: SPI.InterceptorContext, attributeMap: SPI.AttributeMap);
                self._spi.modify_configuration(interceptor_context, attribute_map)
                # 2. spi.modifyRequest(context: SPI.InterceptorContext, attributeMap: SPI.AttributeMap);
                self._spi.modify_request(interceptor_context, attribute_map)
                _request.protocol = interceptor_context.request.protocol
                _request.method = interceptor_context.request.method
                _request.pathname = interceptor_context.request.pathname
                _request.query = interceptor_context.request.query
                _request.body = interceptor_context.request.stream
                _request.headers = interceptor_context.request.headers
                _last_request = _request
                _response = TeaCore.do_action(_request, _runtime)
                response_context = spi_models.InterceptorContextResponse(
                    status_code=_response.status_code,
                    headers=_response.headers,
                    body=_response.body
                )
                interceptor_context.response = response_context
                # 3. spi.modifyResponse(context: SPI.InterceptorContext, attributeMap: SPI.AttributeMap);
                self._spi.modify_response(interceptor_context, attribute_map)
                return {
                    'headers': interceptor_context.response.headers,
                    'statusCode': interceptor_context.response.status_code,
                    'body': interceptor_context.response.deserialized_body
                }
            except Exception as e:
                if TeaCore.is_retryable(e):
                    _last_exception = e
                    continue
                raise e
        raise UnretryableException(_last_request, _last_exception)
Example #21
0
 def test_get_roa_signature(self):
     request = TeaRequest()
     str_to_sign = Client.get_string_to_sign(request)
     signature = Client.get_roasignature(str_to_sign, 'secret')
     self.assertEqual('GET\n\n\n\n\n', str_to_sign)
     self.assertEqual('XGXDWA78AEvx/wmfxKoVCq/afWw=', signature)
Example #22
0
    def test_get_string_to_sign(self):
        request = TeaRequest()
        str_to_sign = Client.get_string_to_sign(request)
        self.assertEqual('GET\n\n\n\n\n', str_to_sign)

        request = TeaRequest()
        request.method = "POST"
        request.query = {'test': 'tests'}
        str_to_sign = Client.get_string_to_sign(request)
        self.assertEqual('POST\n\n\n\n\n?test=tests', str_to_sign)

        request = TeaRequest()
        request.headers = {
            'content-md5': 'md5',
        }
        str_to_sign = Client.get_string_to_sign(request)
        self.assertEqual('GET\n\nmd5\n\n\n', str_to_sign)

        request = TeaRequest()
        request.pathname = "Pathname"
        request.query = {
            'ccp': 'ok',
            'test': 'tests',
            'test1': '',
            'test2': '中文'
        }
        request.headers = {
            'x-acs-meta': 'user',
            "accept": "application/json",
            'content-md5': 'md5',
            'content-type': 'application/json',
            'date': 'date'
        }
        str_to_sign = Client.get_string_to_sign(request)
        s = u'GET\napplication/json\nmd5\napplication/json\ndate\nx-acs-meta:user\nPathname?ccp=ok&test=tests&test1&test2=中文'
        self.assertEqual(s, str_to_sign)
Example #23
0
 def do_request(
     self,
     version: str,
     action: str,
     protocol: str,
     method: str,
     pathname: str,
     request: dict,
     headers: Dict[str, str],
     runtime: util_models.RuntimeOptions,
 ) -> dict:
     """
     Encapsulate the request and invoke the network
     @param action: api name
     @param protocol: http or https
     @param method: e.g. GET
     @param pathname: pathname of every api
     @param request: which contains request params
     @param runtime: which controls some details of call api, such as retry times
     @return: the response
     """
     runtime.validate()
     _runtime = {
         'timeouted':
         'retry',
         'readTimeout':
         UtilClient.default_number(runtime.read_timeout,
                                   self._read_timeout),
         'connectTimeout':
         UtilClient.default_number(runtime.connect_timeout,
                                   self._connect_timeout),
         'httpProxy':
         UtilClient.default_string(runtime.http_proxy, self._http_proxy),
         'httpsProxy':
         UtilClient.default_string(runtime.https_proxy, self._https_proxy),
         'noProxy':
         UtilClient.default_string(runtime.no_proxy, self._no_proxy),
         'maxIdleConns':
         UtilClient.default_number(runtime.max_idle_conns,
                                   self._max_idle_conns),
         'maxIdleTimeMillis':
         self._max_idle_time_millis,
         'keepAliveDurationMillis':
         self._keep_alive_duration_millis,
         'maxRequests':
         self._max_requests,
         'maxRequestsPerHost':
         self._max_requests_per_host,
         'retry': {
             'retryable': runtime.autoretry,
             'maxAttempts':
             UtilClient.default_number(runtime.max_attempts, 3)
         },
         'backoff': {
             'policy': UtilClient.default_string(runtime.backoff_policy,
                                                 'no'),
             'period': UtilClient.default_number(runtime.backoff_period, 1)
         },
         'ignoreSSL':
         runtime.ignore_ssl
     }
     _last_request = None
     _last_exception = None
     _now = time.time()
     _retry_times = 0
     while TeaCore.allow_retry(_runtime.get('retry'), _retry_times, _now):
         if _retry_times > 0:
             _backoff_time = TeaCore.get_backoff_time(
                 _runtime.get('backoff'), _retry_times)
             if _backoff_time > 0:
                 TeaCore.sleep(_backoff_time)
         _retry_times = _retry_times + 1
         try:
             _request = TeaRequest()
             _request.protocol = UtilClient.default_string(
                 self._protocol, protocol)
             _request.method = method
             _request.pathname = pathname
             _request.query = {
                 'method': action,
                 'version': version,
                 'sign_type': 'HmacSHA1',
                 'req_time': AntchainUtils.get_timestamp(),
                 'req_msg_id': AntchainUtils.get_nonce(),
                 'access_key': self._access_key_id,
                 'base_sdk_version': 'TeaSDK-2.0',
                 'sdk_version': '1.1.8'
             }
             if not UtilClient.empty(self._security_token):
                 _request.query['security_token'] = self._security_token
             _request.headers = TeaCore.merge(
                 {
                     'host':
                     UtilClient.default_string(
                         self._endpoint, 'openapi.antchain.antgroup.com'),
                     'user-agent':
                     UtilClient.get_user_agent(self._user_agent)
                 }, headers)
             tmp = UtilClient.anyify_map_value(RPCUtilClient.query(request))
             _request.body = UtilClient.to_form_string(tmp)
             _request.headers[
                 'content-type'] = 'application/x-www-form-urlencoded'
             signed_param = TeaCore.merge(_request.query,
                                          RPCUtilClient.query(request))
             _request.query['sign'] = AntchainUtils.get_signature(
                 signed_param, self._access_key_secret)
             _last_request = _request
             _response = TeaCore.do_action(_request, _runtime)
             raw = UtilClient.read_as_string(_response.body)
             obj = UtilClient.parse_json(raw)
             res = UtilClient.assert_as_map(obj)
             resp = UtilClient.assert_as_map(res.get('response'))
             if AntchainUtils.has_error(raw, self._access_key_secret):
                 raise TeaException({
                     'message': resp.get('result_msg'),
                     'data': resp,
                     'code': resp.get('result_code')
                 })
             return resp
         except Exception as e:
             if TeaCore.is_retryable(e):
                 _last_exception = e
                 continue
             raise e
     raise UnretryableException(_last_request, _last_exception)
Example #24
0
    def do_request(self, version, action, protocol, method, pathname, request, runtime):
        """
        Encapsulate the request and invoke the network

        :type action: str
        :param action: api name

        :type protocol: str
        :param protocol: http or https

        :type method: str
        :param method: e.g. GET

        :type pathname: str
        :param pathname: pathname of every api

        :type request: dict
        :param request: which contains request params

        :param runtime: which controls some details of call api, such as retry times

        :return: the response
        """
        runtime.validate()
        _runtime = {
            "timeouted": "retry",
            "readTimeout": UtilClient.default_number(runtime.read_timeout, self._read_timeout),
            "connectTimeout": UtilClient.default_number(runtime.connect_timeout, self._connect_timeout),
            "httpProxy": UtilClient.default_string(runtime.http_proxy, self._http_proxy),
            "httpsProxy": UtilClient.default_string(runtime.https_proxy, self._https_proxy),
            "noProxy": UtilClient.default_string(runtime.no_proxy, self._no_proxy),
            "maxIdleConns": UtilClient.default_number(runtime.max_idle_conns, self._max_idle_conns),
            "retry": {
                "retryable": runtime.autoretry,
                "maxAttempts": UtilClient.default_number(runtime.max_attempts, 3)
            },
            "backoff": {
                "policy": UtilClient.default_string(runtime.backoff_policy, "no"),
                "period": UtilClient.default_number(runtime.backoff_period, 1)
            },
            "ignoreSSL": runtime.ignore_ssl
        }
        _last_request = None
        _last_exception = None
        _now = time.time()
        _retry_times = 0
        while TeaCore.allow_retry(_runtime.get('retry'), _retry_times, _now):
            if _retry_times > 0:
                _backoff_time = TeaCore.get_backoff_time(_runtime.get('backoff'), _retry_times)
                if _backoff_time > 0:
                    TeaCore.sleep(_backoff_time)
            _retry_times = _retry_times + 1
            try:
                _request = TeaRequest()
                _request.protocol = UtilClient.default_string(self._protocol, protocol)
                _request.method = method
                _request.pathname = pathname
                _request.query = {
                    "method": action,
                    "version": version,
                    "sign_type": "HmacSHA1",
                    "req_time": AlipayUtilClient.get_timestamp(),
                    "req_msg_id": UtilClient.get_nonce(),
                    "access_key": self._access_key_id,
                    "charset": "UTF-8",
                    "baseSdkVersion": "Tea-SDK",
                    "sdkVersion": "Tea-SDK-20200804"
                }
                if not UtilClient.empty(self._security_token):
                    _request.query["security_token"] = self._security_token
                _request.headers = {
                    "host": self._endpoint,
                    "user-agent": self.get_user_agent()
                }
                tmp = UtilClient.anyify_map_value(RPCUtilClient.query(request))
                _request.body = UtilClient.to_form_string(tmp)
                _request.headers["content-type"] = "application/x-www-form-urlencoded"
                signed_param = TeaCore.merge(_request.query,
                    RPCUtilClient.query(request))
                _request.query["sign"] = AlipayUtilClient.get_signature(signed_param, self._access_key_secret)
                _last_request = _request
                _response = TeaCore.do_action(_request, _runtime)
                obj = UtilClient.read_as_json(_response.body)
                res = UtilClient.assert_as_map(obj)
                resp = UtilClient.assert_as_map(res.get('response'))
                if AlipayUtilClient.has_error(res):
                    raise TeaException({
                        "message": resp.get('result_msg'),
                        "data": resp,
                        "code": resp.get('result_code')
                    })
                return resp
            except Exception as e:
                if TeaCore.is_retryable(e):
                    _last_exception = e
                    continue
                raise e
        raise UnretryableException(_last_request, _last_exception)
    def test_get_signature(self):
        request = TeaRequest()
        request.method = 'test'
        request.headers['accept'] = 'json'
        request.headers['date'] = 'now'
        request.pathname = 'test'
        self.assertEqual('lzttujz/sOhS2QSBBSZBq58ZNSxvSDdkWWlknQxnrt0=',
                         Client.get_signature(request, 'sk'))
        request.headers['content-md5'] = 'md5'
        request.headers['content-type'] = 'type'
        self.assertEqual('HcjhFWjGB9Xyitos6CHnJvwQoPQzdPUBgv5oUd0tdoA=',
                         Client.get_signature(request, 'sk'))

        request = TeaRequest()
        request.headers['testKey'] = 'value'
        request.headers['testNull'] = None

        self.assertEqual('6iwWMKFM5HOmBuRm8Xb4i/bv3Zrd8eP0qSoO3iZiSG4=',
                         Client.get_signature(request, 'sk'))

        request = TeaRequest()
        request.pathname = 'test'
        request.query['testKey'] = 'value'
        self.assertEqual('A9g2VbnkB+GS+nyiKTIqSruJvxrgZ9rgot6wVPFbewk=',
                         Client.get_signature(request, 'sk'))
Example #26
0
 def test_get_signature(self):
     request = TeaRequest()
     str_to_sign = Client.get_string_to_sign(request)
     signature = Client.get_signature(str_to_sign, 'secret')
     self.assertEqual('GET\n\n\n\n', str_to_sign)
     self.assertEqual('Mzu+31oD5IDdv3WFBNIi4Y7JZto=', signature)
Example #27
0
    def do_rpcrequest(self, action, version, protocol, method, auth_type, body_type, request, runtime):
        """
        Encapsulate the request and invoke the network

        @type action: str
        @param action: api name

        @type version: str
        @param version: product version

        @type protocol: str
        @param protocol: http or https

        @type method: str
        @param method: e.g. GET

        @type auth_type: str
        @param auth_type: authorization type e.g. AK

        @type body_type: str
        @param body_type: response body type e.g. String

        @param request: object of OpenApiRequest

        @param runtime: which controls some details of call api, such as retry times

        @rtype: dict
        @return: the response
        """
        request.validate()
        runtime.validate()
        _runtime = {
            'timeouted': 'retry',
            'readTimeout': UtilClient.default_number(runtime.read_timeout, self._read_timeout),
            'connectTimeout': UtilClient.default_number(runtime.connect_timeout, self._connect_timeout),
            'httpProxy': UtilClient.default_string(runtime.http_proxy, self._http_proxy),
            'httpsProxy': UtilClient.default_string(runtime.https_proxy, self._https_proxy),
            'noProxy': UtilClient.default_string(runtime.no_proxy, self._no_proxy),
            'socks5Proxy': UtilClient.default_string(runtime.socks_5proxy, self._socks_5proxy),
            'socks5NetWork': UtilClient.default_string(runtime.socks_5net_work, self._socks_5net_work),
            'maxIdleConns': UtilClient.default_number(runtime.max_idle_conns, self._max_idle_conns),
            'retry': {
                'retryable': runtime.autoretry,
                'maxAttempts': UtilClient.default_number(runtime.max_attempts, 3)
            },
            'backoff': {
                'policy': UtilClient.default_string(runtime.backoff_policy, 'no'),
                'period': UtilClient.default_number(runtime.backoff_period, 1)
            },
            'ignoreSSL': runtime.ignore_ssl
        }
        _last_request = None
        _last_exception = None
        _now = time.time()
        _retry_times = 0
        while TeaCore.allow_retry(_runtime.get('retry'), _retry_times, _now):
            if _retry_times > 0:
                _backoff_time = TeaCore.get_backoff_time(_runtime.get('backoff'), _retry_times)
                if _backoff_time > 0:
                    TeaCore.sleep(_backoff_time)
            _retry_times = _retry_times + 1
            try:
                _request = TeaRequest()
                _request.protocol = UtilClient.default_string(self._protocol, protocol)
                _request.method = method
                _request.pathname = '/'
                _request.query = TeaCore.merge({
                    'Action': action,
                    'Format': 'json',
                    'Version': version,
                    'Timestamp': OpenApiUtilClient.get_timestamp(),
                    'SignatureNonce': UtilClient.get_nonce()
                }, request.query)
                headers = self.get_rpc_headers()
                if UtilClient.is_unset(headers):
                    # endpoint is setted in product client
                    _request.headers = {
                        'host': self._endpoint,
                        'x-acs-version': version,
                        'x-acs-action': action,
                        'user-agent': self.get_user_agent()
                    }
                else:
                    _request.headers = TeaCore.merge({
                        'host': self._endpoint,
                        'x-acs-version': version,
                        'x-acs-action': action,
                        'user-agent': self.get_user_agent()
                    }, headers)
                if not UtilClient.is_unset(request.body):
                    m = UtilClient.assert_as_map(request.body)
                    tmp = UtilClient.anyify_map_value(OpenApiUtilClient.query(m))
                    _request.body = UtilClient.to_form_string(tmp)
                    _request.headers['content-type'] = 'application/x-www-form-urlencoded'
                if not UtilClient.equal_string(auth_type, 'Anonymous'):
                    access_key_id = self.get_access_key_id()
                    access_key_secret = self.get_access_key_secret()
                    security_token = self.get_security_token()
                    if not UtilClient.empty(security_token):
                        _request.query['SecurityToken'] = security_token
                    _request.query['SignatureMethod'] = 'HMAC-SHA1'
                    _request.query['SignatureVersion'] = '1.0'
                    _request.query['AccessKeyId'] = access_key_id
                    t = None
                    if not UtilClient.is_unset(request.body):
                        t = UtilClient.assert_as_map(request.body)
                    signed_param = TeaCore.merge(_request.query,
                        OpenApiUtilClient.query(t))
                    _request.query['Signature'] = OpenApiUtilClient.get_rpcsignature(signed_param, _request.method, access_key_secret)
                _last_request = _request
                _response = TeaCore.do_action(_request, _runtime)
                if UtilClient.is_4xx(_response.status_code) or UtilClient.is_5xx(_response.status_code):
                    _res = UtilClient.read_as_json(_response.body)
                    err = UtilClient.assert_as_map(_res)
                    request_id = self.default_any(err.get('RequestId'), err.get('requestId'))
                    raise TeaException({
                        'code': '%s' % TeaConverter.to_unicode(self.default_any(err.get('Code'), err.get('code'))),
                        'message': 'code: %s, %s request id: %s' % (TeaConverter.to_unicode(_response.status_code), TeaConverter.to_unicode(self.default_any(err.get('Message'), err.get('message'))), TeaConverter.to_unicode(request_id)),
                        'data': err
                    })
                if UtilClient.equal_string(body_type, 'binary'):
                    resp = {
                        'body': _response.body,
                        'headers': _response.headers
                    }
                    return resp
                elif UtilClient.equal_string(body_type, 'byte'):
                    byt = UtilClient.read_as_bytes(_response.body)
                    return {
                        'body': byt,
                        'headers': _response.headers
                    }
                elif UtilClient.equal_string(body_type, 'string'):
                    str = UtilClient.read_as_string(_response.body)
                    return {
                        'body': str,
                        'headers': _response.headers
                    }
                elif UtilClient.equal_string(body_type, 'json'):
                    obj = UtilClient.read_as_json(_response.body)
                    res = UtilClient.assert_as_map(obj)
                    return {
                        'body': res,
                        'headers': _response.headers
                    }
                elif UtilClient.equal_string(body_type, 'array'):
                    arr = UtilClient.read_as_json(_response.body)
                    return {
                        'body': arr,
                        'headers': _response.headers
                    }
                else:
                    return {
                        'headers': _response.headers
                    }
            except Exception as e:
                if TeaCore.is_retryable(e):
                    _last_exception = e
                    continue
                raise e
        raise UnretryableException(_last_request, _last_exception)
Example #28
0
    def test_compose_url(self):
        request = TeaRequest()
        try:
            TeaCore.compose_url(request)
        except Exception as e:
            self.assertEqual('"endpoint" is required.', str(e))

        request.headers['host'] = "fake.domain.com"
        self.assertEqual("http://fake.domain.com",
                         TeaCore.compose_url(request))

        request.headers['host'] = "http://fake.domain.com"
        self.assertEqual("http://fake.domain.com",
                         TeaCore.compose_url(request))

        request.port = 8080
        self.assertEqual("http://fake.domain.com:8080",
                         TeaCore.compose_url(request))

        request.pathname = "/index.html"
        self.assertEqual("http://fake.domain.com:8080/index.html",
                         TeaCore.compose_url(request))

        request.query["foo"] = ""
        self.assertEqual("http://fake.domain.com:8080/index.html?foo=",
                         TeaCore.compose_url(request))

        request.query["foo"] = "bar"
        self.assertEqual("http://fake.domain.com:8080/index.html?foo=bar",
                         TeaCore.compose_url(request))

        request.pathname = "/index.html?a=b"
        self.assertEqual("http://fake.domain.com:8080/index.html?a=b&foo=bar",
                         TeaCore.compose_url(request))

        request.pathname = "/index.html?a=b&"
        self.assertEqual("http://fake.domain.com:8080/index.html?a=b&foo=bar",
                         TeaCore.compose_url(request))

        request.query["fake"] = None
        self.assertEqual("http://fake.domain.com:8080/index.html?a=b&foo=bar",
                         TeaCore.compose_url(request))
Example #29
0
    def test_get_signature(self):
        request = TeaRequest()
        signature = Client.get_signature(request, "bucket", "accessKeyId",
                                         "accessKeySecret", "v2", None)
        self.assertEqual(
            "OSS2 AccessKeyId:accessKeyId,Signature:61mT0P8eZxBI5cfj7YfqctSz4Zwtp0sltgTS5JZZc1M=",
            signature)

        request = TeaRequest()
        request.pathname = 'test?aa'
        request.headers = {
            'x-oss-test': 'test',
            'content-type': 'type',
            'content-md5': 'md5',
        }
        request.query = {
            'testQuery': 'testQuery',
            'queryKey': 'queryValue',
            "x-oss-test": "test"
        }
        res = Client.get_signature(request, 'test', 'ak', 'sk', 'v2', None)
        self.assertEqual(
            'OSS2 AccessKeyId:ak,Signature:QNGIXVU4Qg0dxuBmVaN8q//ceXf15fmdTEaIK7R3od4=',
            res)

        request = TeaRequest()
        request.headers = {
            'x-oss-test': 'test',
            'content-type': 'type',
            'content-md5': 'md5'
        }
        request.query = {
            'testQuery': 'testQuery',
            'queryKey': 'queryValue',
            'x-oss-process': 'value'
        }
        res = Client.get_signature(request, 'test', "ak", "sk", "v1", None)
        self.assertEqual('OSS ak:q9lSDGVH1VmpjMTGSwUZn3tg3J4=', res)
Example #30
0
    def do_request(self, params, request, runtime):
        """
        Encapsulate the request and invoke the network

        @param action: api name

        @param version: product version

        @param protocol: http or https

        @param method: e.g. GET

        @param auth_type: authorization type e.g. AK

        @param body_type: response body type e.g. String

        @param request: object of OpenApiRequest

        @param runtime: which controls some details of call api, such as retry times

        @rtype: dict
        @return: the response
        """
        params.validate()
        request.validate()
        runtime.validate()
        _runtime = {
            'timeouted': 'retry',
            'readTimeout': UtilClient.default_number(runtime.read_timeout, self._read_timeout),
            'connectTimeout': UtilClient.default_number(runtime.connect_timeout, self._connect_timeout),
            'httpProxy': UtilClient.default_string(runtime.http_proxy, self._http_proxy),
            'httpsProxy': UtilClient.default_string(runtime.https_proxy, self._https_proxy),
            'noProxy': UtilClient.default_string(runtime.no_proxy, self._no_proxy),
            'socks5Proxy': UtilClient.default_string(runtime.socks_5proxy, self._socks_5proxy),
            'socks5NetWork': UtilClient.default_string(runtime.socks_5net_work, self._socks_5net_work),
            'maxIdleConns': UtilClient.default_number(runtime.max_idle_conns, self._max_idle_conns),
            'retry': {
                'retryable': runtime.autoretry,
                'maxAttempts': UtilClient.default_number(runtime.max_attempts, 3)
            },
            'backoff': {
                'policy': UtilClient.default_string(runtime.backoff_policy, 'no'),
                'period': UtilClient.default_number(runtime.backoff_period, 1)
            },
            'ignoreSSL': runtime.ignore_ssl
        }
        _last_request = None
        _last_exception = None
        _now = time.time()
        _retry_times = 0
        while TeaCore.allow_retry(_runtime.get('retry'), _retry_times, _now):
            if _retry_times > 0:
                _backoff_time = TeaCore.get_backoff_time(_runtime.get('backoff'), _retry_times)
                if _backoff_time > 0:
                    TeaCore.sleep(_backoff_time)
            _retry_times = _retry_times + 1
            try:
                _request = TeaRequest()
                _request.protocol = UtilClient.default_string(self._protocol, params.protocol)
                _request.method = params.method
                _request.pathname = params.pathname
                _request.query = request.query
                # endpoint is setted in product client
                _request.headers = TeaCore.merge({
                    'host': self._endpoint,
                    'x-acs-version': params.version,
                    'x-acs-action': params.action,
                    'user-agent': self.get_user_agent(),
                    'x-acs-date': OpenApiUtilClient.get_timestamp(),
                    'x-acs-signature-nonce': UtilClient.get_nonce(),
                    'accept': 'application/json'
                }, request.headers)
                if UtilClient.equal_string(params.style, 'RPC'):
                    headers = self.get_rpc_headers()
                    if not UtilClient.is_unset(headers):
                        _request.headers = TeaCore.merge(_request.headers,
                            headers)
                signature_algorithm = UtilClient.default_string(self._signature_algorithm, 'ACS3-HMAC-SHA256')
                hashed_request_payload = OpenApiUtilClient.hex_encode(OpenApiUtilClient.hash(UtilClient.to_bytes(''), signature_algorithm))
                if not UtilClient.is_unset(request.stream):
                    tmp = UtilClient.read_as_bytes(request.stream)
                    hashed_request_payload = OpenApiUtilClient.hex_encode(OpenApiUtilClient.hash(tmp, signature_algorithm))
                    _request.body = tmp
                    _request.headers['content-type'] = 'application/octet-stream'
                else:
                    if not UtilClient.is_unset(request.body):
                        if UtilClient.equal_string(params.req_body_type, 'json'):
                            json_obj = UtilClient.to_jsonstring(request.body)
                            hashed_request_payload = OpenApiUtilClient.hex_encode(OpenApiUtilClient.hash(UtilClient.to_bytes(json_obj), signature_algorithm))
                            _request.body = json_obj
                            _request.headers['content-type'] = 'application/json; charset=utf-8'
                        else:
                            m = UtilClient.assert_as_map(request.body)
                            form_obj = OpenApiUtilClient.to_form(m)
                            hashed_request_payload = OpenApiUtilClient.hex_encode(OpenApiUtilClient.hash(UtilClient.to_bytes(form_obj), signature_algorithm))
                            _request.body = form_obj
                            _request.headers['content-type'] = 'application/x-www-form-urlencoded'
                _request.headers['x-acs-content-sha256'] = hashed_request_payload
                if not UtilClient.equal_string(params.auth_type, 'Anonymous'):
                    auth_type = self.get_type()
                    if UtilClient.equal_string(auth_type, 'bearer'):
                        bearer_token = self.get_bearer_token()
                        _request.headers['x-acs-bearer-token'] = bearer_token
                    else:
                        access_key_id = self.get_access_key_id()
                        access_key_secret = self.get_access_key_secret()
                        security_token = self.get_security_token()
                        if not UtilClient.empty(security_token):
                            _request.headers['x-acs-accesskey-id'] = access_key_id
                            _request.headers['x-acs-security-token'] = security_token
                        _request.headers['Authorization'] = OpenApiUtilClient.get_authorization(_request, signature_algorithm, hashed_request_payload, access_key_id, access_key_secret)
                _last_request = _request
                _response = TeaCore.do_action(_request, _runtime)
                if UtilClient.is_4xx(_response.status_code) or UtilClient.is_5xx(_response.status_code):
                    err = {}
                    if not UtilClient.is_unset(_response.headers.get('content-type')) and UtilClient.equal_string(_response.headers.get('content-type'), 'text/xml;charset=utf-8'):
                        _str = UtilClient.read_as_string(_response.body)
                        resp_map = XMLClient.parse_xml(_str, None)
                        err = UtilClient.assert_as_map(resp_map.get('Error'))
                    else:
                        _res = UtilClient.read_as_json(_response.body)
                        err = UtilClient.assert_as_map(_res)
                    err['statusCode'] = _response.status_code
                    raise TeaException({
                        'code': '%s' % TeaConverter.to_unicode(self.default_any(err.get('Code'), err.get('code'))),
                        'message': 'code: %s, %s request id: %s' % (TeaConverter.to_unicode(_response.status_code), TeaConverter.to_unicode(self.default_any(err.get('Message'), err.get('message'))), TeaConverter.to_unicode(self.default_any(err.get('RequestId'), err.get('requestId')))),
                        'data': err
                    })
                if UtilClient.equal_string(params.body_type, 'binary'):
                    resp = {
                        'body': _response.body,
                        'headers': _response.headers,
                        'statusCode': _response.status_code
                    }
                    return resp
                elif UtilClient.equal_string(params.body_type, 'byte'):
                    byt = UtilClient.read_as_bytes(_response.body)
                    return {
                        'body': byt,
                        'headers': _response.headers,
                        'statusCode': _response.status_code
                    }
                elif UtilClient.equal_string(params.body_type, 'string'):
                    str = UtilClient.read_as_string(_response.body)
                    return {
                        'body': str,
                        'headers': _response.headers,
                        'statusCode': _response.status_code
                    }
                elif UtilClient.equal_string(params.body_type, 'json'):
                    obj = UtilClient.read_as_json(_response.body)
                    res = UtilClient.assert_as_map(obj)
                    return {
                        'body': res,
                        'headers': _response.headers,
                        'statusCode': _response.status_code
                    }
                elif UtilClient.equal_string(params.body_type, 'array'):
                    arr = UtilClient.read_as_json(_response.body)
                    return {
                        'body': arr,
                        'headers': _response.headers,
                        'statusCode': _response.status_code
                    }
                else:
                    return {
                        'headers': _response.headers,
                        'statusCode': _response.status_code
                    }
            except Exception as e:
                if TeaCore.is_retryable(e):
                    _last_exception = e
                    continue
                raise e
        raise UnretryableException(_last_request, _last_exception)