Skip to content

Commit 50cc535

Browse files
authored
Merge pull request #121 from livehigh/feat/2.11.3
Feat/2.11.4
2 parents 9e0753a + fac0291 commit 50cc535

File tree

5 files changed

+80
-38
lines changed

5 files changed

+80
-38
lines changed

README.md

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,19 @@ var cos = new COS({
2222
SecretId: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
2323
SecretKey: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
2424
});
25+
26+
// 存储桶名称,由bucketname-appid 组成,appid必须填入,可以在COS控制台查看存储桶名称。 https://console.cloud.tencent.com/cos5/bucket
27+
var Bucket = 'test-1250000000';
28+
// 存储桶Region可以在COS控制台指定存储桶的概览页查看 https://console.cloud.tencent.com/cos5/bucket/
29+
// 关于地域的详情见 https://cloud.tencent.com/document/product/436/6224
30+
var Region = 'ap-guangzhou';
31+
2532
// 分片上传
2633
cos.sliceUploadFile({
27-
Bucket: 'test-1250000000', // Bucket 格式:test-1250000000
28-
Region: 'ap-guangzhou',
34+
Bucket: Bucket,
35+
Region: Region,
2936
Key: '1.zip',
30-
FilePath: './1.zip'
37+
FilePath: './1.zip' // 本地文件地址,需自行替换
3138
}, function (err, data) {
3239
console.log(err, data);
3340
});

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "cos-nodejs-sdk-v5",
3-
"version": "2.11.3",
3+
"version": "2.11.4",
44
"description": "cos nodejs sdk v5",
55
"main": "index.js",
66
"types": "index.d.ts",

sdk/base.js

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3133,20 +3133,14 @@ function getObjectUrl(params, callback) {
31333133
queryParamsStr += (queryParamsStr ? '&' : '') + params.QueryString;
31343134
}
31353135

3136-
// 签名加上 Host,避免跨桶访问
3137-
var SignHost = '';
3138-
var standardHost = 'cos.' + params.Region + '.myqcloud.com';
3139-
if (!self.options.ForcePathStyle) standardHost = params.Bucket + '.' + standardHost;
3140-
var urlHost = url.replace(/^https?:\/\/([^/]+)(\/.*)?$/, '$1');
3141-
if (standardHost === urlHost) SignHost = standardHost;
3142-
31433136
var syncUrl = url;
31443137
if (params.Sign !== undefined && !params.Sign) {
31453138
queryParamsStr && (syncUrl += '?' + queryParamsStr);
31463139
callback(null, {Url: syncUrl});
31473140
return syncUrl;
31483141
}
31493142

