Skip to content

Commit 718d06a

Browse files
committed
Merge branch 'feat_optimize_request' into 'master'
Feat optimize request See merge request server/openapi/openapi-python-sdk!206
2 parents 7281169 + 4528acc commit 718d06a

File tree

6 files changed

+51
-82
lines changed

6 files changed

+51
-82
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
# 3.1.4 (2024-01-19)
2+
### Modify
3+
- 优化http请求,复用连接
4+
- 优化rsa签名
5+
16
# 3.1.3 (2024-01-04)
27
### Modify
38
- `QuoteClient.get_symbol_names` 支持 OTC

requirements.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ cryptography
1111
backoff
1212
jproperties
1313
protobuf
14-
google-cloud
14+
google-cloud
15+
urllib3

tigeropen/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@
44
55
@author: gaoan
66
"""
7-
__VERSION__ = '3.1.3'
7+
__VERSION__ = '3.1.4'

tigeropen/common/util/signature_utils.py

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@
66
"""
77

88
import base64
9-
import binascii
109
import json
11-
import logging
12-
import sys
10+
from functools import lru_cache
1311

14-
import rsa
12+
from cryptography.hazmat.backends import default_backend
13+
from cryptography.hazmat.primitives import hashes
14+
from cryptography.hazmat.primitives import serialization
15+
from cryptography.hazmat.primitives.asymmetric import padding
1516

1617
from tigeropen.common.util.string_utils import add_start_end
1718

@@ -56,21 +57,42 @@ def fill_public_key_marker(public_key):
5657
return add_start_end(public_key, "-----BEGIN PUBLIC KEY-----\n", "\n-----END PUBLIC KEY-----")
5758

5859

59-
def sign_with_rsa(private_key, sign_content, charset):
60+
@lru_cache(maxsize=10)
61+
def load_private_key(private_key):
62+
return serialization.load_pem_private_key(
63+
fill_private_key_marker(private_key).encode(),
64+
password=None,
65+
backend=default_backend()
66+
)
67+
68+
69+
@lru_cache(maxsize=10)
70+
def load_public_key(public_key):
71+
return serialization.load_pem_public_key(
72+
fill_public_key_marker(public_key).encode(),
73+
backend=default_backend()
74+
)
75+
76+
77+
def sign_with_rsa(private_key_str, sign_content, charset):
6078
sign_content = sign_content.encode(charset)
61-
try:
62-
private_key = rsa.PrivateKey.load_pkcs1(fill_private_key_marker(private_key), format='PEM')
63-
except binascii.Error:
64-
logging.error("私钥格式错误, 请参考文档进行修改. https://quant.itiger.com/openapi/py-docs/zh-cn/docs/intro/quickstart.html ")
65-
sys.exit(1)
79+
private_key = load_private_key(private_key_str)
6680

67-
signature = rsa.sign(sign_content, private_key, 'SHA-1')
81+
algorithm = hashes.SHA1()
82+
padding_data = padding.PKCS1v15()
6883

84+
signature = private_key.sign(sign_content, padding_data, algorithm)
6985
sign = str(base64.b64encode(signature), encoding=charset)
7086
return sign
7187

7288

7389
def verify_with_rsa(public_key, message, sign):
74-
public_key = fill_public_key_marker(public_key)
90+
public_key = load_public_key(public_key)
7591
sign = base64.b64decode(sign)
76-
return rsa.verify(message, sign, rsa.PublicKey.load_pkcs1_openssl_pem(public_key))
92+
padding_data = padding.PKCS1v15()
93+
algorithm = hashes.SHA1()
94+
try:
95+
public_key.verify(sign, message, padding=padding_data, algorithm=algorithm)
96+
except Exception as e:
97+
raise e
98+
return True

tigeropen/common/util/web_utils.py

Lines changed: 7 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -8,48 +8,9 @@
88

99
from tigeropen.common.consts import THREAD_LOCAL
1010
from tigeropen.common.exceptions import RequestException, ResponseException
11+
from urllib3 import PoolManager
1112

