def test_get_logging(self, do_request):
        request_text = """GET /?logging= HTTP/1.1
Host: ming-oss-share.oss-cn-hangzhou.aliyuncs.com
Accept-Encoding: identity
Connection: keep-alive
date: Sat, 12 Dec 2015 00:35:45 GMT
User-Agent: aliyun-sdk-python/2.0.2(Windows/7/;3.3.3)
Accept: */*
authorization: OSS ZCDmm7TPZKHtx77j:9J42bjaM3bgBuP0l/79K64DccZ0="""

        response_text = """HTTP/1.1 200 OK
Server: AliyunOSS
Date: Sat, 12 Dec 2015 00:35:43 GMT
Content-Type: application/xml
Content-Length: 214
Connection: keep-alive
x-oss-request-id: 566B6BDFD5A340D61A739420

<?xml version="1.0" encoding="UTF-8"?>
<BucketLoggingStatus>
  <LoggingEnabled>
    <TargetBucket>ming-xxx-share</TargetBucket>
    <TargetPrefix>{0}</TargetPrefix>
  </LoggingEnabled>
</BucketLoggingStatus>"""

        for prefix in [u"日志%+/*", "logging/", "日志%+/*"]:
            req_info = mock_response(do_request, response_text.format(to_string(prefix)))
            result = bucket().get_bucket_logging()

            self.assertRequest(req_info, request_text)
            self.assertEqual(result.target_bucket, "ming-xxx-share")
            self.assertEqual(result.target_prefix, to_string(prefix))
    def test_put_website(self, do_request):
        request_text = """PUT /?website= HTTP/1.1
Host: ming-oss-share.oss-cn-hangzhou.aliyuncs.com
Accept-Encoding: identity
Connection: keep-alive
Content-Length: 155
date: Sat, 12 Dec 2015 00:35:47 GMT
User-Agent: aliyun-sdk-python/2.0.2(Windows/7/;3.3.3)
Accept: */*
authorization: OSS ZCDmm7TPZKHtx77j:ZUVg/fNrUVyan0Y5xhz5zvcPZcs=

<WebsiteConfiguration><IndexDocument><Suffix>{0}</Suffix></IndexDocument><ErrorDocument><Key>{1}</Key></ErrorDocument></WebsiteConfiguration>"""

        response_text = """HTTP/1.1 200 OK
Server: AliyunOSS
Date: Sat, 12 Dec 2015 00:35:47 GMT
Content-Length: 0
Connection: keep-alive
x-oss-request-id: 566B6BE31BA604C27DD429E8"""

        for index, error in [("index+中文.html", "error.中文"), (u"中-+()文.index", u"@#$%中文.error")]:
            req_info = mock_response(do_request, response_text)
            bucket().put_bucket_website(oss2.models.BucketWebsite(index, error))

            self.assertRequest(req_info, request_text.format(to_string(index), to_string(error)))
    def test_get_website(self, do_request):
        template = '<WebsiteConfiguration><IndexDocument><Suffix>{0}</Suffix></IndexDocument>' + \
            '<ErrorDocument><Key>{1}</Key></ErrorDocument></WebsiteConfiguration>'

        for index, error in [('index+中文.html', 'error.中文') ,(u'中-+()文.index', u'@#$%中文.error')]:
            do_request.return_value = r4get_meta(template.format(to_string(index), to_string(error)))

            result = bucket().get_bucket_website()
            self.assertEqual(result.index_file, to_string(index))
            self.assertEqual(result.error_file, to_string(error))
    def test_referer(self):
        referers = ['http://hello.com', 'mibrowser:home', '中文+referer', u'中文+referer']
        config = oss2.models.BucketReferer(True, referers)

        self.bucket.put_bucket_referer(config)
        wait_meta_sync()

        result = self.bucket.get_bucket_referer()

        self.assertTrue(result.allow_empty_referer)
        self.assertEqual(sorted(to_string(r) for r in referers), sorted(to_string(r) for r in result.referers))
    def test_put_website(self, do_request):
        req_info = RequestInfo()

        do_request.auto_spec = True
        do_request.side_effect = partial(do4put, req_info=req_info, data_type=DT_BYTES)

        template = '<WebsiteConfiguration><IndexDocument><Suffix>{0}</Suffix></IndexDocument>' + \
            '<ErrorDocument><Key>{1}</Key></ErrorDocument></WebsiteConfiguration>'

        for index, error in [('index+中文.html', 'error.中文') ,(u'中-+()文.index', u'@#$%中文.error')]:
            bucket().put_bucket_website(oss2.models.BucketWebsite(index, error))
            self.assertXmlEqual(req_info.data, template.format(to_string(index), to_string(error)))
    def test_get_website(self, do_request):
        template = (
            "<WebsiteConfiguration><IndexDocument><Suffix>{0}</Suffix></IndexDocument>"
            + "<ErrorDocument><Key>{1}</Key></ErrorDocument></WebsiteConfiguration>"
        )

        for index, error in [("index+中文.html", "error.中文"), (u"中-+()文.index", u"@#$%中文.error")]:
            do_request.return_value = r4get_meta(template.format(to_string(index), to_string(error)))

            result = bucket().get_bucket_website()
            self.assertEqual(result.index_file, to_string(index))
            self.assertEqual(result.error_file, to_string(error))
    def test_get_to_file_with_query_parameter(self, do_request):
        content = random_bytes(1023)

        request_text = '''GET /sjbhlsgsbecvlpbf?response-content-type=override-content-type HTTP/1.1
Host: ming-oss-share.oss-cn-hangzhou.aliyuncs.com
Accept-Encoding: identity
Connection: keep-alive
date: Sat, 12 Dec 2015 00:35:53 GMT
User-Agent: aliyun-sdk-python/2.0.2(Windows/7/;3.3.3)
Accept: */*
authorization: OSS ZCDmm7TPZKHtx77j:PAedG7U86ZxQ2WTB+GdpSltoiTI='''

        response_text = '''HTTP/1.1 200 OK
Server: AliyunOSS
Date: Sat, 12 Dec 2015 00:35:53 GMT
Content-Type: override-content-type
Content-Length: {0}
Connection: keep-alive
x-oss-request-id: 566B6BE93A7B8CFD53D4BAA3
Accept-Ranges: bytes
ETag: "D80CF0E5BE2436514894D64B2BCFB2AE"
Last-Modified: Sat, 12 Dec 2015 00:35:53 GMT
x-oss-object-type: Normal

{1}'''.format(len(content), to_string(content))

        req_info = mock_response(do_request, response_text)

        filename = self.tempname()
        query_params = {'response-content-type': 'override-content-type'}

        result = bucket().get_object_to_file('sjbhlsgsbecvlpbf', filename, params=query_params)

        self.assertRequest(req_info, request_text)
        self.assertEqual(result.content_type, 'override-content-type')
    def test_xml_input_output(self):
        xml_input1 = """<?xml version="1.0" encoding="UTF-8"?>
                        <RefererConfiguration>
                          <AllowEmptyReferer>true</AllowEmptyReferer>
                          <RefererList>
                             <Referer>阿里云</Referer>
                          </RefererList>
                        </RefererConfiguration>"""
        xml_input2 = u"""<?xml version="1.0" encoding="UTF-8"?>
                         <RefererConfiguration>
                           <AllowEmptyReferer>true</AllowEmptyReferer>
                           <RefererList>
                             <Referer>阿里云</Referer>
                           </RefererList>
                         </RefererConfiguration>"""

        for input in [xml_input1, xml_input2]:
            self.bucket.put_bucket_referer(input)
            time.sleep(1)

            resp = self.bucket._get_bucket_config(oss2.Bucket.REFERER)
            result = oss2.models.GetBucketRefererResult(resp)
            oss2.xml_utils.parse_get_bucket_referer(result, resp.read())

            self.assertEqual(result.allow_empty_referer, True)
            self.assertEqual(result.referers[0], to_string(u"阿里云"))
