Skip to content

Commit aac55ca

Browse files
authored
Merge pull request #50 from dt3310321/s3
support py2 and py3
2 parents aa7adc3 + 000794f commit aac55ca

File tree

8 files changed

+472
-336
lines changed

8 files changed

+472
-336
lines changed

README.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Qcloud COSv5 SDK
44
介绍
55
_______
66

7-
腾讯云COSV5Python SDK, 目前可以支持Python2.6与Python2.7
7+
腾讯云COSV5Python SDK, 目前可以支持Python2.6与Python2.7以及Python3.x
88

99
安装指南
1010
__________

qcloud_cos/cos_auth.py

Lines changed: 18 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
# -*- coding: utf-8 -*-
22

3+
from six.moves.urllib.parse import quote, unquote, urlparse, urlencode
34
import hmac
45
import time
5-
import urllib
66
import hashlib
77
import logging
8-
from urllib import quote
9-
from urlparse import urlparse
108
from requests.auth import AuthBase
9+
from .cos_comm import to_unicode, to_bytes
1110
logger = logging.getLogger(__name__)
1211

1312

@@ -18,62 +17,53 @@ def filter_headers(data):
1817
:return(dict): 计算进签名的头部.
1918
"""
2019
headers = {}
21-
for i in data.keys():
20+
for i in data:
2221
if i == 'Content-Type' or i == 'Host' or i[0] == 'x' or i[0] == 'X':
2322
headers[i] = data[i]
2423
return headers
2524

2625

27-
def to_string(data):
28-
"""转换unicode为string.
29-
30-
:param data(unicode|string): 待转换的unicode|string.
31-
:return(string): 转换后的string.
32-
"""
33-
if isinstance(data, unicode):
34-
return data.encode('utf8')
35-
return data
36-
37-
3826
class CosS3Auth(AuthBase):
3927

40-
def __init__(self, secret_id, secret_key, key='', params={}, expire=10000):
41-
self._secret_id = to_string(secret_id)
42-
self._secret_key = to_string(secret_key)
28+
def __init__(self, secret_id, secret_key, key=None, params={}, expire=10000):
29+
self._secret_id = secret_id
30+
self._secret_key = secret_key
4331
self._expire = expire
4432
self._params = params
4533
if key:
46-
if key[0] == '/':
34+
key = to_unicode(key)
35+
if key[0] == u'/':
4736
self._path = key
4837
else:
49-
self._path = '/' + key
38+
self._path = u'/' + key
5039
else:
51-
self._path = '/'
40+
self._path = u'/'
5241

5342
def __call__(self, r):
5443
path = self._path
5544
uri_params = self._params
5645
headers = filter_headers(r.headers)
5746
uri_params = dict([(k.lower(), v) for k, v in uri_params.items()])
5847
# reserved keywords in headers urlencode are -_.~, notice that / should be encoded and space should not be encoded to plus sign(+)
59-
headers = dict([(k.lower(), quote(v, '-_.~')) for k, v in headers.items()]) # headers中的key转换为小写,value进行encode
60-
format_str = "{method}\n{host}\n{params}\n{headers}\n".format(
48+
headers = dict([(k.lower(), quote(to_bytes(v), '-_.~')) for k, v in headers.items()]) # headers中的key转换为小写,value进行encode
49+
uri_params = dict([(k.lower(), v) for k, v in uri_params.items()])
50+
format_str = u"{method}\n{host}\n{params}\n{headers}\n".format(
6151
method=r.method.lower(),
6252
host=path,
63-
params=urllib.urlencode(sorted(uri_params.items())).replace('+', '%20'),
64-
headers='&'.join(map(lambda (x, y): "%s=%s" % (x, y), sorted(headers.items())))
53+
params=urlencode(sorted(uri_params.items())).replace('+', '%20'),
54+
headers='&'.join(map(lambda tupl: "%s=%s" % (tupl[0], tupl[1]), sorted(headers.items())))
6555
)
6656
logger.debug("format str: " + format_str)
6757

6858
start_sign_time = int(time.time())
6959
sign_time = "{bg_time};{ed_time}".format(bg_time=start_sign_time-60, ed_time=start_sign_time+self._expire)
7060
sha1 = hashlib.sha1()
71-
sha1.update(format_str)
61+
sha1.update(to_bytes(format_str))
7262

7363
str_to_sign = "sha1\n{time}\n{sha1}\n".format(time=sign_time, sha1=sha1.hexdigest())
7464
logger.debug('str_to_sign: ' + str(str_to_sign))
75-
sign_key = hmac.new(self._secret_key, sign_time, hashlib.sha1).hexdigest()
76-
sign = hmac.new(sign_key, str_to_sign, hashlib.sha1).hexdigest()
65+
sign_key = hmac.new(to_bytes(self._secret_key), to_bytes(sign_time), hashlib.sha1).hexdigest()
66+
sign = hmac.new(to_bytes(sign_key), to_bytes(str_to_sign), hashlib.sha1).hexdigest()
7767
logger.debug('sign_key: ' + str(sign_key))
7868
logger.debug('sign: ' + str(sign))
7969
sign_tpl = "q-sign-algorithm=sha1&q-ak={ak}&q-sign-time={sign_time}&q-key-time={key_time}&q-header-list={headers}&q-url-param-list={params}&q-signature={sign}"

0 commit comments

Comments
 (0)