Skip to content

Commit 6df3f26

Browse files
lizhenfu100yufeiminds
authored andcommitted
Add verify_ssl&cert in client config (#37)
FEATURES: - Add ssl options of client (#37)
1 parent 5827f9b commit 6df3f26

File tree

7 files changed

+59
-9
lines changed

7 files changed

+59
-9
lines changed

tests/test_core/test_client.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ def client():
1818
"private_key": "foo",
1919
"timeout": 10,
2020
"max_retries": 3,
21+
"ssl_verify": False,
2122
}
2223
)
2324

ucloud/core/client/_cfg.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ class ConfigSchema(schema.Schema):
1313
"max_retries": fields.Int(default=3),
1414
"log_level": fields.Int(default=logging.INFO),
1515
"validate_request": fields.Bool(default=True),
16+
"ssl_verify": fields.Bool(default=True),
17+
"ssl_cacert": fields.Str(),
18+
"ssl_cert": fields.Str(),
19+
"ssl_key": fields.Str(),
1620
}
1721

1822

@@ -53,6 +57,10 @@ def __init__(
5357
timeout: int = 30,
5458
max_retries: int = 3,
5559
log_level: int = logging.INFO,
60+
ssl_verify: bool = True,
61+
ssl_cacert: str = None,
62+
ssl_cert: str = None,
63+
ssl_key: str = None,
5664
**kwargs
5765
):
5866
self.region = region
@@ -62,6 +70,10 @@ def __init__(
6270
self.timeout = timeout
6371
self.max_retries = max_retries
6472
self.log_level = log_level
73+
self.ssl_verify = ssl_verify
74+
self.ssl_cacert = ssl_cacert
75+
self.ssl_cert = ssl_cert
76+
self.ssl_key = ssl_key
6577

6678
@classmethod
6779
def from_dict(cls, d: dict):
@@ -77,4 +89,8 @@ def to_dict(self) -> dict:
7789
"timeout": self.timeout,
7890
"max_retries": self.max_retries,
7991
"log_level": self.log_level,
92+
"ssl_verify": self.ssl_verify,
93+
"ssl_cacert": self.ssl_cacert,
94+
"ssl_cert": self.ssl_cert,
95+
"ssl_key": self.ssl_key,
8096
}

ucloud/core/client/_client.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from ucloud import version
66
from ucloud.core.client._cfg import Config
7-
from ucloud.core.transport import Transport, RequestsTransport, Request
7+
from ucloud.core.transport import Transport, RequestsTransport, Request, SSLOption
88
from ucloud.core.typesystem import encoder
99
from ucloud.core.utils import log
1010
from ucloud.core.utils.middleware import Middleware
@@ -86,8 +86,11 @@ def _send(self, action: str, args: dict, **options) -> dict:
8686

8787
max_retries = options.get("max_retries") or self.config.max_retries
8888
timeout = options.get("timeout") or self.config.timeout
89+
8990
resp = self.transport.send(
90-
req, timeout=timeout, max_retries=max_retries
91+
req, ssl_option=SSLOption(self.config.ssl_verify, self.config.ssl_cacert,
92+
self.config.ssl_cert, self.config.ssl_key),
93+
timeout=timeout, max_retries=max_retries
9194
).json()
9295

9396
for handler in self.middleware.response_handlers:

ucloud/core/transport/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from ucloud.core.transport.http import Request, Response, Transport
1+
from ucloud.core.transport.http import Request, Response, Transport, SSLOption
22
from ucloud.core.transport._requests import RequestsTransport
33

4-
__all__ = ["Request", "Response", "Transport", "RequestsTransport"]
4+
__all__ = ["Request", "Response", "Transport", "RequestsTransport", "SSLOption"]

ucloud/core/transport/_requests.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from urllib3.util.retry import Retry
44
from requests.adapters import HTTPAdapter
55
from ucloud.core.transport import http
6-
from ucloud.core.transport.http import Request, Response
6+
from ucloud.core.transport.http import Request, Response, SSLOption
77
from ucloud.core.utils.middleware import Middleware
88

99

@@ -32,7 +32,7 @@ def __init__(
3232
self._adapter = self._load_adapter(max_retries)
3333
self._middleware = Middleware()
3434

35-
def send(self, req: Request, **options: dict) -> http.Response:
35+
def send(self, req: Request, **options: typing.Any) -> http.Response:
3636
""" send request and return the response
3737
3838
:param req: the full http request descriptor
@@ -56,24 +56,40 @@ def middleware(self) -> Middleware:
5656
"""
5757
return self._middleware
5858

59-
def _send(self, req: Request, **options: dict) -> requests.Response:
59+
def _send(self, req: Request, **options: typing.Any) -> requests.Response:
6060
with requests.Session() as session:
6161
adapter = self._load_adapter(options.get("max_retries"))
6262
session.mount("http://", adapter=adapter)
6363
session.mount("https://", adapter=adapter)
6464

65+
ssl_option = options.get('ssl_option')
66+
kwargs = self._build_ssl_option(ssl_option) if ssl_option else {}
67+
6568
session_resp = session.request(
6669
method=req.method.upper(),
6770
url=req.url,
6871
json=req.json,
6972
data=req.data,
7073
params=req.params,
7174
headers=req.headers,
75+
**kwargs
7276
)
7377
resp = self.convert_response(session_resp)
7478
resp.request = req
7579
return resp
7680

81+
@staticmethod
82+
def _build_ssl_option(ssl_option):
83+
kwargs = {'verify': ssl_option.ssl_verify and ssl_option.ssl_cacert}
84+
if not ssl_option.ssl_cert:
85+
return kwargs
86+
87+
if ssl_option.ssl_key:
88+
kwargs['cert'] = (ssl_option.ssl_cert, ssl_option.ssl_key)
89+
else:
90+
kwargs['cert'] = ssl_option.ssl_cert
91+
return kwargs
92+
7793
def _load_adapter(
7894
self, max_retries: typing.Optional[int] = None
7995
) -> HTTPAdapter:

ucloud/core/transport/http.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,22 @@ def text(self):
8686
return content
8787

8888

89+
class SSLOption:
90+
def __init__(
91+
self,
92+
ssl_verify: bool = True,
93+
ssl_cacert: str = None,
94+
ssl_cert: str = None,
95+
ssl_key: str = None
96+
):
97+
self.ssl_verify = ssl_verify
98+
self.ssl_cacert = ssl_cacert
99+
self.ssl_cert = ssl_cert
100+
self.ssl_key = ssl_key
101+
102+
89103
class Transport:
90104
""" the abstract class of transport implementation """
91105

92-
def send(self, req: Request, **options: dict) -> Response:
106+
def send(self, req: Request, **options: typing.Any) -> Response:
93107
raise NotImplementedError

ucloud/testing/mock.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ def __init__(self):
1010
self.transport_handlers = []
1111
self.client_handler = []
1212

13-
def send(self, req: Request, **options: dict) -> Response:
13+
def send(self, req: Request, **options: typing.Any) -> Response:
1414
resp = Response(req.url, req.method)
1515
for handler in self.transport_handlers:
1616
resp = handler(req)

0 commit comments

Comments
 (0)