def make_get_object(content):
        request_text = '''GET /sjbhlsgsbecvlpbf HTTP/1.1
Host: ming-oss-share.oss-cn-hangzhou.aliyuncs.com
Accept-Encoding: identity
Connection: keep-alive
date: Sat, 12 Dec 2015 00:35:53 GMT
User-Agent: aliyun-sdk-python/2.0.2(Windows/7/;3.3.3)
Accept: */*
authorization: OSS ZCDmm7TPZKHtx77j:PAedG7U86ZxQ2WTB+GdpSltoiTI='''

        response_text = '''HTTP/1.1 200 OK
Server: AliyunOSS
Date: Sat, 12 Dec 2015 00:35:53 GMT
Content-Type: text/plain
Content-Length: {0}
Connection: keep-alive
x-oss-request-id: 566B6BE93A7B8CFD53D4BAA3
Accept-Ranges: bytes
ETag: "D80CF0E5BE2436514894D64B2BCFB2AE"
Last-Modified: Sat, 12 Dec 2015 00:35:53 GMT
x-oss-object-type: Normal

{1}'''.format(len(content), to_string(content))

        return request_text, response_text
    def test_upload_part(self, do_request):
        content = random_bytes(1024)

        request_text = '''PUT /tmmzgvvmsgesihfo?partNumber=3&uploadId=41337E94168A4E6F918C3D6CAAFADCCD HTTP/1.1
Host: ming-oss-share.oss-cn-hangzhou.aliyuncs.com
Accept-Encoding: identity
Connection: keep-alive
Content-Length: 1024
date: Sat, 12 Dec 2015 00:35:59 GMT
User-Agent: aliyun-sdk-python/2.0.2(Windows/7/;3.3.3)
Accept: */*
authorization: OSS ZCDmm7TPZKHtx77j:3+h0rLBaA3gPrM4iZoFSyQZn2ts=

{0}'''.format(oss2.to_string(content))

        response_text = '''HTTP/1.1 200 OK
Server: AliyunOSS
Date: Sat, 12 Dec 2015 00:35:59 GMT
Content-Length: 0
Connection: keep-alive
x-oss-request-id: 566B6BEF6078C0E44874A4AD
ETag: "DF1F9DE8F39BDE03716AC8D425589A5A"'''

        req_info = mock_response(do_request, response_text)
        result = bucket().upload_part('tmmzgvvmsgesihfo', '41337E94168A4E6F918C3D6CAAFADCCD', 3, content)

        self.assertRequest(req_info, request_text)
        self.assertEqual(req_info.data, content)

        self.assertEqual(result.etag, 'DF1F9DE8F39BDE03716AC8D425589A5A')
    def test_put_without_crc_in_response(self, do_request):
        content = b'dummy content'
        request_text = '''PUT /sjbhlsgsbecvlpbf.txt HTTP/1.1
Host: ming-oss-share.oss-cn-hangzhou.aliyuncs.com
Accept-Encoding: identity
Connection: keep-alive
Content-Type: text/plain
Content-Length: {0}
date: Sat, 12 Dec 2015 00:35:53 GMT
User-Agent: aliyun-sdk-python/2.0.2(Windows/7/;3.3.3)
authorization: OSS ZCDmm7TPZKHtx77j:W6whAowN4aImQ0dfbMHyFfD0t1g=
Accept: */*

{1}'''.format(len(content), oss2.to_string(content))
        response_text = '''HTTP/1.1 200 OK
Server: AliyunOSS
Date: Sat, 12 Dec 2015 00:35:53 GMT
Content-Length: 0
Connection: keep-alive
x-oss-request-id: 566B6BE93A7B8CFD53D4BAA3
ETag: "D80CF0E5BE2436514894D64B2BCFB2AE"'''

        req_info = unittests.common.mock_response(do_request, response_text)

        result = unittests.common.bucket().put_object('sjbhlsgsbecvlpbf.txt', content)

        self.assertRequest(req_info, request_text)

        self.assertEqual(result.status, 200)
        self.assertEqual(result.request_id, '566B6BE93A7B8CFD53D4BAA3')
        self.assertEqual(result.etag, 'D80CF0E5BE2436514894D64B2BCFB2AE')
    def same_lifecycle(orig_rule, bucket):
        try:
            rules = bucket.get_bucket_lifecycle().rules
        except oss2.exceptions.NoSuchLifecycle:
            return False

        if not rules:
            return False

        rule_got = rules[0]
        if orig_rule.id != rule_got.id:
            return False

        if to_string(orig_rule.prefix) != rule_got.prefix:
            return False

        if orig_rule.status != rule_got.status:
            return False

        if orig_rule.expiration.days != rule_got.expiration.days:
            return False

        if orig_rule.expiration.date != rule_got.expiration.date:
            return False

        return True
    def test_website(self):
        key = self.random_key('/')
        content = random_bytes(32)

        self.bucket.put_object('index.html', content)

        # 设置index页面和error页面
        self.bucket.put_bucket_website(oss2.models.BucketWebsite('index.html', 'error.html'))
        wait_meta_sync()

        def same_website(website, index, error):
            return website.index_file == index and website.error_file == error

        # 验证index页面和error页面
        self.retry_assert(lambda: same_website(self.bucket.get_bucket_website(), 'index.html', 'error.html'))

        # 验证读取目录会重定向到index页面
        result = self.bucket.get_object(key)
        self.assertEqual(result.read(), content)

        self.bucket.delete_object('index.html')

        # 中文
        for index, error in [('index+中文.html', 'error.中文'), (u'index+中文.html', u'error.中文')]:
            self.bucket.put_bucket_website(oss2.models.BucketWebsite(index, error))
            self.retry_assert(lambda: same_website(self.bucket.get_bucket_website(), to_string(index), to_string(error)))

        # 关闭静态网站托管模式
        self.bucket.delete_bucket_website()
        self.bucket.delete_bucket_website()

        self.assertRaises(oss2.exceptions.NoSuchWebsite, self.bucket.get_bucket_website)
    def test_lifecycle_days(self):
        from oss2.models import LifecycleExpiration, LifecycleRule, BucketLifecycle

        for prefix in ["", "中文前缀+/", u"中文前缀+/"]:
            rule = LifecycleRule(
                random_string(10), prefix, status=LifecycleRule.DISABLED, expiration=LifecycleExpiration(days=356)
            )
            lifecycle = BucketLifecycle([rule])

            self.bucket.put_bucket_lifecycle(lifecycle)
            time.sleep(1)

            rule_got = self.bucket.get_bucket_lifecycle().rules[0]

            self.assertEqual(rule.id, rule_got.id)
            self.assertEqual(to_string(rule.prefix), rule_got.prefix)
            self.assertEqual(rule.status, rule_got.status)

            self.assertEqual(rule_got.expiration.days, 356)
            self.assertEqual(rule_got.expiration.date, None)

        self.bucket.delete_bucket_lifecycle()
        self.bucket.delete_bucket_lifecycle()

        self.assertRaises(oss2.exceptions.NoSuchLifecycle, self.bucket.get_bucket_lifecycle)
    def test_append_without_crc_in_response(self, do_request):
        size = 8192
        position = 0
        content = unittests.common.random_bytes(size)
        request_text = '''POST /sjbhlsgsbecvlpbf?position={0}&append= HTTP/1.1
Host: ming-oss-share.oss-cn-hangzhou.aliyuncs.com
Accept-Encoding: identity
Connection: keep-alive
Content-Length: {1}
date: Sat, 12 Dec 2015 00:36:29 GMT
User-Agent: aliyun-sdk-python/2.0.2(Windows/7/;3.3.3)
Accept: */*
authorization: OSS ZCDmm7TPZKHtx77j:1njpxsTivMNvTdfYolCUefRInVY=

{2}'''.format(position, len(content), oss2.to_string(content))

        response_text = '''HTTP/1.1 200 OK
Server: AliyunOSS
Date: Sat, 12 Dec 2015 00:36:29 GMT
Content-Length: 0
Connection: keep-alive
x-oss-request-id: 566B6C0D1790CF586F72240B
ETag: "24F7FA10676D816E0D6C6B5600000000"
x-oss-next-append-position: {0}'''.format(position + len(content), unittests.common.calc_crc(content))
        
        req_info = unittests.common.mock_response(do_request, response_text)

        result = unittests.common.bucket().append_object('sjbhlsgsbecvlpbf', position, content, init_crc=0)

        self.assertRequest(req_info, request_text)
        self.assertEqual(result.status, 200)
        self.assertEqual(result.next_position, size)
        self.assertEqual(result.etag, '24F7FA10676D816E0D6C6B5600000000')
    def test_get_logging(self, do_request):
        target_bucket_name = 'fake-bucket'

        template = '''<?xml version="1.0" encoding="UTF-8"?>
        <BucketLoggingStatus>
            <LoggingEnabled>
                <TargetBucket>fake-bucket</TargetBucket>
                <TargetPrefix>{0}</TargetPrefix>
            </LoggingEnabled>
        </BucketLoggingStatus>'''

        for prefix in [u'日志%+/*', 'logging/', '日志%+/*']:
            do_request.return_value = r4get_meta(template.format(to_string(prefix)))
            result = bucket().get_bucket_logging()

            self.assertEqual(result.target_bucket, target_bucket_name)
            self.assertEqual(result.target_prefix, to_string(prefix))
    def test_batch_delete_objects(self):
        for key in ['中文!@#$%^&*()-=文件\x0C-2.txt', u'中文!@#$%^&*()-=文件\x0C-3.txt', '<hello>']:
            content = '中文内容'

            self.bucket.put_object(key, content)
            result = self.bucket.batch_delete_objects([key])
            self.assertEqual(result.deleted_keys[0], to_string(key))

            self.assertTrue(not self.bucket.object_exists(key))
    def test_put_get_list_delete(self):
        for key in ['中文!@#$%^&*()-=文件\x0C-1.txt', u'中文!@#$%^&*()-=文件\x0C-1.txt']:
            content = '中文内容'

            self.bucket.put_object(key, content)
            self.assertEqual(self.bucket.get_object(key).read(), to_bytes(content))

            self.assertTrue(to_string(key) in list(info.key for info in oss2.ObjectIterator(self.bucket, prefix='中文')))

            self.bucket.delete_object(key)
    def test_referer(self):
        referers = ["http://hello.com", "mibrowser:home", "中文+referer", u"中文+referer"]
        config = oss2.models.BucketReferer(True, referers)

        self.bucket.put_bucket_referer(config)
        time.sleep(1)

        result = self.bucket.get_bucket_referer()

        self.assertTrue(result.allow_empty_referer)
        self.assertEqual(sorted(to_string(r) for r in referers), sorted(result.referers))
    def test_put_logging(self, do_request):
        req_info = RequestInfo()

        do_request.auto_spec = True
        do_request.side_effect = partial(do4put, req_info=req_info, data_type=DT_BYTES)

        template = '<BucketLoggingStatus><LoggingEnabled><TargetBucket>fake-bucket</TargetBucket>' + \
                   '<TargetPrefix>{0}</TargetPrefix></LoggingEnabled></BucketLoggingStatus>'

        target_bucket_name = 'fake-bucket'
        for prefix in [u'日志+/', 'logging/', '日志+/']:
            bucket().put_bucket_logging(oss2.models.BucketLogging(target_bucket_name, prefix))
            self.assertXmlEqual(req_info.data, template.format(to_string(prefix)))
    def test_get_website(self, do_request):
        request_text = """GET /?website= HTTP/1.1
Host: ming-oss-share.oss-cn-hangzhou.aliyuncs.com
Accept-Encoding: identity
Connection: keep-alive
date: Sat, 12 Dec 2015 00:35:48 GMT
User-Agent: aliyun-sdk-python/2.0.2(Windows/7/;3.3.3)
Accept: */*
authorization: OSS ZCDmm7TPZKHtx77j:gTNIEjVmU76CwrhC2HftAaHcwBw="""

        response_text = """HTTP/1.1 200 OK
Server: AliyunOSS
Date: Sat, 12 Dec 2015 00:35:49 GMT
Content-Type: application/xml
Content-Length: 218
Connection: keep-alive
x-oss-request-id: 566B6BE5FFDB697977D52407

<?xml version="1.0" encoding="UTF-8"?>
<WebsiteConfiguration>
  <IndexDocument>
    <Suffix>{0}</Suffix>
  </IndexDocument>
  <ErrorDocument>
    <Key>{1}</Key>
  </ErrorDocument>
</WebsiteConfiguration>"""

        for index, error in [("index+中文.html", "error.中文"), (u"中-+()文.index", u"@#$%中文.error")]:
            req_info = mock_response(do_request, response_text.format(to_string(index), to_string(error)))

            result = bucket().get_bucket_website()

            self.assertRequest(req_info, request_text)

            self.assertEqual(result.index_file, to_string(index))
            self.assertEqual(result.error_file, to_string(error))
    def test_website(self):
        key = self.random_key("/")
        content = random_bytes(32)

        self.bucket.put_object("index.html", content)

        # 设置index页面和error页面
        self.bucket.put_bucket_website(oss2.models.BucketWebsite("index.html", "error.html"))
        time.sleep(1)

        # 验证index页面和error页面
        website = self.bucket.get_bucket_website()
        self.assertEqual(website.index_file, "index.html")
        self.assertEqual(website.error_file, "error.html")

        # 验证读取目录会重定向到index页面
        result = self.bucket.get_object(key)
        self.assertEqual(result.read(), content)

        self.bucket.delete_object("index.html")

        # 中文
        for index, error in [("index+中文.html", "error.中文"), (u"index+中文.html", u"error.中文")]:
            self.bucket.put_bucket_website(oss2.models.BucketWebsite(index, error))
            time.sleep(1)

            website = self.bucket.get_bucket_website()
            self.assertEqual(website.index_file, to_string(index))
            self.assertEqual(website.error_file, to_string(error))

        # 关闭静态网站托管模式
        self.bucket.delete_bucket_website()
        self.bucket.delete_bucket_website()

        # 再次关闭报错
        self.assertRaises(oss2.exceptions.NoSuchWebsite, self.bucket.get_bucket_website)
    def test_compat(self):
        # from unicode
        u = u'中文'

        self.assertEqual(u, oss2.to_unicode(u))
        self.assertEqual(u.encode('utf-8'), oss2.to_bytes(u))

        if is_py2:
            self.assertEqual(u.encode('utf-8'), oss2.to_string(u))

        if is_py3:
            self.assertEqual(u, oss2.to_string(u))

        # from bytes
        b = u.encode('utf-8')

        self.assertEqual(b.decode('utf-8'), oss2.to_unicode(b))
        self.assertEqual(b, oss2.to_bytes(b))

        if is_py2:
            self.assertEqual(b, oss2.to_string(b))

        if is_py3:
            self.assertEqual(b.decode('utf-8'), oss2.to_string(b))