3143+
// 签名加上 Host,避免跨桶访问
31503144
var SignHost = getSignHost.call(this, {Bucket: params.Bucket, Region: params.Region, Url: url});
31513145
var AuthData = getAuthorizationAsync.call(this, {
31523146
Action: ((params.Method || '').toUpperCase() === 'PUT' ? 'name/cos:PutObject' : 'name/cos:GetObject'),
@@ -3164,9 +3158,19 @@ function getObjectUrl(params, callback) {
31643158
callback(err);
31653159
return;
31663160
}
3161+
3162+
// 兼容万象url qUrlParamList需要再encode一次
3163+
var replaceUrlParamList = function(url) {
3164+
var urlParams = url.match(/q-url-param-list.*?(?=&)/g)[0];
3165+
var encodedParams = 'q-url-param-list=' + encodeURIComponent(urlParams.replace(/q-url-param-list=/, '')).toLowerCase();
3166+
var reg = new RegExp(urlParams, 'g');
3167+
var replacedUrl = url.replace(reg, encodedParams);
3168+
return replacedUrl;
3169+
}
3170+
31673171
var signUrl = url;
31683172
signUrl += '?' + (AuthData.Authorization.indexOf('q-signature') > -1 ?
3169-
AuthData.Authorization : 'sign=' + encodeURIComponent(AuthData.Authorization));
3173+
replaceUrlParamList(AuthData.Authorization) : 'sign=' + encodeURIComponent(AuthData.Authorization));
31703174
AuthData.SecurityToken && (signUrl += '&x-cos-security-token=' + AuthData.SecurityToken);
31713175
AuthData.ClientIP && (signUrl += '&clientIP=' + AuthData.ClientIP);
31723176
AuthData.ClientUA && (signUrl += '&clientUA=' + AuthData.ClientUA);
@@ -3324,7 +3328,7 @@ function getAuthorizationAsync(params, callback) {
33243328
var headers = util.clone(params.Headers);
33253329
var headerHost = '';
33263330
util.each(headers, function (v, k) {
3327-
(v === '' || ['content-type', 'cache-control', 'expires'].indexOf(k.toLowerCase()) > -1) && delete headers[k];
3331+
(v === '' || ['content-type', 'cache-control'].indexOf(k.toLowerCase()) > -1) && delete headers[k];
33283332
if (k.toLowerCase() === 'host') headerHost = v;
33293333
});
33303334

sdk/cos.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,14 @@ var COS = function (options) {
6565
if (this.options.secretKey && !this.options.SecretKey) this.options.SecretKey = this.options.secretKey;
6666
console.warn('warning: Please change options secretId/secretKey to SecretId/SecretKey.');
6767
}
68+
if (this.options.SecretId && this.options.SecretId.indexOf(' ') > -1) {
69+
console.error('error: SecretId格式错误,请检查');
70+
console.error('error: SecretId format is incorrect. Please check');
71+
}
72+
if (this.options.SecretKey && this.options.SecretKey.indexOf(' ') > -1) {
73+
console.error('error: SecretKey格式错误,请检查');
74+
console.error('error: SecretKey format is incorrect. Please check');
75+
}
6876
if (util.isWeb()) {
6977
console.warn('warning: cos-nodejs-sdk-v5 不支持浏览器使用,请改用 cos-js-sdk-v5,参考文档: https://cloud.tencent.com/document/product/436/11459');
7078
console.warn('warning: cos-nodejs-sdk-v5 does not support browsers. Please use cos-js-sdk-v5 instead, See: https://cloud.tencent.com/document/product/436/11459');

sdk/util.js

Lines changed: 48 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,33 +16,56 @@ function camSafeUrlEncode(str) {
1616
}
1717

1818
var getObjectKeys = function (obj, forKey) {
19-
var list = [];
20-
for (var key in obj) {
21-
if (obj.hasOwnProperty(key)) {
22-
list.push(forKey ? camSafeUrlEncode(key).toLowerCase() : key);
23-
}
24-
}
25-
return list.sort(function (a, b) {
26-
a = a.toLowerCase();
27-
b = b.toLowerCase();
28-
return a === b ? 0 : (a > b ? 1 : -1);
29-
});
19+
var list = [];
20+
for (var key in obj) {
21+
if (obj.hasOwnProperty(key)) {
22+
list.push(forKey ? camSafeUrlEncode(key).toLowerCase() : key);
23+
}
24+
}
25+
return list.sort(function (a, b) {
26+
a = a.toLowerCase();
27+
b = b.toLowerCase();
28+
return a === b ? 0 : (a > b ? 1 : -1);
29+
});
3030
};
3131

32-
var obj2str = function (obj) {
33-
var i, key, val;
34-
var list = [];
35-
var keyList = getObjectKeys(obj);
36-
for (i = 0; i < keyList.length; i++) {
37-
key = keyList[i];
38-
val = (obj[key] === undefined || obj[key] === null) ? '' : ('' + obj[key]);
39-
key = camSafeUrlEncode(key).toLowerCase();
40-
val = camSafeUrlEncode(val) || '';
41-
list.push(key + '=' + val)
42-
}
43-
return list.join('&');
32+
/**
33+
* obj转为string
34+
* @param {Object} obj 需要转的对象,必须
35+
* @param {Boolean} lowerCaseKey key是否转为小写,默认false,非必须
36+
* @return {String} data 返回字符串
37+
*/
38+
var obj2str = function (obj, lowerCaseKey) {
39+
var i, key, val;
40+
var list = [];
41+
var keyList = getObjectKeys(obj);
42+
for (i = 0; i < keyList.length; i++) {
43+
key = keyList[i];
44+
val = (obj[key] === undefined || obj[key] === null) ? '' : ('' + obj[key]);
45+
key = lowerCaseKey? camSafeUrlEncode(key).toLowerCase() : camSafeUrlEncode(key);
46+
val = camSafeUrlEncode(val) || '';
47+
list.push(key + '=' + val)
48+
}
49+
return list.join('&');
4450
};
4551

52+
// 可以签入签名的headers
53+
var signHeaders = ['content-disposition', 'content-encoding', 'content-length', 'content-md5',
54+
'expect', 'expires', 'host', 'if-match', 'if-modified-since', 'if-none-match', 'if-unmodified-since',
55+
'origin', 'range', 'response-cache-control', 'response-content-disposition', 'response-content-encoding',
56+
'response-content-language', 'response-content-type', 'response-expires', 'transfer-encoding', 'versionid'];
57+
58+
var getSignHeaderObj = function (headers) {
59+
var signHeaderObj = {};
60+
for (var i in headers) {
61+
var key = i.toLowerCase();
62+
if (key.indexOf('x-cos-') > -1 || signHeaders.indexOf(key) > -1) {
63+
signHeaderObj[i] = headers[i];
64+
}
65+
}
66+
return signHeaderObj;
67+
}
68+
4669
//测试用的key后面可以去掉
4770
var getAuth = function (opt) {
4871
opt = opt || {};
@@ -52,7 +75,7 @@ var getAuth = function (opt) {
5275
var KeyTime = opt.KeyTime;
5376
var method = (opt.method || opt.Method || 'get').toLowerCase();
5477
var queryParams = clone(opt.Query || opt.params || {});
55-
var headers = clone(opt.Headers || opt.headers || {});
78+
var headers = getSignHeaderObj(clone(opt.Headers || opt.headers || {}));
5679

5780
var Key = opt.Key || '';
5881
var pathname;
@@ -93,7 +116,7 @@ var getAuth = function (opt) {
93116
var signKey = crypto.createHmac('sha1', SecretKey).update(qKeyTime).digest('hex');
94117

95118
// 步骤二:构成 FormatString
96-
var formatString = [method, pathname, obj2str(queryParams), obj2str(headers), ''].join('\n');
119+
var formatString = [method, pathname, obj2str(queryParams, true), obj2str(headers, true), ''].join('\n');
97120
formatString = Buffer.from(formatString, 'utf8');
98121

99122
// 步骤三:计算 StringToSign

0 commit comments

Comments
 (0)