Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
138 changes: 81 additions & 57 deletions aliyun-python-sdk-core/alibabacloud/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import os
import time
from alibabacloud.handlers import RequestContext

DEFAULT_HANDLERS = [
HttpHeaderHandler, # 获取请求头
Expand All @@ -25,19 +27,24 @@
]

DEFAULT_FORMAT = 'JSON'

from alibabacloud.handlers import RequestContext
DEFAULT_ENABLE_RETRY_POLICY = True
DEFAULT_MAX_RETRY_TIMES = 3
DEFAULT_CONNECTION_TIMEOUT = 5
DEFAULT_READ_TIMEOUT = 10
DEFAULT_ENABLE_HTTP_DEBUG = False
DEFAULT_ENABLE_HTTPS = False


class ClientConfig:
"""
处理client级别的所有的参数
"""

def __init__(self, access_key_id=None, access_key_secret=None, region_id=None,
enable_retry_policy=True, max_retry_times=None, user_agent=None,
extra_user_agent=None, enable_https=True, http_port=None, https_port=None,
connection_timeout=None, read_timeout=None, accept_format=DEFAULT_FORMAT,
specific_signer=None):
enable_retry_policy=None, max_retry_times=None, user_agent=None,
extra_user_agent=None, enable_https=None, http_port=None, https_port=None,
connection_timeout=None, read_timeout=None, enable_http_debug=None,
http_proxy=None, https_proxy=None, enable_stream_logger=None):