Exemple #24
0
    def test_put_logging(self, do_request):
        req_info = RequestInfo()

        do_request.auto_spec = True
        do_request.side_effect = partial(do4put,
                                         req_info=req_info,
                                         data_type=DT_BYTES)

        template = '<BucketLoggingStatus><LoggingEnabled><TargetBucket>fake-bucket</TargetBucket>' + \
                   '<TargetPrefix>{0}</TargetPrefix></LoggingEnabled></BucketLoggingStatus>'

        target_bucket_name = 'fake-bucket'
        for prefix in [u'日志+/', 'logging/', '日志+/']:
            bucket().put_bucket_logging(
                oss2.models.BucketLogging(target_bucket_name, prefix))
            self.assertXmlEqual(req_info.data,
                                template.format(to_string(prefix)))
    def __init__(self, response_text):

        if isinstance(response_text, bytes):
            fields = re.split(b'\n\n', response_text, 1)
        else:
            fields = re.split('\n\n', response_text, 1)
        head_fields = re.split('\n', oss2.to_string(fields[0]))
        response_line_fields = head_fields[0].split(' ', 2)

        self.status = int(response_line_fields[1])
        self.headers = head_fields_to_headers(head_fields[1:])

        if len(fields) == 2:
            self.body = oss2.to_bytes(fields[1])
        else:
            self.body = b''

        self.__io = io.BytesIO(self.body)
