Skip to content

Commit a65b006

Browse files
update 3.25.3
1 parent 852c3cd commit a65b006

File tree

14 files changed

+675
-253
lines changed

14 files changed

+675
-253
lines changed

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
Version 3.25.3
2+
3+
New Features:
4+
5+
1. Added APIs related to CustomDomain, including ObsClient.getBucketCustomDomain,ObsClient.setBucketCustomDomain,ObsClient.deleteBucketCustomDomain.
6+
7+
-------------------------------------------------------------------------------------------------
18
Version 3.24.12
29

310
New Features:

README_CN.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1-
Version 3.24.12
1+
Version 3.25.3
2+
3+
新特性:
4+
5+
1. 支持自定义域名相关接口(ObsClient.getBucketCustomDomain/ObsClient.setBucketCustomDomain/ObsClient.deleteBucketCustomDomain)
6+
7+
-------------------------------------------------------------------------------------------------
8+
Version 3.24.12
29

310
新特性:
411

src/log.conf

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
[LOGCONF]
2+
3+
#Configure log file dir
4+
LogFileDir = ./logs
5+
6+
#Configure log file name
7+
LogFileName = eSDK-OBS-PYTHON.log
8+
9+
#Configure log file size, unit:MB
10+
LogFileSize = 30
11+
12+
#Configure max log file numbers
13+
LogFileNumber = 5
14+
15+
#Configure log level for log file (DEBUG | INFO | WARNING | ERROR)
16+
LogFileLevel = INFO
17+
18+
#Configure whether to print log to console (Yes:1 No:0)
19+
PrintLogToConsole = 0
20+
21+
#Configure log level for console (DEBUG | INFO | WARNING | ERROR)
22+
PrintLogLevel = WARNING

src/obs/__init__.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
from obs.model import TopicConfiguration, FunctionGraphConfiguration, FilterRule, Replication, ReplicationRule
2323
from obs.model import Options, PutObjectHeader, AppendObjectHeader, AppendObjectContent, RedirectAllRequestTo
2424
from obs.model import Redirect, RoutingRule, Tag, TagInfo, Transition, NoncurrentVersionTransition, Rule, Versions, AbortIncompleteMultipartUpload
25-
from obs.model import Object, WebsiteConfiguration, Logging, CompleteMultipartUploadRequest, DeleteObjectsRequest
25+
from obs.model import Object, WebsiteConfiguration, Logging, CompleteMultipartUploadRequest, DeleteObjectsRequest,CustomDomainConfiguration
2626
from obs.model import ListMultipartUploadsRequest, GetObjectRequest, UploadFileHeader, Payer
2727
from obs.model import ExtensionHeader, FetchStatus, BucketAliasModel, ListBucketAliasModel
2828
from obs.workflow import WorkflowClient
@@ -96,5 +96,6 @@
9696
'CTRCipherGenerator',
9797
'CtrRSACipherGenerator',
9898
'BucketAliasModel',
99-
'ListBucketAliasModel'
99+
'ListBucketAliasModel',
100+
'CustomDomainConfiguration'
100101
]

src/obs/bucket.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,10 @@ class BucketClient(object):
8282
'getBucketFetchPolicy',
8383
'deleteBucketFetchPolicy',
8484
'setBucketFetchJob',
85-
'getBucketFetchJob'
85+
'getBucketFetchJob',
86+
'setBucketCustomDomain',
87+
'deleteBucketCustomDomain',
88+
'getBucketCustomDomain',
8689
]
8790

8891
def __init__(self, obsClient, bucketName):

src/obs/client.py

Lines changed: 82 additions & 22 deletions
Large diffs are not rendered by default.

src/obs/const.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,12 +91,17 @@
9191
DEFAULT_MINIMUM_SIZE = 100 * 1024
9292
DEFAULT_MAXIMUM_SIZE = 5 * 1024 * 1024 * 1024
9393

94+
MAX_CERT_XML_BODY_SIZE = 40*1024 #40 KB
95+
MIN_CERTIFICATE_NAME_LEN = 3
96+
MAX_CERTIFICATE_NAME_LEN = 63
97+
CERTIFICATE_ID_LEN = 16
9498
DEFAULT_BYTE_INTTERVAL = 102400
9599
DEFAULT_TASK_INTTERVAL = 100
96100
DEFAULT_TASK_NUM = 8
97101
DEFAULT_TASK_QUEUE_SIZE = 20000
102+
CONNECTION_POOL_SIZE = 10
98103

