diff --git a/aliyun/log/__init__.py b/aliyun/log/__init__.py index a68ab84f..9391c536 100755 --- a/aliyun/log/__init__.py +++ b/aliyun/log/__init__.py @@ -13,7 +13,8 @@ from .version import __version__ from .logitem import LogItem from .consumer_group_request import * -from .external_store_config import * +from .external_store_config import * +from .session import Session # response class from .consumer_group_response import * diff --git a/aliyun/log/logclient.py b/aliyun/log/logclient.py index f09aedf5..eebbdceb 100644 --- a/aliyun/log/logclient.py +++ b/aliyun/log/logclient.py @@ -152,7 +152,7 @@ class LogClient(object): Version = __version__ def __init__(self, endpoint, accessKeyId, accessKey, securityToken=None, source=None, - auth_version=AUTH_VERSION_1, region=''): + auth_version=AUTH_VERSION_1, region='', session=None): self._isRowIp = Util.is_row_ip(endpoint) self._setendpoint(endpoint) self._accessKeyId = accessKeyId @@ -170,6 +170,7 @@ def __init__(self, endpoint, accessKeyId, accessKey, securityToken=None, source= self._auth_version = auth_version self._region = region self._auth = make_auth(accessKeyId, accessKey, auth_version, region) + self._session = session def _replace_credentials(self): delta = time.time() - self._last_refresh @@ -254,7 +255,17 @@ def _loadJson(resp_status, resp_header, resp_body, requestId): def _getHttpResponse(self, method, url, params, body, headers): # ensure method, url, body is str try: headers['User-Agent'] = self._user_agent - r = getattr(requests, method.lower())(url, params=params, data=body, headers=headers, timeout=self._timeout) + if self._session is not None: + r = self._session.do_request( + method.lower(), + url=url, + params=params, + data=body, + headers=headers, + timeout=self._timeout) + else: + r = getattr(requests, method.lower())(url, params=params, data=body, + headers=headers, timeout=self._timeout) return r.status_code, r.content, r.headers except Exception as ex: raise LogException('LogRequestError', str(ex)) diff --git a/aliyun/log/session.py b/aliyun/log/session.py new file mode 100644 index 00000000..c022398b --- /dev/null +++ b/aliyun/log/session.py @@ -0,0 +1,28 @@ +import requests + +#: 每个Session连接池大小 +connection_pool_size = 10 + + +class Session(object): + """属于同一个Session的请求共享一组连接池,如有可能也会重用HTTP连接。""" + + def __init__(self, pool_size=None, adapter=None): + self.session = requests.Session() + + psize = pool_size or connection_pool_size + if adapter is None: + self.session.mount('http://', requests.adapters.HTTPAdapter(pool_connections=psize, pool_maxsize=psize)) + self.session.mount('https://', requests.adapters.HTTPAdapter(pool_connections=psize, pool_maxsize=psize)) + else: + self.session.mount('http://', adapter) + self.session.mount('https://', adapter) + + def do_request(self, method, url, params, data, headers, timeout): + return self.session.request(method, + url, + data=data, + params=params, + headers=headers, + stream=True, + timeout=timeout) diff --git a/tests/set_tls_version.py b/tests/set_tls_version.py new file mode 100644 index 00000000..72f31ccf --- /dev/null +++ b/tests/set_tls_version.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +import os +import ssl +from aliyun import log +from requests.adapters import HTTPAdapter + +access_key_id = os.getenv('LOG_TEST_ACCESS_KEY_ID', '<你的AccessKeyId>') +access_key_secret = os.getenv('LOG_TEST_ACCESS_KEY_SECRET', '<你的AccessKeySecret>') +project_name = os.getenv('LOG_TEST_PROJECT', '<你的Project>') +endpoint = os.getenv('LOG_TEST_ENDPOINT', '<你的访问域名>') + +# 确认上面的参数都填写正确了 +for param in (access_key_id, access_key_secret, project_name, endpoint): + assert '<' not in param, '请设置参数:' + param + + +# 自定义ssl adapter,这里仅以设置ssl_version为例说明 +class SSLAdapter(HTTPAdapter): + def init_poolmanager(self, *args, **kwargs): + kwargs["ssl_version"] = ssl.PROTOCOL_TLSv1_2 + return super().init_poolmanager(*args, **kwargs) + + +# 创建session对象,通过session自定义adapter +session = log.Session(adapter=SSLAdapter()) + +client = log.LogClient(endpoint, access_key_id, access_key_secret, session=session) +client.create_project(project_name, "hello")