Skip to content

Commit ece048a

Browse files
committed
fix some bugs and modify ut
1 parent 44b23e8 commit ece048a

File tree

3 files changed

+58
-24
lines changed

3 files changed

+58
-24
lines changed

qcloud_cos/cos_auth.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,13 @@ def __call__(self, r):
5454
path = self._path
5555
uri_params = self._params
5656
headers = filter_headers(r.headers)
57+
uri_params = dict([(k.lower(), v.lower()) for k, v in uri_params.items()])
5758
# reserved keywords in headers urlencode are -_.~, notice that / should be encoded and space should not be encoded to plus sign(+)
5859
headers = dict([(k.lower(), quote(v, '-_.~')) for k, v in headers.items()]) # headers中的key转换为小写,value进行encode
5960
format_str = "{method}\n{host}\n{params}\n{headers}\n".format(
6061
method=r.method.lower(),
6162
host=path,
62-
params=urllib.urlencode(sorted(uri_params.items())),
63+
params=urllib.urlencode(sorted(uri_params.items())).replace('+', '%20'),
6364
headers='&'.join(map(lambda (x, y): "%s=%s" % (x, y), sorted(headers.items())))
6465
)
6566
logger.debug("format str: " + format_str)

qcloud_cos/cos_client.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1829,11 +1829,12 @@ def _check_all_upload_parts(self, bucket, key, uploadid, local_path, parts_num,
18291829
UploadId=uploadid,
18301830
PartNumberMarker=part_number_marker
18311831
)
1832-
parts_info.extend(response['Part'])
1832+
if 'Part' in response:
1833+
parts_info.extend(response['Part'])
18331834
if response['IsTruncated'] == 'false':
18341835
list_over_status = True
18351836
else:
1836-
part_number_marker = int(response['NextMarker'])
1837+
part_number_marker = int(response['NextPartNumberMarker'])
18371838
for part in parts_info:
18381839
part_num = int(part['PartNumber'])
18391840
# 如果分块数量大于本地计算出的最大数量,校验失败

ut/test.py

Lines changed: 53 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212