99-
OBS_SDK_VERSION = '3.24.6.1'
104+
OBS_SDK_VERSION = '3.25.3'
100105

101106
V2_META_HEADER_PREFIX = 'x-amz-meta-'
102107
V2_HEADER_PREFIX = 'x-amz-'

src/obs/convertor.py

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
InitiateMultipartUploadResponse, CopyObjectResponse, GetObjectMetadataResponse, SetObjectMetadataResponse, \
3030
UploadPartResponse, CopyPartResponse, Replication, GetBucketRequestPaymentResponse, GetBPAModel, GetBPSModel
3131
from obs.model import FetchPolicy, SetBucketFetchJobResponse, GetBucketFetchJobResponse, FetchJobResponse, \
32-
ListWorkflowTemplateResponse
32+
ListWorkflowTemplateResponse,BucketCustomDomain,ListBucketCustomDomainsResponse
3333
from obs.model import GetWorkflowResponse, UpdateWorkflowResponse, ListWorkflowResponse, \
3434
AsyncAPIStartWorkflowResponse, ListWorkflowExecutionResponse, GetWorkflowExecutionResponse, \
3535
RestoreFailedWorkflowExecutionResponse, GetTriggerPolicyResponse, CreateWorkflowTemplateResponse, \
@@ -630,6 +630,26 @@ def trans_website(self, website):
630630
root = self._trans_website_routingRules(root, website)
631631
return ET.tostring(root, 'UTF-8')
632632

633+
def trans_custom_domain_cert(self, certificate, domainName):
634+
pathArgs = {"customdomain": domainName}
635+
if certificate:
636+
root = ET.Element("CustomDomainConfiguration")
637+
ET.SubElement(root, "Name").text = util.to_string(certificate.get("name"))
638+
if certificate.get("certificateId", None):
639+
ET.SubElement(root, "CertificateId").text = util.to_string(certificate.get("certificateId", None))
640+
ET.SubElement(root, "Certificate").text = util.to_string(certificate.get("certificate"))
641+
if certificate.get("certificateChain", None):
642+
ET.SubElement(root, "CertificateChain").text = util.to_string(certificate.get("certificateChain", None))
643+
ET.SubElement(root, "PrivateKey").text = util.to_string(certificate.get("privateKey"))
644+
entity = ET.tostring(root, "UTF-8")
645+
if len(entity) > const.MAX_CERT_XML_BODY_SIZE:
646+
error_message = "XML body size exceeds {} KB limit".format(const.MAX_CERT_XML_BODY_SIZE / 1024)
647+
return {"error": error_message, "pathArgs": pathArgs, "entity": entity, "size": len(entity)}
648+
649+
headers = {const.CONTENT_MD5_HEADER: util.base64_encode(util.md5_encode(entity))}
650+
return {"pathArgs": pathArgs, "headers": headers, "entity": entity}
651+
return {"pathArgs": pathArgs}
652+
633653
@staticmethod
634654
def _trans_website_routingRules(root, website):
635655
if isinstance(website.get('routingRules'), list) and bool(website['routingRules']):
@@ -1305,6 +1325,21 @@ def parseGetBucketMetadata(self, headers):
13051325
option.epid = headers.get(self.ha.epid_header())
13061326
option.redundancy = headers.get(self.ha.bucket_redundancy_header())
13071327
return option
1328+
1329+
def parseGetBucketCustomDomain(self, xml, headers=None):
1330+
root = ET.fromstring(xml)
1331+
domains = root.findall("Domains")
1332+
entries = []
1333+
1334+
for domain in domains:
1335+
domain_name = self._find_item(domain, "DomainName")
1336+
d = self._find_item(domain, "CreateTime")
1337+
certificate_id = self._find_item(domain, "CertificateId")
1338+
create_time = DateTime.UTCToLocal(d)
1339+
curr_bucket = BucketCustomDomain(domain_name=domain_name,create_time=create_time,certificate_id=certificate_id)
1340+
entries.append(curr_bucket)
1341+
1342+
return ListBucketCustomDomainsResponse(domains=entries)
13081343