Exemple #26
0
    def __init__(self, response_text):

        if isinstance(response_text, bytes):
            fields = re.split(b'\n\n', response_text, 1)
        else:
            fields = re.split('\n\n', response_text, 1)
        head_fields = re.split('\n', oss2.to_string(fields[0]))
        response_line_fields = head_fields[0].split(' ', 2)

        self.status = int(response_line_fields[1])
        self.headers = head_fields_to_headers(head_fields[1:])

        if len(fields) == 2:
            self.body = oss2.to_bytes(fields[1])
        else:
            self.body = b''

        self.__io = io.BytesIO(self.body)
def make_select_object(sql,
                       resp_content,
                       req_params=None,
                       output_raw=False,
                       simulate_bad_frame=False,
                       simulate_bad_crc=False,
                       status=206,
                       error=b''):
    req_body = xml_utils.to_select_object(sql, req_params)
    request_text = '''POST /select-test.txt?x-oss-process=csv/select HTTP/1.1
Host: ming-oss-share.oss-cn-hangzhou.aliyuncs.com
Accept-Encoding: identity
Connection: keep-alive
Content-Length: {0}
date: Sat, 12 Dec 2015 00:35:53 GMT
User-Agent: aliyun-sdk-python/2.0.2(Windows/7/;3.3.3)
authorization: OSS ZCDmm7TPZKHtx77j:W6whAowN4aImQ0dfbMHyFfD0t1g=
Accept: */*

{1}'''.format(len(req_body), to_string(req_body))
    resp_body = generate_data(resp_content,
                              output_raw,
                              simulate_bad_crc=simulate_bad_crc,
                              status=status,
                              error=error)
    if (simulate_bad_frame):
        resp_body = resp_content

    response_text = '''HTTP/1.1 206 OK
Server: AliyunOSS
Date: Sat, 12 Dec 2015 00:35:53 GMT
Content-Length: {0}
Connection: keep-alive
x-oss-request-id: 566B6BE93A7B8CFD53D4BAA3
ETag: "D80CF0E5BE2436514894D64B2BCFB2AE"
x-oss-select-output-raw:{1}

'''.format(len(resp_body),
           str(output_raw).lower())

    if (sys.version_info[0] == 3 and type(resp_body).__name__ == 'str'):
        resp_body = str.encode(resp_body)

    return request_text, str.encode(response_text) + resp_body