1313
SECRET_ID = os.environ["SECRET_ID"]
1414
SECRET_KEY = os.environ["SECRET_KEY"]
15-
test_bucket = "test01-1252448703"
15+
TRAVIS_FLAG = os.environ["TRAVIS_FLAG"]
16+
test_bucket = 'cos-python-v5-test-' + str(sys.version_info[0]) + '-' + str(sys.version_info[1]) + '-' + '1252448703'
1617
test_object = "test.txt"
1718
special_file_name = "中文" + "→↓←→↖↗↙↘! \"#$%&'()*+,-./0123456789:;<=>@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
1819
conf = CosConfig(
@@ -23,6 +24,19 @@
2324
client = CosS3Client(conf)
2425

2526

27+
def _create_test_bucket(test_bucket):
28+
try:
29+
response = client.create_bucket(
30+
Bucket=test_bucket,
31+
)
32+
except Exception as e:
33+
if e.get_error_code() == 'BucketAlreadyOwnedByYou':
34+
print('BucketAlreadyOwnedByYou')
35+
else:
36+
raise e
37+
return None
38+
39+
2640
def get_raw_md5(data):
2741
m2 = hashlib.md5(data)
2842
etag = '"' + str(m2.hexdigest()) + '"'
@@ -37,22 +51,24 @@ def gen_file(path, size):
3751

3852

3953
def print_error_msg(e):
40-
print e.get_origin_msg()
41-
print e.get_digest_msg()
42-
print e.get_status_code()
43-
print e.get_error_code()
44-
print e.get_error_msg()
45-
print e.get_resource_location()
46-
print e.get_trace_id()
47-
print e.get_request_id()
54+
print (e.get_origin_msg())
55+
print (e.get_digest_msg())
56+
print (e.get_status_code())
57+
print (e.get_error_code())
58+
print (e.get_error_msg())
59+
print (e.get_resource_location())
60+
print (e.get_trace_id())
61+
print (e.get_request_id())
4862

4963

5064
def setUp():
51-
print "start test..."
65+
print ("start test...")
66+
print ("start create bucket " + test_bucket)
67+
_create_test_bucket(test_bucket)
5268

5369

5470
def tearDown():
55-
print "function teardown"
71+
print ("function teardown")
5672

5773

5874
def test_put_get_delete_object_10MB():
@@ -146,6 +162,11 @@ def test_put_object_non_exist_bucket():
146162

147163
def test_put_object_acl():
148164
"""设置object acl"""
165+
response = client.put_object(
166+
Bucket=test_bucket,
167+
Key=test_object,
168+
Body='test acl'
169+
)
149170
response = client.put_object_acl(
150171
Bucket=test_bucket,
151172
Key=test_object,
@@ -160,6 +181,10 @@ def test_get_object_acl():
160181
Key=test_object
161182
)
162183
assert response
184+
response = client.delete_object(
185+
Bucket=test_bucket,
186+
Key=test_object
187+
)
163188

164189

165190
def test_copy_object_diff_bucket():
@@ -352,7 +377,7 @@ def test_get_bucket_acl_normal():
352377
def test_list_objects():
353378
"""列出bucket下的objects"""
354379
response = client.list_objects(
355-
Bucket=test_bucket,
380+
Bucket='test01-1252448703',
356381
MaxKeys=100,
357382
Prefix='中文',
358383
Delimiter='/'
@@ -376,7 +401,7 @@ def test_get_presigned_url():
376401
Key='中文.txt'
377402
)
378403
assert url
379-
print url
404+
print (url)
380405

381406

382407
def test_get_bucket_location():
@@ -496,7 +521,7 @@ def test_put_get_delete_replication():
496521
{
497522
'ID': '123',
498523
'Status': 'Enabled',
499-
'Prefix': 'replication',
524+
'Prefix': '中文',
500525
'Destination': {
501526
'Bucket': 'qcs:id/0:cos:cn-south:appid/1252448703:replicationsouth'
502527
}
@@ -516,7 +541,7 @@ def test_put_get_delete_replication():
516541
Bucket=test_bucket
517542
)
518543
assert response
519-
# delete lifecycle
544+
# delete replication
520545
response = client.delete_bucket_replication(
521546
Bucket=test_bucket
522547
)
@@ -564,7 +589,10 @@ def test_list_multipart_uploads():
564589
def test_upload_file_multithreading():
565590
"""根据文件大小自动选择分块大小,多线程并发上传提高上传速度"""
566591
file_name = "thread_1GB"
567-
gen_file(file_name, 5) # set 5MB beacuse travis too slow
592+
file_size = 1024
593+
if TRAVIS_FLAG == 'true':
594+
file_size = 5 # set 5MB beacuse travis too slow
595+
gen_file(file_name, file_size)
568596
st = time.time() # 记录开始时间
569597
response = client.upload_file(
570598
Bucket=test_bucket,
@@ -577,7 +605,7 @@ def test_upload_file_multithreading():
577605
ed = time.time() # 记录结束时间
578606
if os.path.exists(file_name):
579607
os.remove(file_name)
580-
print ed - st
608+
print (ed - st)
581609

582610

583611
def test_copy_file_automatically():
@@ -625,7 +653,8 @@ def test_use_get_auth():
625653
Key='test.txt',
626654
Params={'acl': '', 'unsed': '123'}
627655
)
628-
response = requests.get('http://test01-1252448703.cos.ap-beijing-1.myqcloud.com/test.txt?acl&unsed=123', headers={'Authorization': auth})
656+
url = 'http://' + test_bucket + '.cos.ap-beijing-1.myqcloud.com/test.txt?acl&unsed=123'
657+
response = requests.get(url, headers={'Authorization': auth})
629658
assert response.status_code == 200
630659

631660

@@ -663,16 +692,15 @@ def test_put_get_bucket_logging():
663692
response = logging_client.get_bucket_logging(
664693
Bucket=logging_bucket
665694
)
666-
print response
695+
print (response)
667696
assert response['LoggingEnabled']['TargetBucket'] == logging_bucket
668697
assert response['LoggingEnabled']['TargetPrefix'] == 'test'
669698

670699

671700
def test_put_object_enable_md5():
672701
"""上传文件,SDK计算content-md5头部"""
673-
file_size = 10
674702
file_name = 'test_object_sdk_caculate_md5.file'
675-
gen_file(file_name, 10)
703+
gen_file(file_name, 1)
676704
with open(file_name, 'rb') as f:
677705
etag = get_raw_md5(f.read())
678706
with open(file_name, 'rb') as fp:
@@ -703,6 +731,10 @@ def test_put_object_from_local_file():
703731
Key=file_name
704732
)
705733
assert put_response['ETag'] == etag
734+
response = client.delete_object(
735+
Bucket=test_bucket,
736+
Key=file_name
737+
)
706738
if os.path.exists(file_name):
707739
os.remove(file_name)
708740

0 commit comments

Comments
 (0)