13091344
def parseGetBucketLocation(self, xml, headers=None):
13101345
root = ET.fromstring(xml)

src/obs/crc64mod.py

Lines changed: 0 additions & 210 deletions
Original file line numberDiff line numberDiff line change
@@ -15,216 +15,6 @@
1515
__all__ = '''mkCrcFun Crc
1616
'''.split()
1717

18-
from obs.const import IS_PYTHON2
19-
import struct
20-
21-
22-
class Crc:
23-
def __init__(self, poly, initCrc=~0, rev=True, xorOut=0, initialize=True):
24-
if not initialize:
25-
return
26-
27-
(sizeBits, initCrc, xorOut) = _verifyParams(poly, initCrc, xorOut)
28-
self.digest_size = sizeBits // 8
29-
self.poly = poly
30-
self.initCrc = initCrc
31-
self.reverse = rev
32-
self.xorOut = xorOut
33-
34-
(crcfun, table) = _mkCrcFun(poly, sizeBits, initCrc, rev, xorOut)
35-
self.table = table
36-
self._crc = crcfun
37-
38-
self.crcValue = self.initCrc
39-
40-
def __str__(self):
41-
lst = []
42-
lst.append('reverse = %s' % self.reverse)
43-
lst.append('poly = 0x%X' % self.poly)
44-
fmt = '0x%%0%dX' % (self.digest_size * 2)
45-
lst.append('crcValue = %s' % (fmt % self.crcValue))
46-
lst.append('xorOut = %s' % (fmt % self.xorOut))
47-
lst.append('initCrc = %s' % (fmt % self.initCrc))
48-
return '\n'.join(lst)
49-
50-
def new(self, arg=None):
51-
n = Crc(poly=None, initialize=False)
52-
n._crc = self._crc
53-
n.table = self.table
54-
n.digest_size = self.digest_size
55-
n.reverse = self.reverse
56-
n.initCrc = self.initCrc
57-
n.crcValue = self.initCrc
58-
n.xorOut = self.xorOut
59-
n.poly = self.poly
60-
if arg is not None:
61-
n.update(arg)
62-
return n
63-
64-
def copy(self):
65-
c = self.new()
66-
c.crcValue = self.crcValue
67-
return c
68-
69-
def update(self, data):
70-
self.crcValue = self._crc(data, self.crcValue)
71-
72-
def digest(self):
73-
n = self.digest_size
74-
crc = self.crcValue
75-
lst = []
76-
while n > 0:
77-
lst.append(crc & 0xFF)
78-
crc = crc >> 8
79-
n -= 1
80-
lst.reverse()
81-
return bytes(lst)
82-
83-
def hexdigest(self):
84-
crc = self.crcValue
85-
n = self.digest_size
86-
lst = []
87-
while n > 0:
88-
lst.append('%02X' % (crc & 0xFF))
89-
crc = crc >> 8
90-
n -= 1
91-
lst.reverse()
92-
return ''.join(lst)
93-
94-
95-
def mkCrcFun(poly, initCrc=~0, rev=True, xorOut=0):
96-
(sizeBits, initCrc, xorOut) = _verifyParams(poly, initCrc, xorOut)
97-
return _mkCrcFun(poly, sizeBits, initCrc, rev, xorOut)[0]
98-
99-
100-
def _verifyPoly(poly):
101-
msg = 'The degree of the polynomial must be 64'
102-
n = 64
103-
low = 1 << n
104-
high = low * 2
105-
if low <= poly < high:
106-
return n
107-
raise ValueError(msg)
108-
109-
110-
def _bitrev(x, n):
111-
y = 0
112-
for i in range(n):
113-
y = (y << 1) | (x & 1)
114-
x = x >> 1
115-
return y
116-
117-
118-
def _bytecrc(crc, poly, n):
119-
mask = 1 << (n - 1)
120-
for i in range(8):
121-
if crc & mask:
122-
crc = (crc << 1) ^ poly
123-
else:
124-
crc = crc << 1
125-
mask = (1 << n) - 1
126-
crc = crc & mask
127-
return crc
128-
129-
130-
def _bytecrc_r(crc, poly, n):
131-
for i in range(8):
132-
if crc & 1:
133-
crc = (crc >> 1) ^ poly
134-
else:
135-
crc = crc >> 1
136-
mask = (1 << n) - 1
137-
crc = crc & mask
138-
return crc
139-
140-
141-
def _mkTable(poly, n):
142-
mask = (1 << n) - 1
143-
poly = poly & mask
144-
table = [_bytecrc(i << (n - 8), poly, n) for i in range(256)]
145-
return table
146-
147-
148-
def _mkTable_r(poly, n):
149-
mask = (1 << n) - 1
150-
poly = _bitrev(poly & mask, n)
151-
table = [_bytecrc_r(i, poly, n) for i in range(256)]
152-
return table
153-
154-
155-
_sizeToTypeCode = {}
156-
157-
for typeCode in 'B H I L Q'.split():
158-
size = {1: 8, 2: 16, 4: 32, 8: 64}.get(struct.calcsize(typeCode), None)
159-
if size is not None and size not in _sizeToTypeCode:
160-
_sizeToTypeCode[size] = '256%s' % typeCode
161-
162-
_sizeToTypeCode[24] = _sizeToTypeCode[32]
163-
164-
del typeCode, size
165-
166-
167-
def _verifyParams(poly, initCrc, xorOut):
168-
sizeBits = _verifyPoly(poly)
169-
mask = (1 << sizeBits) - 1
170-
initCrc = initCrc & mask
171-
xorOut = xorOut & mask
172-
return (sizeBits, initCrc, xorOut)
173-
174-
175-
def _mkCrcFun(poly, sizeBits, initCrc, rev, xorOut):
176-
if rev:
177-
tableList = _mkTable_r(poly, sizeBits)
178-
_fun = _crc64r
179-
else:
180-
tableList = _mkTable(poly, sizeBits)
181-
_fun = _crc64
182-
183-
_table = tableList
184-
185-
if xorOut == 0:
186-
def crcfun(data, crc=initCrc, table=_table, fun=_fun):
187-
return fun(data, crc, table)
188-
else:
189-
def crcfun(data, crc=initCrc, table=_table, fun=_fun):
190-
return xorOut ^ fun(data, xorOut ^ crc, table)
191-
192-
return crcfun, tableList
193-
194-
195-
def _get_buffer_view(in_obj):
196-
if isinstance(in_obj, str):
197-
raise TypeError('Unicode-objects must be encoded before calculating a CRC')
198-
mv = memoryview(in_obj)
199-
if mv.ndim > 1:
200-
raise BufferError('Buffer must be single dimension')
201-
return mv
202-
203-
204-
def _crc64(data, crc, table):
205-
crc = crc & 0xFFFFFFFFFFFFFFFF
206-
if IS_PYTHON2:
207-
for x in data:
208-
crc = table[ord(x) ^ (int(crc >> 56) & 0xFF)] ^ ((crc << 8) & 0xFFFFFFFFFFFFFF00)
209-
else:
210-
mv = _get_buffer_view(data)
211-
for x in mv.tobytes():
212-
crc = table[x ^ ((crc >> 56) & 0xFF)] ^ ((crc << 8) & 0xFFFFFFFFFFFFFF00)
213-
return crc
214-
215-
216-
def _crc64r(data, crc, table):
217-
crc = crc & 0xFFFFFFFFFFFFFFFF
218-
if IS_PYTHON2:
219-
for x in data:
220-
crc = table[ord(x) ^ int(crc & 0xFF)] ^ (crc >> 8)
221-
else:
222-
mv = _get_buffer_view(data)
223-
for x in mv.tobytes():
224-
crc = table[x ^ (crc & 0xFF)] ^ (crc >> 8)
225-
return crc
226-
227-
22818
import sys
22919

23020
is_py3 = (sys.version_info[0] == 3)

src/obs/crypto_client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ def downloadFile(self, bucketName, objectKey, downloadFile=None, partSize=5 * 10
145145

146146
def _parse_content(self, objectKey, conn, readable, result_wrapper=None, download_start=None,
147147
downloadPath=None, chuckSize=const.READ_ONCE_LENGTH, loadStreamInMemory=False,
148-
progressCallback=None, notifier=None):
148+
progressCallback=None, isAttachCrc64=False, notifier=None):
149149
if readable.status >= 300:
150150
return super(CryptoObsClient, self)._parse_content(objectKey, conn, readable,
151151
download_start=download_start, downloadPath=downloadPath,

0 commit comments

Comments
 (0)