1212# See the License for the specific language governing permissions and
1313# limitations under the License.
1414import os
15+ import time
16+ from alibabacloud .handlers import RequestContext
1517
1618DEFAULT_HANDLERS = [
1719 HttpHeaderHandler , # 获取请求头
2527]
2628
2729DEFAULT_FORMAT = 'JSON'
28-
29- from alibabacloud .handlers import RequestContext
30+ DEFAULT_ENABLE_RETRY_POLICY = True
31+ DEFAULT_MAX_RETRY_TIMES = 3
32+ DEFAULT_CONNECTION_TIMEOUT = 5
33+ DEFAULT_READ_TIMEOUT = 10
34+ DEFAULT_ENABLE_HTTP_DEBUG = False
35+ DEFAULT_ENABLE_HTTPS = False
3036
3137
3238class ClientConfig :
3339 """
3440 处理client级别的所有的参数
3541 """
42+
3643 def __init__ (self , access_key_id = None , access_key_secret = None , region_id = None ,
37- enable_retry_policy = True , max_retry_times = None , user_agent = None ,
38- extra_user_agent = None , enable_https = True , http_port = None , https_port = None ,
39- connection_timeout = None , read_timeout = None , accept_format = DEFAULT_FORMAT ,
40- specific_signer = None ):
44+ enable_retry_policy = None , max_retry_times = None , user_agent = None ,
45+ extra_user_agent = None , enable_https = None , http_port = None , https_port = None ,
46+ connection_timeout = None , read_timeout = None , enable_http_debug = None ,
47+ http_proxy = None , https_proxy = None , enable_stream_logger = None ):
4148
4249 self .access_key_id = access_key_id
4350 self .access_key_secret = access_key_secret
@@ -51,64 +58,81 @@ def __init__(self, access_key_id=None, access_key_secret=None, region_id=None,
5158 self .https_port = https_port
5259 self .connection_timeout = connection_timeout
5360 self .read_timeout = read_timeout
54- self .timeout = (connection_timeout , read_timeout )
55- # yan 添加的
56- self .accept_format = accept_format
57- self .specific_signer = specific_signer
61+ self ._timeout = (self .connection_timeout , self .read_timeout )
62+ self .enable_http_debug = enable_http_debug
63+ self .http_proxy = http_proxy
64+ self .https_proxy = https_proxy
65+ self .enable_stream_logger = enable_stream_logger
66+
67+ def read_from_env (self ):
68+
69+ def _set_env_to_config (config_name , env_name ):
70+
71+ env_value = os .environ .get (env_name )
72+ if env_value is not None :
73+ setattr (self , key , os .environ .get (env_value ))
5874
59- self .http_debug = os .environ .get ('DEBUG' ) or os .environ .get ('debug' )
60- self .proxy_https = os .environ .get ('HTTPS_PROXY' ) or os .environ .get (
61- 'https_proxy' )
62- self .proxy_http = os .environ .get (
63- 'HTTP_PROXY' ) or os .environ .get ('http_proxy' )
64- # 用户硬编码传参、环境变量、读配置文件的获取参数的方式
65- # TODO assign more attributes
75+ if config_name == 'enable_http_debug' :
76+ # FIXME recursive calls will be indefinite
77+ _set_env_to_config (config_name , 'HTTP_DEBUG' )
78+ _set_env_to_config (config_name , 'http_debug' )
79+ elif config_name == 'https_proxy' :
80+ _set_env_to_config (config_name , 'HTTPS_PROXY' )
81+ _set_env_to_config (config_name , 'https_proxy' )
82+ elif config_name == 'http_proxy' :
83+ _set_env_to_config (config_name , 'HTTP_PROXY' )
84+ _set_env_to_config (config_name , 'http_proxy' )
85+
86+ for key in dir (self ):
87+ # FIXME make sure we get only configuration members here, not functions & internal
88+ # variables
89+ if getattr (self , key ) is None :
90+ env_name = 'ALIBABA_CLOUD_' + key .upper ()
91+ _set_env_to_config (key , env_name )
92+
93+ def read_from_profile (self ):
94+ # TODO read from profile
95+ pass
96+
97+ def read_from_default (self ):
98+ pass
99+
100+
101+ def get_merged_client_config (config ):
102+ config .read_from_env ()
103+ config .read_from_profile ()
104+ config .read_from_default ()
105+ return config
66106
67107
68108class AlibabaCloudClient :
69109
70110 def __init__ (self , client_config , credentials_provider ):
71- self .config = client_config
111+ self .config = get_merged_client_config ( client_config )
72112 self .credentials_provider = credentials_provider
73113 self .handlers = []
114+ self .endpoint_resolver = None # TODO initialize
115+ self .logger = None # TODO initialize
74116
75- def handle_request (self , request ):
117+ def handle_request (self , api_request , request_handlers = None , context = None ):
76118 # TODO handle different types of request
77- prepare_request = PreparedRequest (request ) # 对request层面进行的语法封装
78- context = RequestContext ()
79- context .request = prepare_request
80- context .config = self .config
81-
82- for handler in self .handlers :
83- # 所有的一系列handler实际是组装参数,获取endpoint等等的数据
84- if hasattr (handler , 'handle_request' ):
85- result = handler .handle_request (context )
86- if result is not None :
87- return result
88- http_request = context .http_request
89-
90- # 应该返回原始的response,对error进行的处理
91- try :
92- response = http_request .get_response_object ()
93- except IOError as e :
94- exception = ClientException (error_code .SDK_HTTP_ERROR , str (e ))
95- return None , None , None , exception
96-
97- response_flag = True
98- # 对返回结果进行一层 exceptions 的校验
99- for handler in reversed (self .handlers ):
100- if hasattr (handler , 'handle_exceptions' ):
101- result = handler .handle_exceptions (response )
102- # TODO : result 有值,说明是ServerExceptions 下面的不走了
103- if request is not None :
104- response_flag = False
105- return result
106-
107- # 对response 进行的一层处理,原本是response对象
108- if response_flag :
109- for handler in reversed (self .handlers ):
110- if hasattr (handler , 'handle_response' ):
111- result = handler .handle_response (response )
112- return result
113-
114-
119+ if not context :
120+ context = RequestContext ()
121+ context .api_request = api_request
122+ context .config = self .config
123+
124+ if not request_handlers :
125+ request_handlers = self .handlers
126+
127+ for i in range (len (request_handlers )):
128+ request_handlers [i ].handle_request (context )
129+
130+ for i in reversed (range (len (request_handlers ))):
131+ request_handlers [i ].handle_response (context )
132+ if context .retry_flag :
133+ time .sleep (context .retry_backoff )
134+ self .handle_request (api_request ,
135+ request_handlers = request_handlers [i :],
136+ context = context )
137+
138+ return context .result
0 commit comments