def generate_data(resp_content,
                  output_raw,
                  error=b'',
                  status=206,
                  simulate_bad_crc=False):
    if output_raw:
        return to_string(resp_content)
    else:
        continiousFrame = ContiniousFrame(100)
        dataFrame = DataFrame(len(resp_content), resp_content)
        frameStr = dataFrame.to_bytes()
        if (simulate_bad_crc):
            frameStr = frameStr[
                0:len(frameStr) -
                2] + b'X'  # 'X' is the character that does not exist in the content

        endFrame = EndFrame(len(resp_content), len(resp_content), status,
                            error)

        return continiousFrame.to_bytes() + frameStr + endFrame.to_bytes()
    def test_logging(self):
        other_bucket = oss2.Bucket(self.bucket.auth, OSS_ENDPOINT, random_string(63).lower())
        other_bucket.create_bucket(oss2.BUCKET_ACL_PRIVATE)

        for prefix in ["logging/", u"日志+/", "日志+/"]:
            other_bucket.put_bucket_logging(oss2.models.BucketLogging(self.bucket.bucket_name, prefix))
            time.sleep(1)

            result = other_bucket.get_bucket_logging()
            self.assertEqual(result.target_bucket, self.bucket.bucket_name)
            self.assertEqual(result.target_prefix, to_string(prefix))

        other_bucket.delete_bucket_logging()
        other_bucket.delete_bucket_logging()

        result = other_bucket.get_bucket_logging()
        self.assertEqual(result.target_bucket, "")
        self.assertEqual(result.target_prefix, "")

        other_bucket.delete_bucket()
    def test_batch_delete(self, do_request):
        request_text = '''POST /?delete=&encoding-type=url HTTP/1.1
Host: ming-oss-share.oss-cn-hangzhou.aliyuncs.com
Accept-Encoding: identity
Connection: keep-alive
Content-Length: 100
Content-MD5: zsbG45tEj+StFBFghUllvw==
date: Sat, 12 Dec 2015 00:35:53 GMT
User-Agent: aliyun-sdk-python/2.0.2(Windows/7/;3.3.3)
Accept: */*
authorization: OSS ZCDmm7TPZKHtx77j:tc4g/qgaHwQ+CoI828v2zFCHj2E=

<Delete><Quiet>false</Quiet><Object><Key>hello</Key></Object><Object><Key>world</Key></Object></Delete>'''

        response_text = '''HTTP/1.1 200 OK
Server: AliyunOSS
Date: Sat, 12 Dec 2015 00:35:53 GMT
Content-Type: application/xml
Content-Length: 383
Connection: keep-alive
x-oss-request-id: 566B6BE9229E6BA1F6F538DE

<?xml version="1.0" encoding="UTF-8"?>
<DeleteResult>
<EncodingType>url</EncodingType>
<Deleted>
    <Key>hello</Key>
</Deleted>
<Deleted>
    <Key>world</Key>
</Deleted>
</DeleteResult>'''
        req_info = mock_response(do_request, response_text)

        key_list = ['hello', 'world']

        result = bucket().batch_delete_objects(key_list)

        self.assertRequest(req_info, request_text)
        self.assertEqual(result.deleted_keys,
                         list(to_string(key) for key in key_list))
    def test_logging(self):
        other_bucket = oss2.Bucket(self.bucket.auth, OSS_ENDPOINT, random_string(63).lower())
        other_bucket.create_bucket(oss2.BUCKET_ACL_PRIVATE)

        def same_logging(bucket_logging, target_bucket, target_prefix):
            return bucket_logging.target_bucket == target_bucket and bucket_logging.target_prefix == target_prefix

        for prefix in [u'日志+/', 'logging/', '日志+/']:
            other_bucket.put_bucket_logging(oss2.models.BucketLogging(self.bucket.bucket_name, prefix))
            wait_meta_sync()

            self.retry_assert(lambda: same_logging(other_bucket.get_bucket_logging(),
                                                   self.bucket.bucket_name,
                                                   to_string(prefix)))

        other_bucket.delete_bucket_logging()
        other_bucket.delete_bucket_logging()

        self.retry_assert(lambda: same_logging(other_bucket.get_bucket_logging(), '', ''))

        other_bucket.delete_bucket()
    def test_logging(self):
        other_bucket = oss2.Bucket(self.bucket.auth, OSS_ENDPOINT, random_string(63).lower())
        other_bucket.create_bucket(oss2.BUCKET_ACL_PRIVATE)

        def same_logging(bucket_logging, target_bucket, target_prefix):
            return bucket_logging.target_bucket == target_bucket and bucket_logging.target_prefix == target_prefix

        for prefix in [u'日志+/', 'logging/', '日志+/']:
            other_bucket.put_bucket_logging(oss2.models.BucketLogging(self.bucket.bucket_name, prefix))
            wait_meta_sync()

            self.retry_assert(lambda: same_logging(other_bucket.get_bucket_logging(),
                                                   self.bucket.bucket_name,
                                                   to_string(prefix)))

        other_bucket.delete_bucket_logging()
        other_bucket.delete_bucket_logging()

        self.retry_assert(lambda: same_logging(other_bucket.get_bucket_logging(), '', ''))

        other_bucket.delete_bucket()
    def test_batch_delete(self, do_request):
        request_text = '''POST /?delete=&encoding-type=url HTTP/1.1
Host: ming-oss-share.oss-cn-hangzhou.aliyuncs.com
Accept-Encoding: identity
Connection: keep-alive
Content-Length: 100
Content-MD5: zsbG45tEj+StFBFghUllvw==
date: Sat, 12 Dec 2015 00:35:53 GMT
User-Agent: aliyun-sdk-python/2.0.2(Windows/7/;3.3.3)
Accept: */*
authorization: OSS ZCDmm7TPZKHtx77j:tc4g/qgaHwQ+CoI828v2zFCHj2E=

<Delete><Quiet>false</Quiet><Object><Key>hello</Key></Object><Object><Key>world</Key></Object></Delete>'''

        response_text = '''HTTP/1.1 200 OK
Server: AliyunOSS
Date: Sat, 12 Dec 2015 00:35:53 GMT
Content-Type: application/xml
Content-Length: 383
Connection: keep-alive
x-oss-request-id: 566B6BE9229E6BA1F6F538DE

<?xml version="1.0" encoding="UTF-8"?>
<DeleteResult>
<EncodingType>url</EncodingType>
<Deleted>
    <Key>hello</Key>
</Deleted>
<Deleted>
    <Key>world</Key>
</Deleted>
</DeleteResult>'''
        req_info = mock_response(do_request, response_text)

        key_list = ['hello', 'world']

        result = bucket().batch_delete_objects(key_list)

        self.assertRequest(req_info, request_text)
        self.assertEqual(result.deleted_keys, list(to_string(key) for key in key_list))
    def __init__(self, request_text):
        if isinstance(request_text, bytes):
            fields = re.split(b'\n\n', request_text, 1)
        else:
            fields = re.split('\n\n', request_text, 1)
        head_fields = re.split('\n', oss2.to_string(fields[0]))
        request_line_fields = head_fields[0].split()

        uri_query_fields = request_line_fields[1].split('?')
        if len(uri_query_fields) == 2:
            self.params = query_to_params(uri_query_fields[1])
        else:
            self.params = {}

        if len(fields) == 2:
            self.body = oss2.to_bytes(fields[1])
        else:
            self.body = b''

        self.method = request_line_fields[0]
        self.headers = head_fields_to_headers(head_fields[1:])
        self.url = 'http://' + self.headers['host'] + uri_query_fields[0]