12-
try:
13-
import httplib
14-
except ImportError:
15-
import http.client as httplib
16-
try:
17-
import urlparse
18-
except ImportError:
19-
import urllib.parse as urlparse
20-
try:
21-
from urllib.parse import quote_plus
22-
except ImportError:
23-
from urllib import quote_plus
24-
25-
26-
def url_encode(params, charset):
27-
query_string = ""
28-
for (k, v) in params.items():
29-
value = v
30-
if not isinstance(value, str):
31-
value = json.dumps(value, ensure_ascii=False)
32-
value = quote_plus(value, encoding=charset)
33-
query_string += ("&" + k + "=" + value)
34-
query_string = query_string[1:]
35-
return query_string
36-
37-
38-
def get_http_connection(url, query_string, timeout):
39-
url_parse_result = urlparse.urlparse(url)
40-
host = url_parse_result.hostname
41-
port = 80
42-
connection = httplib.HTTPConnection(host=host, port=port, timeout=timeout)
43-
if url.find("https") == 0:
44-
port = 443
45-
connection = httplib.HTTPSConnection(host=host, port=port, timeout=timeout)
46-
url = url_parse_result.scheme + "://" + url_parse_result.hostname
47-
if url_parse_result.port:
48-
url += url_parse_result.port
49-
url += url_parse_result.path
50-
if query_string:
51-
url += ('?' + query_string)
52-
return url, connection
13+
http_pool = PoolManager()
5314

5415

5516
def do_post(url, query_string=None, headers=None, params=None, timeout=15, charset=None):
@@ -63,36 +24,16 @@ def do_get(url, query_string=None, headers=None, params=None, timeout=15, charse
6324

6425

6526
def do_request(method, url, query_string=None, headers=None, params=None, timeout=15, charset=None):
66-
url, connection = get_http_connection(url, query_string, timeout)
67-
68-
try:
69-
connection.connect()
70-
except Exception as e:
71-
raise RequestException('[' + THREAD_LOCAL.uuid + ']' + method + ' connect failed. url: ' + url
72-
+ ' headers: ' + str(headers)
73-
+ ' params: ' + str(params) + ' detail: ' + str(e))
7427
try:
75-
connection.request(method, url, body=json.dumps(params), headers=headers)
28+
response = http_pool.request(method, url=url, fields=query_string, body=json.dumps(params), headers=headers,
29+
timeout=timeout,
30+
)
7631
except Exception as e:
7732
raise RequestException('[' + THREAD_LOCAL.uuid + ']' + method + ' request failed. url: ' + url
7833
+ ' headers: ' + str(headers)
7934
+ ' params: ' + str(params) + ' detail: ' + str(e))
80-
try:
81-
response = connection.getresponse()
82-
result = response.read()
83-
except Exception as e:
84-
raise ResponseException('[' + THREAD_LOCAL.uuid + '] read response error ' +
85-
' headers: ' + str(headers) +
86-
' params: ' + str(params))
8735
if response.status != 200:
88-
if charset:
89-
result = result.decode(charset)
9036
raise ResponseException('[' + THREAD_LOCAL.uuid + ']invalid http status ' + str(response.status) +
9137
' headers: ' + str(headers) +
92-
' detail body:' + result + ' params: ' + str(params))
93-
try:
94-
response.close()
95-
connection.close()
96-
except Exception as e:
97-
pass
98-
return result
38+
' detail body:' + str(response.data) + ' params: ' + str(params))
39+
return response.data

tigeropen/tiger_open_config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,7 @@ def query_domains(self):
395395
}
396396
"""
397397
try:
398-
result = json.loads(do_get(DOMAIN_GARDEN_ADDRESS, headers=dict(), params=dict(), timeout=1).decode()) \
398+
result = json.loads(do_get(DOMAIN_GARDEN_ADDRESS, headers=dict(), params=dict(), timeout=1)) \
399399
.get('items')
400400
if result:
401401
for item in result:

0 commit comments

Comments
 (0)