Skip to content

Commit c9734b3

Browse files
authored
Merge pull request #121 from dt3310321/s3
S3
2 parents b7f1dba + 1d94dea commit c9734b3

File tree

6 files changed

+24
-13
lines changed

6 files changed

+24
-13
lines changed

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ notifications:
1616
- wjielai@tencent.com
1717
- fysntian@tencent.com
1818
script:
19-
- pycodestyle --max-line-length=180 qcloud_cos/.
19+
- pycodestyle --max-line-length=200 qcloud_cos/.
2020
- nosetests -s -v ut/
2121
deploy:
2222
provider: pypi

qcloud_cos/cos_auth.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import hashlib
77
import logging
88
from requests.auth import AuthBase
9-
from .cos_comm import to_unicode, to_bytes
9+
from .cos_comm import to_unicode, to_bytes, to_str
1010
logger = logging.getLogger(__name__)
1111

1212

@@ -44,14 +44,13 @@ def __call__(self, r):
4444
path = self._path
4545
uri_params = self._params
4646
headers = filter_headers(r.headers)
47-
uri_params = dict([(k.lower(), v) for k, v in uri_params.items()])
4847
# reserved keywords in headers urlencode are -_.~, notice that / should be encoded and space should not be encoded to plus sign(+)
49-
headers = dict([(k.lower(), quote(to_bytes(v), '-_.~')) for k, v in headers.items()]) # headers中的key转换为小写,value进行encode
50-
uri_params = dict([(k.lower(), v) for k, v in uri_params.items()])
48+
headers = dict([(quote(to_bytes(to_str(k)), '-_.~').lower(), quote(to_bytes(to_str(v)), '-_.~')) for k, v in headers.items()]) # headers中的key转换为小写,value进行encode
49+
uri_params = dict([(quote(to_bytes(to_str(k)), '-_.~').lower(), quote(to_bytes(to_str(v)), '-_.~')) for k, v in uri_params.items()])
5150
format_str = u"{method}\n{host}\n{params}\n{headers}\n".format(
5251
method=r.method.lower(),
5352
host=path,
54-
params=urlencode(sorted(uri_params.items())).replace('+', '%20').replace('%7E', '~'),
53+
params='&'.join(map(lambda tupl: "%s=%s" % (tupl[0], tupl[1]), sorted(uri_params.items()))),
5554
headers='&'.join(map(lambda tupl: "%s=%s" % (tupl[0], tupl[1]), sorted(headers.items())))
5655
)
5756
logger.debug("format str: " + format_str)
@@ -73,7 +72,7 @@ def __call__(self, r):
7372
ak=self._secret_id,
7473
sign_time=sign_time,
7574
key_time=sign_time,
76-
params=';'.join(sorted(map(lambda k: k.lower(), uri_params.keys()))),
75+
params=';'.join(sorted(uri_params.keys())),
7776
headers=';'.join(sorted(headers.keys())),
7877
sign=sign
7978
)

qcloud_cos/cos_client.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,7 @@ def get_presigned_url(self, Bucket, Key, Method, Expired=300, Params={}, Headers
479479
"""
480480
url = self._conf.uri(bucket=Bucket, path=Key)
481481
sign = self.get_auth(Method=Method, Bucket=Bucket, Key=Key, Expired=Expired, Headers=Headers, Params=Params)
482+
sign = urlencode(dict([item.split('=', 1) for item in sign.split('&')]))
482483
url = url + '?' + sign
483484
if Params:
484485
url = url + '&' + urlencode(Params)
@@ -2828,7 +2829,7 @@ def list_buckets(self, **kwargs):
28282829
return data
28292830

28302831
# Advanced interface
2831-
def _upload_part(self, bucket, key, local_path, offset, size, part_num, uploadid, md5_lst, resumable_flag, already_exist_parts, enable_md5):
2832+
def _upload_part(self, bucket, key, local_path, offset, size, part_num, uploadid, md5_lst, resumable_flag, already_exist_parts, enable_md5, traffic_limit):
28322833
"""从本地文件中读取分块, 上传单个分块,将结果记录在md5——list中
28332834
28342835
:param bucket(string): 存储桶名称.
@@ -2851,7 +2852,7 @@ def _upload_part(self, bucket, key, local_path, offset, size, part_num, uploadid
28512852
with open(local_path, 'rb') as fp:
28522853
fp.seek(offset, 0)
28532854
data = fp.read(size)
2854-
rt = self.upload_part(bucket, key, data, part_num, uploadid, enable_md5)
2855+
rt = self.upload_part(bucket, key, data, part_num, uploadid, enable_md5, TrafficLimit=traffic_limit)
28552856
md5_lst.append({'PartNumber': part_num, 'ETag': rt['ETag']})
28562857
return None
28572858

@@ -3004,15 +3005,19 @@ def upload_file(self, Bucket, Key, LocalFilePath, PartSize=1, MAXThread=5, Enabl
30043005
logger.info("create a new uploadid in upload_file, uploadid={uploadid}".format(uploadid=uploadid))
30053006

30063007
# 上传分块
3008+
# 增加限速功能
3009+
traffic_limit = None
3010+
if 'TrafficLimit' in kwargs:
3011+
traffic_limit = kwargs['TrafficLimit']
30073012
offset = 0 # 记录文件偏移量
30083013
lst = list() # 记录分块信息
30093014
pool = SimpleThreadPool(MAXThread)
30103015

30113016
for i in range(1, parts_num+1):
30123017
if i == parts_num: # 最后一块
3013-
pool.add_task(self._upload_part, Bucket, Key, LocalFilePath, offset, file_size-offset, i, uploadid, lst, resumable_flag, already_exist_parts, EnableMD5)
3018+
pool.add_task(self._upload_part, Bucket, Key, LocalFilePath, offset, file_size-offset, i, uploadid, lst, resumable_flag, already_exist_parts, EnableMD5, traffic_limit)
30143019
else:
3015-
pool.add_task(self._upload_part, Bucket, Key, LocalFilePath, offset, part_size, i, uploadid, lst, resumable_flag, already_exist_parts, EnableMD5)
3020+
pool.add_task(self._upload_part, Bucket, Key, LocalFilePath, offset, part_size, i, uploadid, lst, resumable_flag, already_exist_parts, EnableMD5, traffic_limit)
30163021
offset += part_size
30173022

30183023
pool.wait_completion()

qcloud_cos/cos_comm.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,13 @@
6161
}
6262

6363

64+
def to_str(s):
65+
"""非字符串转换为字符串"""
66+
if isinstance(s, text_type) or isinstance(s, binary_type):
67+
return s
68+
return str(s)
69+
70+
6471
def to_unicode(s):
6572
"""将字符串转为unicode"""
6673
if isinstance(s, binary_type):

qcloud_cos/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11

2-
__version__ = '5.1.8.0'
2+
__version__ = '5.1.8.1'

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def long_description():
1616

1717
setup(
1818
name='cos-python-sdk-v5',
19-
version='1.8.0',
19+
version='1.8.1',
2020
url='https://www.qcloud.com/',
2121
license='MIT',
2222
author='tiedu, lewzylu, channingliu',

0 commit comments

Comments
 (0)