Exemple #35
0
    def __init__(self, request_text):
        if isinstance(request_text, bytes):
            fields = re.split(b'\n\n', request_text, 1)
        else:
            fields = re.split('\n\n', request_text, 1)
        head_fields = re.split('\n', oss2.to_string(fields[0]))
        request_line_fields = head_fields[0].split()

        uri_query_fields = request_line_fields[1].split('?')
        if len(uri_query_fields) == 2:
            self.params = query_to_params(uri_query_fields[1])
        else:
            self.params = {}

        if len(fields) == 2:
            self.body = oss2.to_bytes(fields[1])
        else:
            self.body = b''

        self.method = request_line_fields[0]
        self.headers = head_fields_to_headers(head_fields[1:])
        self.url = 'http://' + self.headers['host'] + uri_query_fields[0]
Exemple #36
0
def make_put_object(content):
    request_text = '''PUT /sjbhlsgsbecvlpbf.txt HTTP/1.1
Host: ming-oss-share.oss-cn-hangzhou.aliyuncs.com
Accept-Encoding: identity
Connection: keep-alive
Content-Type: text/plain
Content-Length: {0}
date: Sat, 12 Dec 2015 00:35:53 GMT
User-Agent: aliyun-sdk-python/2.0.2(Windows/7/;3.3.3)
authorization: OSS ZCDmm7TPZKHtx77j:W6whAowN4aImQ0dfbMHyFfD0t1g=
Accept: */*

{1}'''.format(len(content), to_string(content))

    response_text = '''HTTP/1.1 200 OK
Server: AliyunOSS
Date: Sat, 12 Dec 2015 00:35:53 GMT
Content-Length: 0
Connection: keep-alive
x-oss-request-id: 566B6BE93A7B8CFD53D4BAA3
ETag: "D80CF0E5BE2436514894D64B2BCFB2AE"'''

    return request_text, response_text
    def test_batch_delete(self, do_request):
        body = '''<?xml version="1.0" encoding="UTF-8"?>
        <DeleteResult>
        <EncodingType>url</EncodingType>
        <Deleted>
            <Key>%E4%B8%AD%E6%96%87%21%40%23%24%25%5E%26%2A%28%29-%3D%E6%96%87%E4%BB%B6%0C-2.txt</Key>
        </Deleted>
        <Deleted>
            <Key>%E4%B8%AD%E6%96%87%21%40%23%24%25%5E%26%2A%28%29-%3D%E6%96%87%E4%BB%B6%0C-3.txt</Key>
        </Deleted>
        <Deleted>
            <Key>%3Chello%3E</Key>
        </Deleted>
        </DeleteResult>
        '''

        do_request.auto_spec = True
        do_request.side_effect = partial(do4body, body=body, content_type='application/xml')

        key_list = ['中文!@#$%^&*()-=文件\x0C-2.txt', u'中文!@#$%^&*()-=文件\x0C-3.txt', '<hello>']

        result = bucket().batch_delete_objects(key_list)
        self.assertEqual(result.deleted_keys, list(to_string(key) for key in key_list))