self.access_key_id = access_key_id
self.access_key_secret = access_key_secret
Expand All @@ -51,64 +58,81 @@ def __init__(self, access_key_id=None, access_key_secret=None, region_id=None,
self.https_port = https_port
self.connection_timeout = connection_timeout
self.read_timeout = read_timeout
self.timeout = (connection_timeout, read_timeout)
# yan 添加的
self.accept_format = accept_format
self.specific_signer = specific_signer
self._timeout = (self.connection_timeout, self.read_timeout)
self.enable_http_debug = enable_http_debug
self.http_proxy = http_proxy
self.https_proxy = https_proxy
self.enable_stream_logger = enable_stream_logger

def read_from_env(self):

def _set_env_to_config(config_name, env_name):

env_value = os.environ.get(env_name)
if env_value is not None:
setattr(self, key, os.environ.get(env_value))

self.http_debug = os.environ.get('DEBUG') or os.environ.get('debug')
self.proxy_https = os.environ.get('HTTPS_PROXY') or os.environ.get(
'https_proxy')
self.proxy_http = os.environ.get(
'HTTP_PROXY') or os.environ.get('http_proxy')
# 用户硬编码传参、环境变量、读配置文件的获取参数的方式
# TODO assign more attributes
if config_name == 'enable_http_debug':
# FIXME recursive calls will be indefinite
_set_env_to_config(config_name, 'HTTP_DEBUG')
_set_env_to_config(config_name, 'http_debug')
elif config_name == 'https_proxy':
_set_env_to_config(config_name, 'HTTPS_PROXY')
_set_env_to_config(config_name, 'https_proxy')
elif config_name == 'http_proxy':
_set_env_to_config(config_name, 'HTTP_PROXY')
_set_env_to_config(config_name, 'http_proxy')

for key in dir(self):
# FIXME make sure we get only configuration members here, not functions & internal
# variables
if getattr(self, key) is None:
env_name = 'ALIBABA_CLOUD_' + key.upper()
_set_env_to_config(key, env_name)

def read_from_profile(self):
# TODO read from profile
pass

def read_from_default(self):
pass


def get_merged_client_config(config):
config.read_from_env()
config.read_from_profile()
config.read_from_default()
return config


class AlibabaCloudClient:

def __init__(self, client_config, credentials_provider):
self.config = client_config
self.config = get_merged_client_config(client_config)
self.credentials_provider = credentials_provider
self.handlers = []
self.endpoint_resolver = None # TODO initialize
self.logger = None # TODO initialize

def handle_request(self, request):
def handle_request(self, api_request, request_handlers=None, context=None):
# TODO handle different types of request
prepare_request = PreparedRequest(request) # 对request层面进行的语法封装
context = RequestContext()
context.request = prepare_request
context.config = self.config

for handler in self.handlers:
# 所有的一系列handler实际是组装参数,获取endpoint等等的数据
if hasattr(handler, 'handle_request'):
result = handler.handle_request(context)
if result is not None:
return result
http_request = context.http_request

# 应该返回原始的response,对error进行的处理
try:
response = http_request.get_response_object()
except IOError as e:
exception = ClientException(error_code.SDK_HTTP_ERROR, str(e))
return None, None, None, exception

response_flag = True
# 对返回结果进行一层 exceptions 的校验
for handler in reversed(self.handlers):
if hasattr(handler, 'handle_exceptions'):
result = handler.handle_exceptions(response)
# TODO : result 有值,说明是ServerExceptions 下面的不走了
if request is not None:
response_flag = False
return result

# 对response 进行的一层处理,原本是response对象
if response_flag:
for handler in reversed(self.handlers):
if hasattr(handler, 'handle_response'):
result = handler.handle_response(response)
return result


if not context:
context = RequestContext()
context.api_request = api_request
context.config = self.config

if not request_handlers:
request_handlers = self.handlers

for i in range(len(request_handlers)):
request_handlers[i].handle_request(context)

for i in reversed(range(len(request_handlers))):
request_handlers[i].handle_response(context)
if context.retry_flag:
time.sleep(context.retry_backoff)
self.handle_request(api_request,
request_handlers=request_handlers[i:],
context=context)

return context.result
38 changes: 33 additions & 5 deletions aliyun-python-sdk-core/alibabacloud/credentials/credentials.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,45 @@
# Copyright 2019 Alibaba Cloud Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


class AlibabaCloudCredentials:

def __init__(self):
self.access_key_id = None
self.access_key_secret = None
self.security_token = None
self.bearer_token = None


# credentials
class AccessKeyCredentials:
class AccessKeyCredentials(AlibabaCloudCredentials):

def __init__(self, access_key_id, access_key_secret):
AlibabaCloudCredentials.__init__(self)
self.access_key_id = access_key_id
self.access_key_secret = access_key_secret


class BearTokenCredentials:
class BearTokenCredentials(AlibabaCloudCredentials):
def __init__(self, bearer_token):
AlibabaCloudCredentials.__init__(self)
self.bearer_token = bearer_token


class SecurityCredentials:
def __init__(self, access_key_id, access_key_secret, token):
class SecurityCredentials(AlibabaCloudCredentials):
def __init__(self, access_key_id, access_key_secret, security_token):
AlibabaCloudCredentials.__init__(self)
self.access_key_id = access_key_id
self.access_key_secret = access_key_secret
self.token = token
self.security_token = security_token
Original file line number Diff line number Diff line change
Expand Up @@ -267,9 +267,10 @@ def load_credentials(self):


class CredentialsProvider(object):
@staticmethod
def load():
return True

# if no credentials got, return None
def load(self):
return None


class UserProvider(CredentialsProvider):
Expand Down
9 changes: 8 additions & 1 deletion aliyun-python-sdk-core/alibabacloud/handlers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,14 @@


class RequestContext:
pass

def __init__(self):
self.api_request = None
self.http_request = None
self.api_response = None
self.http_response = None
self.retry_flag = False
self.retry_backoff = 0


class RequestHandler:
Expand Down
26 changes: 8 additions & 18 deletions aliyun-python-sdk-core/alibabacloud/handlers/endpoint_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,29 +13,19 @@
# limitations under the License.

from alibabacloud.handlers import RequestHandler
from alibabacloud.endpoint.resolver_endpoint_request import ResolveEndpointRequest


class EndpointHandler(RequestHandler):

resolve_request_cls = ResolveEndpointRequest
# TODO client 内部仅仅是再次发送了一次请求,可以再次的优化这个方法
resolve_endpoint_cls = DefaultEndpointResolver(client)

def handle_request(self, context):
request = context.request
if request.endpoint:
context.endpoint = request.endpoint
else:
context.endpoint = self.resolve_endpoint(context.confi8g.region_id, request)
resolve_request = ResolveEndpointRequest(
context.config.region_id,
context.client.product_code,
context.client.location_service_code,
context.client.location_service_type,
)
context.endpoint = context.client.endpoint_resolver.resolve(resolve_request)

def handle_response(self, response):
pass

def resolve_endpoint(self, region_id, request):
resolve_request = self.resolve_request_cls(
region_id,
request.get_product(),
request.get_location_service_code(),
request.get_location_endpoint_type(),
)
return self.resolve_endpoint_cls.resolve(resolve_request)
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,6 @@ def handle_request(self, context):
http_request.set_content(body, "utf-8", 'application/x-www-form-urlencoded')
context.http_request = http_request

def handle_response(self, request, response):
def handle_response(self, context):
pass

Loading