Skip to content

Commit e1fa35d

Browse files
liyanzhang505huiguangjun
authored andcommitted
refine FileLikeAdapter code
1 parent 9367453 commit e1fa35d

File tree

3 files changed

+93
-3
lines changed

3 files changed

+93
-3
lines changed

oss2/utils.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,12 @@ def next(self):
405405
if self.read_all:
406406
raise StopIteration
407407

408-
return self.read(_CHUNK_SIZE)
408+
content = self.read(_CHUNK_SIZE)
409+
410+
if content:
411+
return content
412+
else:
413+
raise StopIteration
409414

410415
def read(self, amt=None):
411416
offset_start = self.offset
@@ -416,7 +421,6 @@ def read(self, amt=None):
416421
if not content:
417422
self.read_all = True
418423
_invoke_progress_callback(self.progress_callback, self.offset, None)
419-
return to_bytes('')
420424
else:
421425
_invoke_progress_callback(self.progress_callback, self.offset, None)
422426

@@ -433,7 +437,7 @@ def read(self, amt=None):
433437
content = _invoke_cipher_callback(self.cipher_callback, content, real_discard)
434438

435439
self.discard -= real_discard
436-
return content
440+
return content
437441

438442
@property
439443
def crc(self):

tests/test_crypto_object.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
from .common import *
1313
from .test_object import now
14+
from oss2.compat import to_bytes
1415

1516

1617
class TestCryptoObject(OssTestCase):
@@ -346,6 +347,40 @@ def test_crypto_object_incorrect_description(self):
346347
get_result = crypto_bucket_2.get_object(key)
347348
self.assertEqual(get_result.read(), content)
348349

350+
def test_put_object_chunked(self):
351+
class FakeFileObj(object):
352+
def __init__(self, data, size):
353+
self.data = to_bytes(data)
354+
self.offset = 0
355+
self.size = size
356+
357+
def read(self, amt=None):
358+
if self.offset >= self.size:
359+
return to_bytes('')
360+
361+
if amt is None or amt < 0:
362+
bytes_to_read = self.size - self.offset
363+
else:
364+
bytes_to_read = min(amt, self.size - self.offset)
365+
366+
content = self.data[self.offset:self.offset + bytes_to_read]
367+
368+
self.offset += bytes_to_read
369+
370+
return content
371+
372+
object_name = 'test-put-file-like-object-chunked'
373+
374+
count = 1
375+
while count <= 100:
376+
count += 1
377+
cnt = random.randint(count, 1024)
378+
data = FakeFileObj(b'a' * cnt, count)
379+
self.rsa_crypto_bucket.put_object(object_name + str(count) + '.txt', data)
380+
get_result = self.rsa_crypto_bucket.get_object(object_name + str(count) + '.txt')
381+
self.assertEqual(get_result.read(), b'a' * count)
382+
383+
349384
'''
350385
# 测试CryptoBucket类的Copy方法, 并使用"REPLACE"模式修改meta
351386
def test_copy_crypto_object_with_replace_meta(self):

tests/test_put_object_chunked.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# -*- coding: utf-8 -*-
2+
3+
from .common import *
4+
from oss2.compat import to_bytes
5+
6+
7+
class TestPutObjectChunked(OssTestCase):
8+
def test_put_object_chunked(self):
9+
class FakeFileObj(object):
10+
def __init__(self, data, size):
11+
self.data = to_bytes(data)
12+
self.offset = 0
13+
self.size = size
14+
15+
def read(self, amt=None):
16+
if self.offset >= self.size:
17+
return to_bytes('')
18+
19+
if amt is None or amt < 0:
20+
bytes_to_read = self.size - self.offset
21+
else:
22+
bytes_to_read = min(amt, self.size - self.offset)
23+
24+
content = self.data[self.offset:self.offset + bytes_to_read]
25+
26+
self.offset += bytes_to_read
27+
28+
return content
29+
30+
object_name = 'test-put-file-like-object-chunked'
31+
32+
count = 1
33+
while count <= 1500:
34+
try:
35+
count += 1
36+
37+
cnt = random.randint(count, 102400)
38+
data = FakeFileObj(b'a' * cnt, count)
39+
self.bucket.put_object(object_name + str(count) + '.txt', data)
40+
cnt = random.randint(count, 102400)
41+
data = FakeFileObj(b'a' * cnt, cnt)
42+
self.bucket.put_object(object_name + str(count) + '11.txt', data)
43+
except oss2.exceptions.ServerError as e:
44+
if e.code == 'BadRequest':
45+
raise
46+
except Exception:
47+
continue
48+
49+
50+
if __name__ == '__main__':
51+
unittest.main()

0 commit comments

Comments
 (0)