def make_put_object(content):
    request_text = '''PUT /sjbhlsgsbecvlpbf.txt HTTP/1.1
Host: ming-oss-share.oss-cn-hangzhou.aliyuncs.com
Accept-Encoding: identity
Connection: keep-alive
Content-Type: text/plain
Content-Length: {0}
date: Sat, 12 Dec 2015 00:35:53 GMT
User-Agent: aliyun-sdk-python/2.0.2(Windows/7/;3.3.3)
authorization: OSS ZCDmm7TPZKHtx77j:W6whAowN4aImQ0dfbMHyFfD0t1g=
Accept: */*

{1}'''.format(len(content), to_string(content))

    response_text = '''HTTP/1.1 200 OK
Server: AliyunOSS
Date: Sat, 12 Dec 2015 00:35:53 GMT
Content-Length: 0
Connection: keep-alive
x-oss-request-id: 566B6BE93A7B8CFD53D4BAA3
ETag: "D80CF0E5BE2436514894D64B2BCFB2AE"'''

    return request_text, response_text
    def test_append_without_crc_in_response(self, do_request):
        size = 8192
        position = 0
        content = unittests.common.random_bytes(size)
        request_text = '''POST /sjbhlsgsbecvlpbf?position={0}&append= HTTP/1.1
Host: ming-oss-share.oss-cn-hangzhou.aliyuncs.com
Accept-Encoding: identity
Connection: keep-alive
Content-Length: {1}
date: Sat, 12 Dec 2015 00:36:29 GMT
User-Agent: aliyun-sdk-python/2.0.2(Windows/7/;3.3.3)
Accept: */*
authorization: OSS ZCDmm7TPZKHtx77j:1njpxsTivMNvTdfYolCUefRInVY=

{2}'''.format(position, len(content), oss2.to_string(content))

        response_text = '''HTTP/1.1 200 OK
Server: AliyunOSS
Date: Sat, 12 Dec 2015 00:36:29 GMT
Content-Length: 0
Connection: keep-alive
x-oss-request-id: 566B6C0D1790CF586F72240B
ETag: "24F7FA10676D816E0D6C6B5600000000"
x-oss-next-append-position: {0}'''.format(position + len(content),
                                          unittests.common.calc_crc(content))

        req_info = unittests.common.mock_response(do_request, response_text)

        result = unittests.common.bucket().append_object('sjbhlsgsbecvlpbf',
                                                         position,
                                                         content,
                                                         init_crc=0)

        self.assertRequest(req_info, request_text)
        self.assertEqual(result.status, 200)
        self.assertEqual(result.next_position, size)
        self.assertEqual(result.etag, '24F7FA10676D816E0D6C6B5600000000')
    def test_get_to_file_with_query_parameter(self, do_request):
        content = random_bytes(1023)

        request_text = '''GET /sjbhlsgsbecvlpbf?response-content-type=override-content-type HTTP/1.1
Host: ming-oss-share.oss-cn-hangzhou.aliyuncs.com
Accept-Encoding: identity
Connection: keep-alive
date: Sat, 12 Dec 2015 00:35:53 GMT
User-Agent: aliyun-sdk-python/2.0.2(Windows/7/;3.3.3)
Accept: */*
authorization: OSS ZCDmm7TPZKHtx77j:PAedG7U86ZxQ2WTB+GdpSltoiTI='''

        response_text = '''HTTP/1.1 200 OK
Server: AliyunOSS
Date: Sat, 12 Dec 2015 00:35:53 GMT
Content-Type: override-content-type
Content-Length: {0}
Connection: keep-alive
x-oss-request-id: 566B6BE93A7B8CFD53D4BAA3
Accept-Ranges: bytes
ETag: "D80CF0E5BE2436514894D64B2BCFB2AE"
Last-Modified: Sat, 12 Dec 2015 00:35:53 GMT
x-oss-object-type: Normal

{1}'''.format(len(content), to_string(content))

        req_info = mock_response(do_request, response_text)

        filename = self.tempname()
        query_params = {'response-content-type': 'override-content-type'}

        result = bucket().get_object_to_file('sjbhlsgsbecvlpbf',
                                             filename,
                                             params=query_params)

        self.assertRequest(req_info, request_text)
        self.assertEqual(result.content_type, 'override-content-type')
def make_append_object(position, content):
    request_text = '''POST /sjbhlsgsbecvlpbf?position={0}&append= HTTP/1.1
Host: ming-oss-share.oss-cn-hangzhou.aliyuncs.com
Accept-Encoding: identity
Connection: keep-alive
Content-Length: {1}
date: Sat, 12 Dec 2015 00:36:29 GMT
User-Agent: aliyun-sdk-python/2.0.2(Windows/7/;3.3.3)
Accept: */*
authorization: OSS ZCDmm7TPZKHtx77j:1njpxsTivMNvTdfYolCUefRInVY=

{2}'''.format(position, len(content), to_string(content))

    response_text = '''HTTP/1.1 200 OK
Server: AliyunOSS
Date: Sat, 12 Dec 2015 00:36:29 GMT
Content-Length: 0
Connection: keep-alive
x-oss-request-id: 566B6C0D1790CF586F72240B
ETag: "24F7FA10676D816E0D6C6B5600000000"
x-oss-next-append-position: {0}
x-oss-hash-crc64ecma: {1}'''.format(position + len(content), calc_crc(content))

    return request_text, response_text
    def test_put_logging(self, do_request):
        request_text = '''PUT /?logging= HTTP/1.1
Host: ming-oss-share.oss-cn-hangzhou.aliyuncs.com
Accept-Encoding: identity
Connection: keep-alive
Content-Length: 156
date: Sat, 12 Dec 2015 00:35:42 GMT
User-Agent: aliyun-sdk-python/2.0.2(Windows/7/;3.3.3)
Accept: */*
authorization: OSS ZCDmm7TPZKHtx77j:uofFeeNDtRu6WY5iUkNwTymtPI4=

<BucketLoggingStatus><LoggingEnabled><TargetBucket>ming-xxx-share</TargetBucket><TargetPrefix>{0}</TargetPrefix></LoggingEnabled></BucketLoggingStatus>'''

        response_text = '''HTTP/1.1 200 OK
Server: AliyunOSS
Date: Sat, 12 Dec 2015 00:35:42 GMT
Content-Length: 0
Connection: keep-alive
x-oss-request-id: 566B6BDED5A340D61A739262'''

        for prefix in [u'日志+/', 'logging/', '日志+/']:
            req_info = unittests.common.mock_response(do_request, response_text)
            unittests.common.bucket().put_bucket_logging(oss2.models.BucketLogging('ming-xxx-share', prefix))
            self.assertRequest(req_info, request_text.format(oss2.to_string(prefix)))
Exemple #43
0
 def test_object_iterator_chinese(self):
     for prefix in [self.random_key('中+文'), self.random_key(u'中+文')]:
         self.bucket.put_object(prefix, b'content of object')
         object_got = list(oss2.ObjectIterator(self.bucket, prefix=prefix, max_keys=1))[0].key
         self.assertEqual(to_string(prefix), object_got)
def all_tags(parent, tag):
    return [oss2.to_string(node.text) or '' for node in parent.findall(tag)]