Comparing version 7.2.1 to 7.2.2
## CHANGE LOG | ||
## v7.2.2 | ||
- 一些log输出问题,travis增加eslint 检查 | ||
## v7.2.1 | ||
@@ -15,3 +18,3 @@ - 修复rtc获取回复存在的问题 | ||
## v7.7.7 | ||
## v7.1.7 | ||
- 修复form上传在升级mime库后的错误 | ||
@@ -18,0 +21,0 @@ |
@@ -409,2 +409,4 @@ /** | ||
const Zone_na0: conf.Zone; | ||
//Southeast Asia | ||
const Zone_as0: conf.Zone; | ||
} | ||
@@ -411,0 +413,0 @@ |
32
index.js
var libPath = process.env.QINIU_COV ? './lib-cov' : './qiniu'; | ||
module.exports = { | ||
auth: { | ||
digest: require(libPath + '/auth' + '/digest.js') | ||
}, | ||
cdn: require(libPath + '/cdn.js'), | ||
form_up: require(libPath + '/storage/form.js'), | ||
resume_up: require(libPath + '/storage/resume.js'), | ||
rs: require(libPath + '/storage/rs.js'), | ||
fop: require(libPath + '/fop.js'), | ||
conf: require(libPath + '/conf.js'), | ||
rpc: require(libPath + '/rpc.js'), | ||
util: require(libPath + '/util.js'), | ||
zone: require(libPath + '/zone.js'), | ||
app: require(libPath + '/rtc/app.js'), | ||
room: require(libPath + '/rtc/room.js'), | ||
Credentials: require(libPath + '/rtc/credentials.js') | ||
} | ||
auth: { | ||
digest: require(libPath + '/auth' + '/digest.js') | ||
}, | ||
cdn: require(libPath + '/cdn.js'), | ||
form_up: require(libPath + '/storage/form.js'), | ||
resume_up: require(libPath + '/storage/resume.js'), | ||
rs: require(libPath + '/storage/rs.js'), | ||
fop: require(libPath + '/fop.js'), | ||
conf: require(libPath + '/conf.js'), | ||
rpc: require(libPath + '/rpc.js'), | ||
util: require(libPath + '/util.js'), | ||
zone: require(libPath + '/zone.js'), | ||
app: require(libPath + '/rtc/app.js'), | ||
room: require(libPath + '/rtc/room.js'), | ||
Credentials: require(libPath + '/rtc/credentials.js') | ||
}; |
{ | ||
"name": "qiniu", | ||
"version": "7.2.1", | ||
"version": "7.2.2", | ||
"description": "Node wrapper for Qiniu Resource (Cloud) Storage API", | ||
@@ -19,3 +19,4 @@ "main": "index.js", | ||
"threshold": 90 | ||
} | ||
}, | ||
"lint": "./node_modules/eslint/bin/eslint.js **.js" | ||
}, | ||
@@ -56,3 +57,3 @@ "repository": { | ||
"engines": [ | ||
"node >= 4" | ||
"node >= 6" | ||
], | ||
@@ -71,4 +72,4 @@ "dependencies": { | ||
"blanket": "*", | ||
"eslint": "^5.0.0-alpha.2", | ||
"eslint-config-standard": "^12.0.0-alpha.0", | ||
"eslint": "^5.11.1", | ||
"eslint-config-standard": "^12.0.0", | ||
"eslint-plugin-import": "^2.11.0", | ||
@@ -78,5 +79,5 @@ "eslint-plugin-node": "^6.0.1", | ||
"eslint-plugin-standard": "^3.1.0", | ||
"mocha": "*", | ||
"mocha": "^5.2.0", | ||
"pedding": "*", | ||
"should": "1.2.2", | ||
"should": "^1.2.2", | ||
"travis-cov": "*" | ||
@@ -83,0 +84,0 @@ }, |
@@ -1,4 +0,2 @@ | ||
var url = require('url'); | ||
var conf = require('../conf'); | ||
var util = require('../util'); | ||
@@ -8,4 +6,4 @@ exports.Mac = Mac; | ||
function Mac(accessKey, secretKey) { | ||
this.accessKey = accessKey || conf.ACCESS_KEY; | ||
this.secretKey = secretKey || conf.SECRET_KEY; | ||
this.accessKey = accessKey || conf.ACCESS_KEY; | ||
this.secretKey = secretKey || conf.SECRET_KEY; | ||
} |
191
qiniu/cdn.js
@@ -11,3 +11,3 @@ const url = require('url'); | ||
function CdnManager(mac) { | ||
this.mac = mac || new digest.Mac(); | ||
this.mac = mac || new digest.Mac(); | ||
} | ||
@@ -22,15 +22,15 @@ | ||
CdnManager.prototype.getCdnLogList = function(domains, logDay, callbackFunc) { | ||
var url = '/v2/tune/log/list\n'; | ||
var accessToken = util.generateAccessToken(this.mac, url, ''); | ||
var headers = { | ||
'Content-Type': 'application/json', | ||
'Authorization': accessToken, | ||
}; | ||
postBody = { | ||
'day': logDay, | ||
'domains': domains.join(';') | ||
} | ||
var url = '/v2/tune/log/list\n'; | ||
var accessToken = util.generateAccessToken(this.mac, url, ''); | ||
var headers = { | ||
'Content-Type': 'application/json', | ||
'Authorization': accessToken, | ||
}; | ||
var postBody = { | ||
'day': logDay, | ||
'domains': domains.join(';') | ||
}; | ||
req('/v2/tune/log/list', headers, postBody, callbackFunc); | ||
} | ||
req('/v2/tune/log/list', headers, postBody, callbackFunc); | ||
}; | ||
@@ -47,19 +47,19 @@ | ||
CdnManager.prototype.getFluxData = function(startDate, endDate, granularity, | ||
domains, | ||
callbackFunc) { | ||
var url = '/v2/tune/flux\n'; | ||
var accessToken = util.generateAccessToken(this.mac, url, ''); | ||
var headers = { | ||
'Content-Type': 'application/json', | ||
'Authorization': accessToken, | ||
}; | ||
data = { | ||
'startDate': startDate, | ||
'endDate': endDate, | ||
'granularity': granularity, | ||
'domains': domains.join(';') | ||
} | ||
domains, | ||
callbackFunc) { | ||
var url = '/v2/tune/flux\n'; | ||
var accessToken = util.generateAccessToken(this.mac, url, ''); | ||
var headers = { | ||
'Content-Type': 'application/json', | ||
'Authorization': accessToken, | ||
}; | ||
var data = { | ||
'startDate': startDate, | ||
'endDate': endDate, | ||
'granularity': granularity, | ||
'domains': domains.join(';') | ||
}; | ||
req('/v2/tune/flux', headers, data, callbackFunc); | ||
} | ||
req('/v2/tune/flux', headers, data, callbackFunc); | ||
}; | ||
@@ -75,19 +75,19 @@ | ||
CdnManager.prototype.getBandwidthData = function(startDate, endDate, | ||
granularity, domains, | ||
callbackFunc) { | ||
var url = '/v2/tune/bandwidth\n'; | ||
var accessToken = util.generateAccessToken(this.mac, url, ''); | ||
var headers = { | ||
'Content-Type': 'application/json', | ||
'Authorization': accessToken, | ||
}; | ||
data = { | ||
'startDate': startDate, | ||
'endDate': endDate, | ||
'granularity': granularity, | ||
'domains': domains.join(';') | ||
} | ||
granularity, domains, | ||
callbackFunc) { | ||
var url = '/v2/tune/bandwidth\n'; | ||
var accessToken = util.generateAccessToken(this.mac, url, ''); | ||
var headers = { | ||
'Content-Type': 'application/json', | ||
'Authorization': accessToken, | ||
}; | ||
var data = { | ||
'startDate': startDate, | ||
'endDate': endDate, | ||
'granularity': granularity, | ||
'domains': domains.join(';') | ||
}; | ||
req('/v2/tune/bandwidth', headers, data, callbackFunc); | ||
} | ||
req('/v2/tune/bandwidth', headers, data, callbackFunc); | ||
}; | ||
@@ -101,14 +101,14 @@ | ||
CdnManager.prototype.prefetchUrls = function(urls, callbackFunc) { | ||
var postBody = { | ||
urls: urls | ||
}; | ||
var url = '/v2/tune/prefetch\n'; | ||
var accessToken = util.generateAccessToken(this.mac, url, ''); | ||
var headers = { | ||
'Content-Type': 'application/json', | ||
'Authorization': accessToken, | ||
}; | ||
var postBody = { | ||
urls: urls | ||
}; | ||
var url = '/v2/tune/prefetch\n'; | ||
var accessToken = util.generateAccessToken(this.mac, url, ''); | ||
var headers = { | ||
'Content-Type': 'application/json', | ||
'Authorization': accessToken, | ||
}; | ||
req('/v2/tune/prefetch', headers, postBody, callbackFunc); | ||
} | ||
req('/v2/tune/prefetch', headers, postBody, callbackFunc); | ||
}; | ||
@@ -120,4 +120,4 @@ | ||
CdnManager.prototype.refreshUrls = function(urls, callbackFunc) { | ||
this.refreshUrlsAndDirs(urls, null, callbackFunc); | ||
} | ||
this.refreshUrlsAndDirs(urls, null, callbackFunc); | ||
}; | ||
@@ -130,20 +130,20 @@ | ||
CdnManager.prototype.refreshDirs = function(dirs, callbackFunc) { | ||
this.refreshUrlsAndDirs(null, dirs, callbackFunc); | ||
} | ||
this.refreshUrlsAndDirs(null, dirs, callbackFunc); | ||
}; | ||
CdnManager.prototype.refreshUrlsAndDirs = function(urls, dirs, callbackFunc) { | ||
var postBody = { | ||
urls: urls, | ||
dirs: dirs, | ||
}; | ||
var url = '/v2/tune/refresh\n'; | ||
var accessToken = util.generateAccessToken(this.mac, url, ''); | ||
var headers = { | ||
'Content-Type': 'application/json', | ||
'Authorization': accessToken, | ||
}; | ||
var postBody = { | ||
urls: urls, | ||
dirs: dirs, | ||
}; | ||
var url = '/v2/tune/refresh\n'; | ||
var accessToken = util.generateAccessToken(this.mac, url, ''); | ||
var headers = { | ||
'Content-Type': 'application/json', | ||
'Authorization': accessToken, | ||
}; | ||
req('/v2/tune/refresh', headers, postBody, callbackFunc); | ||
} | ||
req('/v2/tune/refresh', headers, postBody, callbackFunc); | ||
}; | ||
@@ -153,7 +153,7 @@ | ||
function req(reqPath, header, reqBody, callbackFunc) { | ||
urllib.request("http://fusion.qiniuapi.com" + reqPath, { | ||
method: 'POST', | ||
headers: header, | ||
data: reqBody, | ||
}, callbackFunc); | ||
urllib.request('http://fusion.qiniuapi.com' + reqPath, { | ||
method: 'POST', | ||
headers: header, | ||
data: reqBody, | ||
}, callbackFunc); | ||
} | ||
@@ -170,23 +170,24 @@ | ||
CdnManager.prototype.createTimestampAntiLeechUrl = function(domain, fileName, | ||
query, encryptKey, deadline) { | ||
if (query != null) { | ||
urlToSign = domain + '/' + encodeUrl(fileName) + '?' + query; | ||
} else { | ||
urlToSign = domain + '/' + encodeUrl(fileName); | ||
} | ||
query, encryptKey, deadline) { | ||
var urlToSign; | ||
if (query != null) { | ||
urlToSign = domain + '/' + encodeUrl(fileName) + '?' + query; | ||
} else { | ||
urlToSign = domain + '/' + encodeUrl(fileName); | ||
} | ||
var urlObj = url.parse(urlToSign); | ||
pathname = urlObj.pathname; | ||
var urlObj = url.parse(urlToSign); | ||
var pathname = urlObj.pathname; | ||
var expireHex = deadline.toString(16); | ||
var signedStr = encryptKey + pathname + expireHex; | ||
var expireHex = deadline.toString(16); | ||
var signedStr = encryptKey + pathname + expireHex; | ||
var md5 = crypto.createHash('md5'); | ||
var toSignStr = md5.update(signedStr).digest('hex'); | ||
var md5 = crypto.createHash('md5'); | ||
var toSignStr = md5.update(signedStr).digest('hex'); | ||
if (query != null) { | ||
return urlToSign + '&sign=' + toSignStr + '&t=' + expireHex; | ||
} else { | ||
return urlToSign + '?sign=' + toSignStr + '&t=' + expireHex; | ||
} | ||
} | ||
if (query != null) { | ||
return urlToSign + '&sign=' + toSignStr + '&t=' + expireHex; | ||
} else { | ||
return urlToSign + '?sign=' + toSignStr + '&t=' + expireHex; | ||
} | ||
}; |
@@ -1,3 +0,1 @@ | ||
const fs = require('fs'); | ||
const path = require('path'); | ||
const os = require('os'); | ||
@@ -10,5 +8,5 @@ const pkg = require('../package.json'); | ||
var defaultUserAgent = function() { | ||
return 'QiniuNodejs/' + pkg.version + ' (' + os.type() + '; ' + os.platform() + | ||
return 'QiniuNodejs/' + pkg.version + ' (' + os.type() + '; ' + os.platform() + | ||
'; ' + os.arch() + '; )'; | ||
} | ||
}; | ||
@@ -19,7 +17,8 @@ exports.USER_AGENT = defaultUserAgent(); | ||
//define api form mime type | ||
exports.FormMimeUrl = "application/x-www-form-urlencoded"; | ||
exports.FormMimeJson = "application/json"; | ||
exports.FormMimeRaw = "application/octet-stream"; | ||
exports.RS_HOST = "http://rs.qiniu.com"; | ||
exports.FormMimeUrl = 'application/x-www-form-urlencoded'; | ||
exports.FormMimeJson = 'application/json'; | ||
exports.FormMimeRaw = 'application/octet-stream'; | ||
exports.RS_HOST = 'http://rs.qiniu.com'; | ||
exports.RPC_TIMEOUT = 120000; //120s | ||
exports.UC_HOST = 'uc.qbox.me'; | ||
@@ -31,56 +30,56 @@ //proxy | ||
exports.Config = function Config(options) { | ||
options = options || {}; | ||
//use http or https protocol | ||
this.useHttpsDomain = options.useHttpsDomain || false; | ||
//use cdn accerlated domains | ||
this.useCdnDomain = options.useCdnDomain || true; | ||
//zone of the bucket | ||
//z0 huadong, z1 huabei, z2 huanan, na0 beimei | ||
this.zone = options.zone || null; | ||
this.zoneExpire = options.zoneExpire || -1; | ||
} | ||
options = options || {}; | ||
//use http or https protocol | ||
this.useHttpsDomain = !!(options.useHttpsDomain || false); | ||
//use cdn accerlated domains | ||
this.useCdnDomain = !!(options.useCdnDomain && true); | ||
//zone of the bucket | ||
//z0 huadong, z1 huabei, z2 huanan, na0 beimei | ||
this.zone = options.zone || null; | ||
this.zoneExpire = options.zoneExpire || -1; | ||
}; | ||
exports.Zone = function(srcUpHosts, cdnUpHosts, ioHost, rsHost, rsfHost, | ||
apiHost) { | ||
this.srcUpHosts = srcUpHosts || {}; | ||
this.cdnUpHosts = cdnUpHosts || {}; | ||
this.ioHost = ioHost || ""; | ||
this.rsHost = rsHost || "rs.qiniu.com"; | ||
this.rsfHost = rsfHost || "rsf.qiniu.com"; | ||
this.apiHost = apiHost || "api.qiniu.com"; | ||
var dotIndex = this.ioHost.indexOf("."); | ||
if (dotIndex != -1) { | ||
var ioTag = this.ioHost.substring(0, dotIndex); | ||
var zoneSepIndex = ioTag.indexOf("-"); | ||
if (zoneSepIndex != -1) { | ||
var zoneTag = ioTag.substring(zoneSepIndex + 1); | ||
switch (zoneTag) { | ||
case "z1": | ||
this.rsHost = "rs-z1.qiniu.com"; | ||
this.rsfHost = "rsf-z1.qiniu.com"; | ||
this.apiHost = "api-z1.qiniu.com"; | ||
break; | ||
case "z2": | ||
this.rsHost = "rs-z2.qiniu.com"; | ||
this.rsfHost = "rsf-z2.qiniu.com"; | ||
this.apiHost = "api-z2.qiniu.com"; | ||
break; | ||
case "na0": | ||
this.rsHost = "rs-na0.qiniu.com"; | ||
this.rsfHost = "rsf-na0.qiniu.com"; | ||
this.apiHost = "api-na0.qiniu.com"; | ||
break; | ||
case "as0": | ||
this.rsHost = "rs-as0.qiniu.com"; | ||
this.rsfHost = "rsf-as0.qiniu.com"; | ||
this.apiHost = "api-as0.qiniu.com"; | ||
break; | ||
default: | ||
this.rsHost = "rs.qiniu.com"; | ||
this.rsfHost = "rsf.qiniu.com"; | ||
this.apiHost = "api.qiniu.com"; | ||
break; | ||
} | ||
apiHost) { | ||
this.srcUpHosts = srcUpHosts || {}; | ||
this.cdnUpHosts = cdnUpHosts || {}; | ||
this.ioHost = ioHost || ''; | ||
this.rsHost = rsHost || 'rs.qiniu.com'; | ||
this.rsfHost = rsfHost || 'rsf.qiniu.com'; | ||
this.apiHost = apiHost || 'api.qiniu.com'; | ||
var dotIndex = this.ioHost.indexOf('.'); | ||
if (dotIndex != -1) { | ||
var ioTag = this.ioHost.substring(0, dotIndex); | ||
var zoneSepIndex = ioTag.indexOf('-'); | ||
if (zoneSepIndex != -1) { | ||
var zoneTag = ioTag.substring(zoneSepIndex + 1); | ||
switch (zoneTag) { | ||
case 'z1': | ||
this.rsHost = 'rs-z1.qiniu.com'; | ||
this.rsfHost = 'rsf-z1.qiniu.com'; | ||
this.apiHost = 'api-z1.qiniu.com'; | ||
break; | ||
case 'z2': | ||
this.rsHost = 'rs-z2.qiniu.com'; | ||
this.rsfHost = 'rsf-z2.qiniu.com'; | ||
this.apiHost = 'api-z2.qiniu.com'; | ||
break; | ||
case 'na0': | ||
this.rsHost = 'rs-na0.qiniu.com'; | ||
this.rsfHost = 'rsf-na0.qiniu.com'; | ||
this.apiHost = 'api-na0.qiniu.com'; | ||
break; | ||
case 'as0': | ||
this.rsHost = 'rs-as0.qiniu.com'; | ||
this.rsfHost = 'rsf-as0.qiniu.com'; | ||
this.apiHost = 'api-as0.qiniu.com'; | ||
break; | ||
default: | ||
this.rsHost = 'rs.qiniu.com'; | ||
this.rsfHost = 'rsf.qiniu.com'; | ||
this.apiHost = 'api.qiniu.com'; | ||
break; | ||
} | ||
} | ||
} | ||
} | ||
} | ||
}; |
126
qiniu/fop.js
@@ -11,4 +11,4 @@ const util = require('./util'); | ||
function OperationManager(mac, config) { | ||
this.mac = mac || new digest.Mac(); | ||
this.config = config || new conf.Config(); | ||
this.mac = mac || new digest.Mac(); | ||
this.config = config || new conf.Config(); | ||
} | ||
@@ -26,59 +26,59 @@ | ||
OperationManager.prototype.pfop = function(bucket, key, fops, pipeline, | ||
options, callbackFunc) { | ||
options = options || {}; | ||
var that = this; | ||
//必须参数 | ||
var reqParams = { | ||
bucket: bucket, | ||
key: key, | ||
pipeline: pipeline, | ||
fops: fops.join(";"), | ||
}; | ||
options, callbackFunc) { | ||
options = options || {}; | ||
var that = this; | ||
//必须参数 | ||
var reqParams = { | ||
bucket: bucket, | ||
key: key, | ||
pipeline: pipeline, | ||
fops: fops.join(';'), | ||
}; | ||
//notifyURL | ||
if (options.notifyURL) { | ||
reqParams.notifyURL = options.notifyURL; | ||
} | ||
//notifyURL | ||
if (options.notifyURL) { | ||
reqParams.notifyURL = options.notifyURL; | ||
} | ||
//force | ||
if (options.force) { | ||
reqParams.force = 1; | ||
} | ||
//force | ||
if (options.force) { | ||
reqParams.force = 1; | ||
} | ||
var useCache = false; | ||
if (this.config.zone) { | ||
if (this.config.zoneExpire == -1) { | ||
useCache = true; | ||
} else { | ||
if (!util.isTimestampExpired(this.config.zoneExpire)) { | ||
useCache = true; | ||
} | ||
var useCache = false; | ||
if (this.config.zone) { | ||
if (this.config.zoneExpire == -1) { | ||
useCache = true; | ||
} else { | ||
if (!util.isTimestampExpired(this.config.zoneExpire)) { | ||
useCache = true; | ||
} | ||
} | ||
} | ||
} | ||
if (useCache) { | ||
pfopReq(this.mac, this.config, reqParams, callbackFunc); | ||
} else { | ||
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo, | ||
cZoneExpire) { | ||
if (err) { | ||
callbackFunc(err, null, null); | ||
return; | ||
} | ||
if (useCache) { | ||
pfopReq(this.mac, this.config, reqParams, callbackFunc); | ||
} else { | ||
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo, | ||
cZoneExpire) { | ||
if (err) { | ||
callbackFunc(err, null, null); | ||
return; | ||
} | ||
//update object | ||
that.config.zone = cZoneInfo; | ||
that.config.zoneExpire = cZoneExpire; | ||
//pfopReq | ||
pfopReq(that.mac, that.config, reqParams, callbackFunc); | ||
}); | ||
} | ||
} | ||
//update object | ||
that.config.zone = cZoneInfo; | ||
that.config.zoneExpire = cZoneExpire; | ||
//pfopReq | ||
pfopReq(that.mac, that.config, reqParams, callbackFunc); | ||
}); | ||
} | ||
}; | ||
function pfopReq(mac, config, reqParams, callbackFunc) { | ||
var scheme = config.useHttpsDomain ? "https://" : "http://"; | ||
var requestURI = scheme + config.zone.apiHost + '/pfop/'; | ||
var reqBody = querystring.stringify(reqParams); | ||
var auth = util.generateAccessToken(mac, requestURI, reqBody); | ||
rpc.postWithForm(requestURI, reqBody, auth, callbackFunc); | ||
var scheme = config.useHttpsDomain ? 'https://' : 'http://'; | ||
var requestURI = scheme + config.zone.apiHost + '/pfop/'; | ||
var reqBody = querystring.stringify(reqParams); | ||
var auth = util.generateAccessToken(mac, requestURI, reqBody); | ||
rpc.postWithForm(requestURI, reqBody, auth, callbackFunc); | ||
} | ||
@@ -90,14 +90,14 @@ | ||
OperationManager.prototype.prefop = function(persistentId, callbackFunc) { | ||
var apiHost = "api.qiniu.com"; | ||
if(this.config.zone) { | ||
apiHost=this.config.zone.apiHost; | ||
} | ||
var apiHost = 'api.qiniu.com'; | ||
if(this.config.zone) { | ||
apiHost=this.config.zone.apiHost; | ||
} | ||
var scheme = this.config.useHttpsDomain ? "https://" : "http://"; | ||
var requestURI = scheme + apiHost + "/status/get/prefop"; | ||
var reqParams = { | ||
id: persistentId | ||
}; | ||
var reqBody = querystring.stringify(reqParams); | ||
rpc.postWithForm(requestURI, reqBody, null, callbackFunc); | ||
} | ||
var scheme = this.config.useHttpsDomain ? 'https://' : 'http://'; | ||
var requestURI = scheme + apiHost + '/status/get/prefop'; | ||
var reqParams = { | ||
id: persistentId | ||
}; | ||
var reqBody = querystring.stringify(reqParams); | ||
rpc.postWithForm(requestURI, reqBody, null, callbackFunc); | ||
}; |
var urllib = require('urllib'); | ||
var util = require('./util'); | ||
var conf = require('./conf'); | ||
@@ -11,58 +10,58 @@ | ||
function postMultipart(requestURI, requestForm, callbackFunc) { | ||
return post(requestURI, requestForm, requestForm.headers(), callbackFunc); | ||
return post(requestURI, requestForm, requestForm.headers(), callbackFunc); | ||
} | ||
function postWithForm(requestURI, requestForm, token, callbackFunc) { | ||
var headers = { | ||
'Content-Type': 'application/x-www-form-urlencoded' | ||
}; | ||
if (token) { | ||
headers['Authorization'] = token; | ||
} | ||
return post(requestURI, requestForm, headers, callbackFunc); | ||
var headers = { | ||
'Content-Type': 'application/x-www-form-urlencoded' | ||
}; | ||
if (token) { | ||
headers['Authorization'] = token; | ||
} | ||
return post(requestURI, requestForm, headers, callbackFunc); | ||
} | ||
function postWithoutForm(requestURI, token, callbackFunc) { | ||
var headers = { | ||
'Content-Type': 'application/x-www-form-urlencoded', | ||
}; | ||
if (token) { | ||
headers['Authorization'] = token; | ||
} | ||
return post(requestURI, null, headers, callbackFunc); | ||
var headers = { | ||
'Content-Type': 'application/x-www-form-urlencoded', | ||
}; | ||
if (token) { | ||
headers['Authorization'] = token; | ||
} | ||
return post(requestURI, null, headers, callbackFunc); | ||
} | ||
function post(requestURI, requestForm, headers, callbackFunc) { | ||
//var start = parseInt(Date.now() / 1000); | ||
headers = headers || {}; | ||
headers['User-Agent'] = headers['User-Agent'] || conf.USER_AGENT; | ||
headers['Connection'] = 'keep-alive'; | ||
//var start = parseInt(Date.now() / 1000); | ||
headers = headers || {}; | ||
headers['User-Agent'] = headers['User-Agent'] || conf.USER_AGENT; | ||
headers['Connection'] = 'keep-alive'; | ||
var data = { | ||
headers: headers, | ||
method: 'POST', | ||
dataType: 'json', | ||
timeout: conf.RPC_TIMEOUT, | ||
gzip: true, | ||
var data = { | ||
headers: headers, | ||
method: 'POST', | ||
dataType: 'json', | ||
timeout: conf.RPC_TIMEOUT, | ||
gzip: true, | ||
// timing: true, | ||
}; | ||
}; | ||
if (conf.RPC_HTTP_AGENT) { | ||
data['agent'] = conf.RPC_HTTP_AGENT; | ||
} | ||
if (conf.RPC_HTTP_AGENT) { | ||
data['agent'] = conf.RPC_HTTP_AGENT; | ||
} | ||
if (conf.RPC_HTTPS_AGENT) { | ||
data['httpsAgent'] = conf.RPC_HTTPS_AGENT; | ||
} | ||
if (conf.RPC_HTTPS_AGENT) { | ||
data['httpsAgent'] = conf.RPC_HTTPS_AGENT; | ||
} | ||
if (Buffer.isBuffer(requestForm) || typeof requestForm === 'string') { | ||
data.content = requestForm; | ||
} else if (requestForm) { | ||
data.stream = requestForm; | ||
} else { | ||
data.headers['Content-Length'] = 0; | ||
}; | ||
if (Buffer.isBuffer(requestForm) || typeof requestForm === 'string') { | ||
data.content = requestForm; | ||
} else if (requestForm) { | ||
data.stream = requestForm; | ||
} else { | ||
data.headers['Content-Length'] = 0; | ||
} | ||
var req = urllib.request(requestURI, data, function(respErr, respBody, | ||
respInfo) { | ||
var req = urllib.request(requestURI, data, function(respErr, respBody, | ||
respInfo) { | ||
//var end = parseInt(Date.now() / 1000); | ||
@@ -77,6 +76,6 @@ // console.log((end - start) + " seconds"); | ||
callbackFunc(respErr, respBody, respInfo); | ||
}); | ||
callbackFunc(respErr, respBody, respInfo); | ||
}); | ||
return req; | ||
return req; | ||
} |
@@ -1,4 +0,4 @@ | ||
var http = require('http') | ||
var http = require('http'); | ||
const host = 'rtc.qiniuapi.com' | ||
const host = 'rtc.qiniuapi.com'; | ||
const headers = { | ||
@@ -27,3 +27,3 @@ 'Content-Type': 'application/json', | ||
message: res.statusMessage | ||
} | ||
}; | ||
fn(result, null); | ||
@@ -65,3 +65,3 @@ } else { | ||
message: res.statusMessage | ||
} | ||
}; | ||
fn(result, null); | ||
@@ -80,3 +80,3 @@ } else { | ||
req.end(); | ||
}; | ||
} | ||
@@ -92,4 +92,4 @@ | ||
}; | ||
post(credentials, options, app, fn) | ||
} | ||
post(credentials, options, app, fn); | ||
}; | ||
@@ -104,4 +104,4 @@ exports.getApp = function (appId, credentials, fn) { | ||
}; | ||
get(credentials, options, fn) | ||
} | ||
get(credentials, options, fn); | ||
}; | ||
@@ -116,4 +116,4 @@ exports.deleteApp = function (appId, credentials, fn) { | ||
}; | ||
get(credentials, options, fn) | ||
} | ||
get(credentials, options, fn); | ||
}; | ||
@@ -128,4 +128,4 @@ exports.updateApp = function (appId, app, credentials, fn) { | ||
}; | ||
post(credentials, options, app, fn) | ||
} | ||
post(credentials, options, app, fn); | ||
}; | ||
@@ -13,3 +13,3 @@ var util = require('./util'); | ||
return token; | ||
} | ||
}; | ||
@@ -42,3 +42,3 @@ Credentials.prototype._signRequest = function(options, body) { | ||
return sageDigest; | ||
} | ||
}; | ||
@@ -48,5 +48,5 @@ Credentials.prototype.sign = function(data) { | ||
var sageDigest = util.base64ToUrlSafe(digest); | ||
return this.accessKey + ":" + sageDigest; | ||
return this.accessKey + ':' + sageDigest; | ||
} | ||
}; | ||
@@ -62,4 +62,4 @@ Credentials.prototype.signJson = function(opt) { | ||
return token; | ||
} | ||
}; | ||
module.exports = exports = Credentials; |
@@ -1,4 +0,4 @@ | ||
var http = require('http') | ||
var http = require('http'); | ||
const host = 'rtc.qiniuapi.com' | ||
const host = 'rtc.qiniuapi.com'; | ||
const headers = { | ||
@@ -28,3 +28,3 @@ 'Content-Type': 'application/json', | ||
message: res.statusMessage | ||
} | ||
}; | ||
fn(result, null); | ||
@@ -45,38 +45,38 @@ } else { | ||
function post(credentials, options, data, fn) { | ||
var dataString = JSON.stringify(data); | ||
// function post(credentials, options, data, fn) { | ||
// var dataString = JSON.stringify(data); | ||
options.headers['Authorization'] = credentials.generateAccessToken(options, dataString); | ||
// options.headers['Authorization'] = credentials.generateAccessToken(options, dataString); | ||
var req = http.request(options, function(res) { | ||
res.setEncoding('utf-8'); | ||
// var req = http.request(options, function(res) { | ||
// res.setEncoding('utf-8'); | ||
var responseString = ''; | ||
// var responseString = ''; | ||
res.on('data', function(data) { | ||
responseString += data; | ||
}); | ||
// res.on('data', function(data) { | ||
// responseString += data; | ||
// }); | ||
res.on('end', function() { | ||
var resultObject = JSON.parse(responseString); | ||
// res.on('end', function() { | ||
// var resultObject = JSON.parse(responseString); | ||
if (res.statusCode != 200) { | ||
var result = { | ||
code: res.statusCode, | ||
message: res.statusMessage | ||
} | ||
fn(result, null); | ||
} else { | ||
fn(null, resultObject); | ||
} | ||
}); | ||
}); | ||
req.on('error', function(e) { | ||
fn(e, null); | ||
}); | ||
// if (res.statusCode != 200) { | ||
// var result = { | ||
// code: res.statusCode, | ||
// message: res.statusMessage | ||
// }; | ||
// fn(result, null); | ||
// } else { | ||
// fn(null, resultObject); | ||
// } | ||
// }); | ||
// }); | ||
// req.on('error', function(e) { | ||
// fn(e, null); | ||
// }); | ||
req.write(dataString); | ||
// req.write(dataString); | ||
req.end(); | ||
}; | ||
// req.end(); | ||
// } | ||
@@ -92,4 +92,4 @@ | ||
}; | ||
get(credentials, options, fn) | ||
} | ||
get(credentials, options, fn); | ||
}; | ||
@@ -104,4 +104,4 @@ exports.kickUser = function (appId, roomName, userId, credentials, fn) { | ||
}; | ||
get(credentials, options, fn) | ||
} | ||
get(credentials, options, fn); | ||
}; | ||
@@ -112,8 +112,8 @@ exports.listActiveRooms = function (appId, roomNamePrefix, offset, limit, credentials, fn) { | ||
port: 80, | ||
path: '/v3/apps/' + appId + "/rooms?prefix=" + roomNamePrefix + "&offset=" + offset + "&limit=" + limit , | ||
path: '/v3/apps/' + appId + '/rooms?prefix=' + roomNamePrefix + '&offset=' + offset + '&limit=' + limit , | ||
method: 'GET', | ||
headers: headers | ||
}; | ||
get(credentials, options, fn) | ||
} | ||
get(credentials, options, fn); | ||
}; | ||
@@ -126,3 +126,3 @@ exports.getRoomToken = function (roomAccess, credentials) { | ||
} | ||
}; | ||
@@ -1,6 +0,6 @@ | ||
var crypto = require('crypto') | ||
var crypto = require('crypto'); | ||
exports.base64ToUrlSafe = function(v) { | ||
return v.replace(/\//g, '_').replace(/\+/g, '-'); | ||
} | ||
}; | ||
@@ -10,3 +10,3 @@ exports.urlsafeBase64Encode = function(jsonFlags) { | ||
return exports.base64ToUrlSafe(encoded); | ||
} | ||
}; | ||
@@ -17,2 +17,2 @@ exports.hmacSha1 = function(encodedFlags, secretKey) { | ||
return hmac.digest('base64'); | ||
} | ||
}; |
@@ -11,3 +11,2 @@ const conf = require('../conf'); | ||
const zone = require('../zone'); | ||
const digest = require('../auth/digest'); | ||
@@ -18,3 +17,3 @@ exports.FormUploader = FormUploader; | ||
function FormUploader(config) { | ||
this.config = config || new conf.Config(); | ||
this.config = config || new conf.Config(); | ||
} | ||
@@ -29,92 +28,92 @@ | ||
function PutExtra(fname, params, mimeType, crc32, checkCrc) { | ||
this.fname = fname || ''; | ||
this.params = params || {}; | ||
this.mimeType = mimeType || null; | ||
this.crc32 = crc32 || null; | ||
this.checkCrc = checkCrc || 1; | ||
this.fname = fname || ''; | ||
this.params = params || {}; | ||
this.mimeType = mimeType || null; | ||
this.crc32 = crc32 || null; | ||
this.checkCrc = checkCrc || 1; | ||
} | ||
FormUploader.prototype.putStream = function(uploadToken, key, fsStream, | ||
putExtra, callbackFunc) { | ||
putExtra = putExtra || new PutExtra(); | ||
if (!putExtra.mimeType) { | ||
putExtra.mimeType = 'application/octet-stream'; | ||
} | ||
putExtra, callbackFunc) { | ||
putExtra = putExtra || new PutExtra(); | ||
if (!putExtra.mimeType) { | ||
putExtra.mimeType = 'application/octet-stream'; | ||
} | ||
if (!putExtra.fname) { | ||
putExtra.fname = key ? key : 'fname'; | ||
} | ||
if (!putExtra.fname) { | ||
putExtra.fname = key ? key : 'fname'; | ||
} | ||
fsStream.on("error", function(err) { | ||
fsStream.on('error', function(err) { | ||
//callbackFunc | ||
callbackFunc(err, null, null); | ||
return; | ||
}); | ||
callbackFunc(err, null, null); | ||
return; | ||
}); | ||
var useCache = false; | ||
var that = this; | ||
if (this.config.zone) { | ||
if (this.config.zoneExpire == -1) { | ||
useCache = true; | ||
} else { | ||
if (!util.isTimestampExpired(this.config.zoneExpire)) { | ||
useCache = true; | ||
} | ||
var useCache = false; | ||
var that = this; | ||
if (this.config.zone) { | ||
if (this.config.zoneExpire == -1) { | ||
useCache = true; | ||
} else { | ||
if (!util.isTimestampExpired(this.config.zoneExpire)) { | ||
useCache = true; | ||
} | ||
} | ||
} | ||
} | ||
var accessKey = util.getAKFromUptoken(uploadToken); | ||
var bucket = util.getBucketFromUptoken(uploadToken); | ||
if (useCache) { | ||
createMultipartForm(uploadToken, key, fsStream, putExtra, function( | ||
postForm) { | ||
putReq(that.config, postForm, callbackFunc); | ||
}); | ||
} else { | ||
zone.getZoneInfo(accessKey, bucket, function(err, cZoneInfo, | ||
cZoneExpire) { | ||
if (err) { | ||
callbackFunc(err, null, null); | ||
return; | ||
} | ||
var accessKey = util.getAKFromUptoken(uploadToken); | ||
var bucket = util.getBucketFromUptoken(uploadToken); | ||
if (useCache) { | ||
createMultipartForm(uploadToken, key, fsStream, putExtra, function( | ||
postForm) { | ||
putReq(that.config, postForm, callbackFunc); | ||
}); | ||
} else { | ||
zone.getZoneInfo(accessKey, bucket, function(err, cZoneInfo, | ||
cZoneExpire) { | ||
if (err) { | ||
callbackFunc(err, null, null); | ||
return; | ||
} | ||
//update object | ||
that.config.zone = cZoneInfo; | ||
that.config.zoneExpire = cZoneExpire; | ||
//update object | ||
that.config.zone = cZoneInfo; | ||
that.config.zoneExpire = cZoneExpire; | ||
//req | ||
createMultipartForm(uploadToken, key, fsStream, | ||
putExtra, | ||
function(postForm) { | ||
putReq(that.config, postForm, callbackFunc); | ||
//req | ||
createMultipartForm(uploadToken, key, fsStream, | ||
putExtra, | ||
function(postForm) { | ||
putReq(that.config, postForm, callbackFunc); | ||
}); | ||
}); | ||
}); | ||
} | ||
} | ||
} | ||
}; | ||
function putReq(config, postForm, callbackFunc) { | ||
//set up hosts order | ||
var upHosts = []; | ||
//set up hosts order | ||
var upHosts = []; | ||
if (config.useCdnDomain) { | ||
if (config.zone.cdnUpHosts) { | ||
config.zone.cdnUpHosts.forEach(function(host) { | ||
upHosts.push(host); | ||
}); | ||
if (config.useCdnDomain) { | ||
if (config.zone.cdnUpHosts) { | ||
config.zone.cdnUpHosts.forEach(function(host) { | ||
upHosts.push(host); | ||
}); | ||
} | ||
config.zone.srcUpHosts.forEach(function(host) { | ||
upHosts.push(host); | ||
}); | ||
} else { | ||
config.zone.srcUpHosts.forEach(function(host) { | ||
upHosts.push(host); | ||
}); | ||
config.zone.cdnUpHosts.forEach(function(host) { | ||
upHosts.push(host); | ||
}); | ||
} | ||
config.zone.srcUpHosts.forEach(function(host) { | ||
upHosts.push(host); | ||
}); | ||
} else { | ||
config.zone.srcUpHosts.forEach(function(host) { | ||
upHosts.push(host); | ||
}); | ||
config.zone.cdnUpHosts.forEach(function(host) { | ||
upHosts.push(host); | ||
}); | ||
} | ||
var scheme = config.useHttpsDomain ? "https://" : "http://"; | ||
var upDomain = scheme + upHosts[0]; | ||
rpc.postMultipart(upDomain, postForm, callbackFunc); | ||
var scheme = config.useHttpsDomain ? 'https://' : 'http://'; | ||
var upDomain = scheme + upHosts[0]; | ||
rpc.postMultipart(upDomain, postForm, callbackFunc); | ||
} | ||
@@ -125,41 +124,41 @@ | ||
FormUploader.prototype.put = function(uploadToken, key, body, putExtra, | ||
callbackFunc) { | ||
var fsStream = new Readable(); | ||
fsStream.push(body); | ||
fsStream.push(null); | ||
callbackFunc) { | ||
var fsStream = new Readable(); | ||
fsStream.push(body); | ||
fsStream.push(null); | ||
putExtra = putExtra || new PutExtra(); | ||
return this.putStream(uploadToken, key, fsStream, putExtra, callbackFunc) | ||
} | ||
putExtra = putExtra || new PutExtra(); | ||
return this.putStream(uploadToken, key, fsStream, putExtra, callbackFunc); | ||
}; | ||
FormUploader.prototype.putWithoutKey = function(uploadToken, body, putExtra, | ||
callbackFunc) { | ||
return this.put(uploadToken, null, body, putExtra, callbackFunc); | ||
} | ||
callbackFunc) { | ||
return this.put(uploadToken, null, body, putExtra, callbackFunc); | ||
}; | ||
function createMultipartForm(uploadToken, key, fsStream, putExtra, callbackFunc) { | ||
var postForm = formstream(); | ||
postForm.field('token', uploadToken); | ||
if (key) { | ||
postForm.field('key', key); | ||
} | ||
postForm.stream('file', fsStream, putExtra.fname, putExtra.mimeType); | ||
var postForm = formstream(); | ||
postForm.field('token', uploadToken); | ||
if (key) { | ||
postForm.field('key', key); | ||
} | ||
postForm.stream('file', fsStream, putExtra.fname, putExtra.mimeType); | ||
//putExtra params | ||
for (var k in putExtra.params) { | ||
if (k.startsWith("x:")) { | ||
postForm.field(k, putExtra.params[k].toString()); | ||
//putExtra params | ||
for (var k in putExtra.params) { | ||
if (k.startsWith('x:')) { | ||
postForm.field(k, putExtra.params[k].toString()); | ||
} | ||
} | ||
} | ||
var fileBody = []; | ||
fsStream.on('data', function(data) { | ||
fileBody.push(data); | ||
}); | ||
var fileBody = []; | ||
fsStream.on('data', function(data) { | ||
fileBody.push(data); | ||
}); | ||
fsStream.on('end', function() { | ||
fileBody = Buffer.concat(fileBody); | ||
var bodyCrc32 = parseInt("0x" + getCrc32(fileBody)); | ||
postForm.field('crc32', bodyCrc32); | ||
}); | ||
callbackFunc(postForm); | ||
fsStream.on('end', function() { | ||
fileBody = Buffer.concat(fileBody); | ||
var bodyCrc32 = parseInt('0x' + getCrc32(fileBody)); | ||
postForm.field('crc32', bodyCrc32); | ||
}); | ||
callbackFunc(postForm); | ||
} | ||
@@ -175,20 +174,20 @@ | ||
FormUploader.prototype.putFile = function(uploadToken, key, localFile, putExtra, | ||
callbackFunc) { | ||
putExtra = putExtra || new PutExtra(); | ||
var fsStream = fs.createReadStream(localFile); | ||
callbackFunc) { | ||
putExtra = putExtra || new PutExtra(); | ||
var fsStream = fs.createReadStream(localFile); | ||
if (!putExtra.mimeType) { | ||
putExtra.mimeType = mime.getType(localFile); | ||
} | ||
if (!putExtra.mimeType) { | ||
putExtra.mimeType = mime.getType(localFile); | ||
} | ||
if (!putExtra.fname) { | ||
putExtra.fname = path.basename(localFile); | ||
} | ||
if (!putExtra.fname) { | ||
putExtra.fname = path.basename(localFile); | ||
} | ||
return this.putStream(uploadToken, key, fsStream, putExtra, callbackFunc); | ||
} | ||
return this.putStream(uploadToken, key, fsStream, putExtra, callbackFunc); | ||
}; | ||
FormUploader.prototype.putFileWithoutKey = function(uploadToken, localFile, | ||
putExtra, callbackFunc) { | ||
return this.putFile(uploadToken, null, localFile, putExtra, callbackFunc); | ||
} | ||
putExtra, callbackFunc) { | ||
return this.putFile(uploadToken, null, localFile, putExtra, callbackFunc); | ||
}; |
@@ -14,3 +14,3 @@ const conf = require('../conf'); | ||
function ResumeUploader(config) { | ||
this.config = config || new conf.Config(); | ||
this.config = config || new conf.Config(); | ||
} | ||
@@ -25,267 +25,269 @@ | ||
function PutExtra(fname, params, mimeType, resumeRecordFile, progressCallback) { | ||
this.fname = fname || ''; | ||
this.params = params || {}; | ||
this.mimeType = mimeType || null; | ||
this.resumeRecordFile = resumeRecordFile || null; | ||
this.progressCallback = progressCallback || null; | ||
this.fname = fname || ''; | ||
this.params = params || {}; | ||
this.mimeType = mimeType || null; | ||
this.resumeRecordFile = resumeRecordFile || null; | ||
this.progressCallback = progressCallback || null; | ||
} | ||
ResumeUploader.prototype.putStream = function(uploadToken, key, rsStream, | ||
rsStreamLen, putExtra, callbackFunc) { | ||
putExtra = putExtra || new PutExtra(); | ||
if (!putExtra.mimeType) { | ||
putExtra.mimeType = 'application/octet-stream'; | ||
} | ||
rsStreamLen, putExtra, callbackFunc) { | ||
putExtra = putExtra || new PutExtra(); | ||
if (!putExtra.mimeType) { | ||
putExtra.mimeType = 'application/octet-stream'; | ||
} | ||
if (!putExtra.fname) { | ||
putExtra.fname = key ? key : '?'; | ||
} | ||
if (!putExtra.fname) { | ||
putExtra.fname = key ? key : '?'; | ||
} | ||
rsStream.on("error", function(err) { | ||
rsStream.on('error', function(err) { | ||
//callbackFunc | ||
callbackFunc(err, null, null); | ||
rsStream.close(); | ||
return; | ||
}); | ||
var useCache = false; | ||
var that = this; | ||
if (this.config.zone) { | ||
if (this.config.zoneExpire == -1) { | ||
useCache = true; | ||
} else { | ||
if (!util.isTimestampExpired(this.config.zoneExpire)) { | ||
useCache = true; | ||
} | ||
} | ||
} | ||
var accessKey = util.getAKFromUptoken(uploadToken); | ||
var bucket = util.getBucketFromUptoken(uploadToken); | ||
if (useCache) { | ||
putReq(this.config, uploadToken, key, rsStream, rsStreamLen, putExtra, | ||
callbackFunc); | ||
} else { | ||
zone.getZoneInfo(accessKey, bucket, function(err, cZoneInfo, | ||
cZoneExpire) { | ||
if (err) { | ||
callbackFunc(err, null, null); | ||
rsStream.close(); | ||
return; | ||
} | ||
}); | ||
//update object | ||
that.config.zone = cZoneInfo; | ||
that.config.zoneExpire = cZoneExpire; | ||
var useCache = false; | ||
var that = this; | ||
if (this.config.zone) { | ||
if (this.config.zoneExpire == -1) { | ||
useCache = true; | ||
} else { | ||
if (!util.isTimestampExpired(this.config.zoneExpire)) { | ||
useCache = true; | ||
} | ||
} | ||
} | ||
//req | ||
putReq(that.config, uploadToken, key, rsStream, rsStreamLen, | ||
putExtra, | ||
callbackFunc); | ||
}); | ||
} | ||
} | ||
var accessKey = util.getAKFromUptoken(uploadToken); | ||
var bucket = util.getBucketFromUptoken(uploadToken); | ||
if (useCache) { | ||
putReq(this.config, uploadToken, key, rsStream, rsStreamLen, putExtra, | ||
callbackFunc); | ||
} else { | ||
zone.getZoneInfo(accessKey, bucket, function(err, cZoneInfo, | ||
cZoneExpire) { | ||
if (err) { | ||
callbackFunc(err, null, null); | ||
rsStream.close(); | ||
return; | ||
} | ||
//update object | ||
that.config.zone = cZoneInfo; | ||
that.config.zoneExpire = cZoneExpire; | ||
//req | ||
putReq(that.config, uploadToken, key, rsStream, rsStreamLen, | ||
putExtra, | ||
callbackFunc); | ||
}); | ||
} | ||
}; | ||
function putReq(config, uploadToken, key, rsStream, rsStreamLen, putExtra, | ||
callbackFunc) { | ||
//set up hosts order | ||
var upHosts = []; | ||
callbackFunc) { | ||
//set up hosts order | ||
var upHosts = []; | ||
if (config.useCdnDomain) { | ||
if (config.zone.cdnUpHosts) { | ||
config.zone.cdnUpHosts.forEach(function(host) { | ||
upHosts.push(host); | ||
}); | ||
if (config.useCdnDomain) { | ||
if (config.zone.cdnUpHosts) { | ||
config.zone.cdnUpHosts.forEach(function(host) { | ||
upHosts.push(host); | ||
}); | ||
} | ||
config.zone.srcUpHosts.forEach(function(host) { | ||
upHosts.push(host); | ||
}); | ||
} else { | ||
config.zone.srcUpHosts.forEach(function(host) { | ||
upHosts.push(host); | ||
}); | ||
config.zone.cdnUpHosts.forEach(function(host) { | ||
upHosts.push(host); | ||
}); | ||
} | ||
config.zone.srcUpHosts.forEach(function(host) { | ||
upHosts.push(host); | ||
}); | ||
} else { | ||
config.zone.srcUpHosts.forEach(function(host) { | ||
upHosts.push(host); | ||
}); | ||
config.zone.cdnUpHosts.forEach(function(host) { | ||
upHosts.push(host); | ||
}); | ||
} | ||
var scheme = config.useHttpsDomain ? "https://" : "http://"; | ||
var upDomain = scheme + upHosts[0]; | ||
// block upload | ||
var scheme = config.useHttpsDomain ? 'https://' : 'http://'; | ||
var upDomain = scheme + upHosts[0]; | ||
// block upload | ||
var fileSize = rsStreamLen; | ||
//console.log("file size:" + fileSize); | ||
var blockCnt = fileSize / conf.BLOCK_SIZE | ||
var totalBlockNum = (fileSize % conf.BLOCK_SIZE == 0) ? blockCnt : (blockCnt + | ||
var fileSize = rsStreamLen; | ||
//console.log("file size:" + fileSize); | ||
var blockCnt = fileSize / conf.BLOCK_SIZE; | ||
var totalBlockNum = (fileSize % conf.BLOCK_SIZE == 0) ? blockCnt : (blockCnt + | ||
1); | ||
var finishedBlock = 0; | ||
var curBlock = 0; | ||
var readLen = 0; | ||
var bufferLen = 0; | ||
var remainedData = new Buffer(0); | ||
var readBuffers = []; | ||
var finishedCtxList = []; | ||
var finishedBlkPutRets = []; | ||
//read resumeRecordFile | ||
if (putExtra.resumeRecordFile) { | ||
try { | ||
var resumeRecords = fs.readFileSync(putExtra.resumeRecordFile).toString(); | ||
var blkputRets = JSON.parse(resumeRecords); | ||
var finishedBlock = 0; | ||
var curBlock = 0; | ||
var readLen = 0; | ||
var bufferLen = 0; | ||
var remainedData = new Buffer(0); | ||
var readBuffers = []; | ||
var finishedCtxList = []; | ||
var finishedBlkPutRets = []; | ||
//read resumeRecordFile | ||
if (putExtra.resumeRecordFile) { | ||
try { | ||
var resumeRecords = fs.readFileSync(putExtra.resumeRecordFile).toString(); | ||
var blkputRets = JSON.parse(resumeRecords); | ||
for (var index = 0; index < blkputRets.length; index++) { | ||
//check ctx expired or not | ||
var blkputRet = blkputRets[index]; | ||
var expiredAt = blkputRet.expired_at; | ||
//make sure the ctx at least has one day expiration | ||
expiredAt += 3600 * 24; | ||
if (util.isTimestampExpired(expiredAt)) { | ||
//discard these ctxs | ||
break; | ||
for (var index = 0; index < blkputRets.length; index++) { | ||
//check ctx expired or not | ||
var blkputRet = blkputRets[index]; | ||
var expiredAt = blkputRet.expired_at; | ||
//make sure the ctx at least has one day expiration | ||
expiredAt += 3600 * 24; | ||
if (util.isTimestampExpired(expiredAt)) { | ||
//discard these ctxs | ||
break; | ||
} | ||
finishedBlock += 1; | ||
finishedCtxList.push(blkputRet.ctx); | ||
} | ||
} catch (e) { | ||
// log(e); | ||
} | ||
} | ||
finishedBlock += 1; | ||
finishedCtxList.push(blkputRet.ctx); | ||
} | ||
} catch (e) {} | ||
} | ||
var isEnd = rsStream._readableState.ended; | ||
var isSent = false; | ||
var isEnd = rsStream._readableState.ended; | ||
var isSent = false; | ||
//check when to mkblk | ||
rsStream.on('data', function(chunk) { | ||
readLen += chunk.length; | ||
bufferLen += chunk.length; | ||
readBuffers.push(chunk); | ||
//check when to mkblk | ||
rsStream.on('data', function(chunk) { | ||
readLen += chunk.length; | ||
bufferLen += chunk.length; | ||
readBuffers.push(chunk); | ||
if (bufferLen >= conf.BLOCK_SIZE || readLen == fileSize) { | ||
var readBuffersData = Buffer.concat(readBuffers); | ||
var blockSize = conf.BLOCK_SIZE - remainedData.length; | ||
if (bufferLen >= conf.BLOCK_SIZE || readLen == fileSize) { | ||
var readBuffersData = Buffer.concat(readBuffers); | ||
var blockSize = conf.BLOCK_SIZE - remainedData.length; | ||
var postData = Buffer.concat([remainedData, readBuffersData.slice(0,blockSize)]); | ||
remainedData = new Buffer(readBuffersData.slice(blockSize,bufferLen)); | ||
bufferLen = bufferLen - conf.BLOCK_SIZE; | ||
//reset buffer | ||
readBuffers = []; | ||
var postData = Buffer.concat([remainedData, readBuffersData.slice(0,blockSize)]); | ||
remainedData = new Buffer(readBuffersData.slice(blockSize,bufferLen)); | ||
bufferLen = bufferLen - conf.BLOCK_SIZE; | ||
//reset buffer | ||
readBuffers = []; | ||
curBlock += 1; //set current block | ||
if (curBlock > finishedBlock) { | ||
rsStream.pause(); | ||
mkblkReq(upDomain, uploadToken, postData, function(respErr, | ||
respBody, | ||
respInfo) { | ||
var bodyCrc32 = parseInt("0x" + getCrc32(postData)); | ||
if (respInfo.statusCode != 200 || respBody.crc32 != bodyCrc32) { | ||
callbackFunc(respErr, respBody, respInfo); | ||
rsStream.close(); | ||
return; | ||
} else { | ||
finishedBlock += 1; | ||
var blkputRet = respBody; | ||
finishedCtxList.push(blkputRet.ctx); | ||
finishedBlkPutRets.push(blkputRet); | ||
if (putExtra.progressCallback) { | ||
putExtra.progressCallback(readLen, fileSize); | ||
} | ||
if (putExtra.resumeRecordFile) { | ||
var contents = JSON.stringify(finishedBlkPutRets); | ||
console.log("write resume record " + putExtra.resumeRecordFile) | ||
fs.writeFileSync(putExtra.resumeRecordFile, contents, { | ||
encoding: 'utf-8' | ||
}); | ||
} | ||
curBlock += 1; //set current block | ||
if (curBlock > finishedBlock) { | ||
rsStream.pause(); | ||
mkblkReq(upDomain, uploadToken, postData, function(respErr, | ||
respBody, | ||
respInfo) { | ||
var bodyCrc32 = parseInt('0x' + getCrc32(postData)); | ||
if (respInfo.statusCode != 200 || respBody.crc32 != bodyCrc32) { | ||
callbackFunc(respErr, respBody, respInfo); | ||
rsStream.close(); | ||
return; | ||
} else { | ||
finishedBlock += 1; | ||
var blkputRet = respBody; | ||
finishedCtxList.push(blkputRet.ctx); | ||
finishedBlkPutRets.push(blkputRet); | ||
if (putExtra.progressCallback) { | ||
putExtra.progressCallback(readLen, fileSize); | ||
} | ||
if (putExtra.resumeRecordFile) { | ||
var contents = JSON.stringify(finishedBlkPutRets); | ||
// console.log('write resume record ' + putExtra.resumeRecordFile); | ||
fs.writeFileSync(putExtra.resumeRecordFile, contents, { | ||
encoding: 'utf-8' | ||
}); | ||
} | ||
rsStream.resume(); | ||
if (isEnd || finishedCtxList.length === Math.floor(totalBlockNum)) { | ||
mkfileReq(upDomain, uploadToken, fileSize, finishedCtxList, key, putExtra, callbackFunc); | ||
isSent = true; | ||
rsStream.resume(); | ||
if (isEnd || finishedCtxList.length === Math.floor(totalBlockNum)) { | ||
mkfileReq(upDomain, uploadToken, fileSize, finishedCtxList, key, putExtra, callbackFunc); | ||
isSent = true; | ||
} | ||
} | ||
}); | ||
} | ||
} | ||
}); | ||
} | ||
} | ||
}); | ||
} | ||
}); | ||
rsStream.on('end', function () { | ||
rsStream.on('end', function () { | ||
// 0B file won't trigger 'data' event | ||
if (!isSent && rsStreamLen === 0) { | ||
mkfileReq(upDomain, uploadToken, fileSize, finishedCtxList, key, putExtra, callbackFunc) | ||
} | ||
if (!isSent && rsStreamLen === 0) { | ||
mkfileReq(upDomain, uploadToken, fileSize, finishedCtxList, key, putExtra, callbackFunc); | ||
} | ||
rsStream.close(); | ||
}); | ||
rsStream.close(); | ||
}); | ||
} | ||
function mkblkReq(upDomain, uploadToken, blkData, callbackFunc) { | ||
//console.log("mkblk"); | ||
var requestURI = upDomain + "/mkblk/" + blkData.length; | ||
var auth = 'UpToken ' + uploadToken; | ||
var headers = { | ||
'Authorization': auth, | ||
'Content-Type': 'application/octet-stream' | ||
} | ||
rpc.post(requestURI, blkData, headers, callbackFunc); | ||
//console.log("mkblk"); | ||
var requestURI = upDomain + '/mkblk/' + blkData.length; | ||
var auth = 'UpToken ' + uploadToken; | ||
var headers = { | ||
'Authorization': auth, | ||
'Content-Type': 'application/octet-stream' | ||
}; | ||
rpc.post(requestURI, blkData, headers, callbackFunc); | ||
} | ||
function mkfileReq(upDomain, uploadToken, fileSize, ctxList, key, putExtra, | ||
callbackFunc) { | ||
//console.log("mkfile"); | ||
var requestURI = upDomain + "/mkfile/" + fileSize; | ||
if (key) { | ||
requestURI += "/key/" + util.urlsafeBase64Encode(key); | ||
} | ||
if (putExtra.mimeType) { | ||
requestURI += "/mimeType/" + util.urlsafeBase64Encode(putExtra.mimeType); | ||
} | ||
if (putExtra.fname) { | ||
requestURI += "/fname/" + util.urlsafeBase64Encode(putExtra.fname); | ||
} | ||
if (putExtra.params) { | ||
callbackFunc) { | ||
//console.log("mkfile"); | ||
var requestURI = upDomain + '/mkfile/' + fileSize; | ||
if (key) { | ||
requestURI += '/key/' + util.urlsafeBase64Encode(key); | ||
} | ||
if (putExtra.mimeType) { | ||
requestURI += '/mimeType/' + util.urlsafeBase64Encode(putExtra.mimeType); | ||
} | ||
if (putExtra.fname) { | ||
requestURI += '/fname/' + util.urlsafeBase64Encode(putExtra.fname); | ||
} | ||
if (putExtra.params) { | ||
//putExtra params | ||
for (var k in putExtra.params) { | ||
if (k.startsWith("x:") && putExtra.params[k]) { | ||
requestURI += "/" + k + "/" + util.urlsafeBase64Encode(putExtra.params[ | ||
k].toString()); | ||
} | ||
for (var k in putExtra.params) { | ||
if (k.startsWith('x:') && putExtra.params[k]) { | ||
requestURI += '/' + k + '/' + util.urlsafeBase64Encode(putExtra.params[ | ||
k].toString()); | ||
} | ||
} | ||
} | ||
} | ||
var auth = 'UpToken ' + uploadToken; | ||
var headers = { | ||
'Authorization': auth, | ||
'Content-Type': 'application/octet-stream' | ||
} | ||
var postBody = ctxList.join(","); | ||
rpc.post(requestURI, postBody, headers, function(err, ret, info) { | ||
if (info.statusCode == 200 || info.statusCode == 701 || | ||
var auth = 'UpToken ' + uploadToken; | ||
var headers = { | ||
'Authorization': auth, | ||
'Content-Type': 'application/octet-stream' | ||
}; | ||
var postBody = ctxList.join(','); | ||
rpc.post(requestURI, postBody, headers, function(err, ret, info) { | ||
if (info.statusCode == 200 || info.statusCode == 701 || | ||
info.statusCode == 401) { | ||
if (putExtra.resumeRecordFile) { | ||
fs.unlinkSync(putExtra.resumeRecordFile); | ||
} | ||
} | ||
callbackFunc(err, ret, info); | ||
}); | ||
if (putExtra.resumeRecordFile) { | ||
fs.unlinkSync(putExtra.resumeRecordFile); | ||
} | ||
} | ||
callbackFunc(err, ret, info); | ||
}); | ||
} | ||
ResumeUploader.prototype.putFile = function(uploadToken, key, localFile, | ||
putExtra, callbackFunc) { | ||
putExtra = putExtra || new PutExtra(); | ||
var rsStream = fs.createReadStream(localFile,{ | ||
highWaterMark: conf.BLOCK_SIZE, | ||
}); | ||
var rsStreamLen = fs.statSync(localFile).size; | ||
if (!putExtra.mimeType) { | ||
putExtra.mimeType = mime.getType(localFile); | ||
} | ||
putExtra, callbackFunc) { | ||
putExtra = putExtra || new PutExtra(); | ||
var rsStream = fs.createReadStream(localFile,{ | ||
highWaterMark: conf.BLOCK_SIZE, | ||
}); | ||
var rsStreamLen = fs.statSync(localFile).size; | ||
if (!putExtra.mimeType) { | ||
putExtra.mimeType = mime.getType(localFile); | ||
} | ||
if (!putExtra.fname) { | ||
putExtra.fname = path.basename(localFile); | ||
} | ||
if (!putExtra.fname) { | ||
putExtra.fname = path.basename(localFile); | ||
} | ||
return this.putStream(uploadToken, key, rsStream, rsStreamLen, putExtra, | ||
callbackFunc); | ||
} | ||
return this.putStream(uploadToken, key, rsStream, rsStreamLen, putExtra, | ||
callbackFunc); | ||
}; | ||
ResumeUploader.prototype.putFileWithoutKey = function(uploadToken, localFile, | ||
putExtra, callbackFunc) { | ||
return this.putFile(uploadToken, null, localFile, putExtra, callbackFunc); | ||
} | ||
putExtra, callbackFunc) { | ||
return this.putFile(uploadToken, null, localFile, putExtra, callbackFunc); | ||
}; |
@@ -1,4 +0,1 @@ | ||
const url = require('url'); | ||
const crypto = require('crypto'); | ||
const formstream = require('formstream'); | ||
const querystring = require('querystring'); | ||
@@ -16,4 +13,4 @@ const encodeUrl = require('encodeurl'); | ||
function BucketManager(mac, config) { | ||
this.mac = mac || new digest.Mac(); | ||
this.config = config || new conf.Config(); | ||
this.mac = mac || new digest.Mac(); | ||
this.config = config || new conf.Config(); | ||
} | ||
@@ -27,39 +24,39 @@ | ||
BucketManager.prototype.stat = function(bucket, key, callbackFunc) { | ||
var useCache = false; | ||
var that = this; | ||
if (this.config.zone) { | ||
if (this.config.zoneExpire == -1) { | ||
useCache = true; | ||
} else { | ||
if (!util.isTimestampExpired(this.config.zoneExpire)) { | ||
useCache = true; | ||
} | ||
var useCache = false; | ||
var that = this; | ||
if (this.config.zone) { | ||
if (this.config.zoneExpire == -1) { | ||
useCache = true; | ||
} else { | ||
if (!util.isTimestampExpired(this.config.zoneExpire)) { | ||
useCache = true; | ||
} | ||
} | ||
} | ||
} | ||
if (useCache) { | ||
statReq(this.mac, this.config, bucket, key, callbackFunc); | ||
} else { | ||
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo, | ||
cZoneExpire) { | ||
if (err) { | ||
callbackFunc(err, null, null); | ||
return; | ||
} | ||
if (useCache) { | ||
statReq(this.mac, this.config, bucket, key, callbackFunc); | ||
} else { | ||
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo, | ||
cZoneExpire) { | ||
if (err) { | ||
callbackFunc(err, null, null); | ||
return; | ||
} | ||
//update object | ||
that.config.zone = cZoneInfo; | ||
that.config.zoneExpire = cZoneExpire; | ||
//req | ||
statReq(that.mac, that.config, bucket, key, callbackFunc); | ||
}); | ||
} | ||
} | ||
//update object | ||
that.config.zone = cZoneInfo; | ||
that.config.zoneExpire = cZoneExpire; | ||
//req | ||
statReq(that.mac, that.config, bucket, key, callbackFunc); | ||
}); | ||
} | ||
}; | ||
function statReq(mac, config, bucket, key, callbackFunc) { | ||
var scheme = config.useHttpsDomain ? "https://" : "http://"; | ||
var statOp = exports.statOp(bucket, key); | ||
var requestURI = scheme + config.zone.rsHost + statOp; | ||
var digest = util.generateAccessToken(mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
var scheme = config.useHttpsDomain ? 'https://' : 'http://'; | ||
var statOp = exports.statOp(bucket, key); | ||
var requestURI = scheme + config.zone.rsHost + statOp; | ||
var digest = util.generateAccessToken(mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
} | ||
@@ -74,41 +71,41 @@ | ||
BucketManager.prototype.changeMime = function(bucket, key, newMime, | ||
callbackFunc) { | ||
var useCache = false; | ||
var that = this; | ||
if (this.config.zone) { | ||
if (this.config.zoneExpire == -1) { | ||
useCache = true; | ||
} else { | ||
if (!util.isTimestampExpired(this.config.zoneExpire)) { | ||
useCache = true; | ||
} | ||
callbackFunc) { | ||
var useCache = false; | ||
var that = this; | ||
if (this.config.zone) { | ||
if (this.config.zoneExpire == -1) { | ||
useCache = true; | ||
} else { | ||
if (!util.isTimestampExpired(this.config.zoneExpire)) { | ||
useCache = true; | ||
} | ||
} | ||
} | ||
} | ||
if (useCache) { | ||
changeMimeReq(this.mac, this.config, bucket, key, newMime, callbackFunc); | ||
} else { | ||
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo, | ||
cZoneExpire) { | ||
if (err) { | ||
callbackFunc(err, null, null); | ||
return; | ||
} | ||
if (useCache) { | ||
changeMimeReq(this.mac, this.config, bucket, key, newMime, callbackFunc); | ||
} else { | ||
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo, | ||
cZoneExpire) { | ||
if (err) { | ||
callbackFunc(err, null, null); | ||
return; | ||
} | ||
//update object | ||
that.config.zone = cZoneInfo; | ||
that.config.zoneExpire = cZoneExpire; | ||
//req | ||
changeMimeReq(that.mac, that.config, bucket, key, newMime, | ||
callbackFunc); | ||
}); | ||
} | ||
} | ||
//update object | ||
that.config.zone = cZoneInfo; | ||
that.config.zoneExpire = cZoneExpire; | ||
//req | ||
changeMimeReq(that.mac, that.config, bucket, key, newMime, | ||
callbackFunc); | ||
}); | ||
} | ||
}; | ||
function changeMimeReq(mac, config, bucket, key, newMime, callbackFunc) { | ||
var scheme = config.useHttpsDomain ? "https://" : "http://"; | ||
var changeMimeOp = exports.changeMimeOp(bucket, key, newMime); | ||
var requestURI = scheme + config.zone.rsHost + changeMimeOp; | ||
var digest = util.generateAccessToken(mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
var scheme = config.useHttpsDomain ? 'https://' : 'http://'; | ||
var changeMimeOp = exports.changeMimeOp(bucket, key, newMime); | ||
var requestURI = scheme + config.zone.rsHost + changeMimeOp; | ||
var digest = util.generateAccessToken(mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
} | ||
@@ -124,41 +121,41 @@ | ||
BucketManager.prototype.changeHeaders = function(bucket, key, headers, | ||
callbackFunc) { | ||
var useCache = false; | ||
var that = this; | ||
if (this.config.zone) { | ||
if (this.config.zoneExpire == -1) { | ||
useCache = true; | ||
} else { | ||
if (!util.isTimestampExpired(this.config.zoneExpire)) { | ||
useCache = true; | ||
} | ||
callbackFunc) { | ||
var useCache = false; | ||
var that = this; | ||
if (this.config.zone) { | ||
if (this.config.zoneExpire == -1) { | ||
useCache = true; | ||
} else { | ||
if (!util.isTimestampExpired(this.config.zoneExpire)) { | ||
useCache = true; | ||
} | ||
} | ||
} | ||
} | ||
if (useCache) { | ||
changeHeadersReq(this.mac, this.config, bucket, key, headers, callbackFunc); | ||
} else { | ||
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo, | ||
cZoneExpire) { | ||
if (err) { | ||
callbackFunc(err, null, null); | ||
return; | ||
} | ||
if (useCache) { | ||
changeHeadersReq(this.mac, this.config, bucket, key, headers, callbackFunc); | ||
} else { | ||
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo, | ||
cZoneExpire) { | ||
if (err) { | ||
callbackFunc(err, null, null); | ||
return; | ||
} | ||
//update object | ||
that.config.zone = cZoneInfo; | ||
that.config.zoneExpire = cZoneExpire; | ||
//req | ||
changeHeadersReq(that.mac, that.config, bucket, key, headers, | ||
callbackFunc); | ||
}); | ||
} | ||
} | ||
//update object | ||
that.config.zone = cZoneInfo; | ||
that.config.zoneExpire = cZoneExpire; | ||
//req | ||
changeHeadersReq(that.mac, that.config, bucket, key, headers, | ||
callbackFunc); | ||
}); | ||
} | ||
}; | ||
function changeHeadersReq(mac, config, bucket, key, headers, callbackFunc) { | ||
var scheme = config.useHttpsDomain ? "https://" : "http://"; | ||
var changeHeadersOp = exports.changeHeadersOp(bucket, key, headers); | ||
var requestURI = scheme + config.zone.rsHost + changeHeadersOp; | ||
var digest = util.generateAccessToken(mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
var scheme = config.useHttpsDomain ? 'https://' : 'http://'; | ||
var changeHeadersOp = exports.changeHeadersOp(bucket, key, headers); | ||
var requestURI = scheme + config.zone.rsHost + changeHeadersOp; | ||
var digest = util.generateAccessToken(mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
} | ||
@@ -176,43 +173,43 @@ | ||
BucketManager.prototype.move = function(srcBucket, srcKey, destBucket, destKey, | ||
options, callbackFunc) { | ||
var useCache = false; | ||
var that = this; | ||
if (this.config.zone) { | ||
if (this.config.zoneExpire == -1) { | ||
useCache = true; | ||
} else { | ||
if (!util.isTimestampExpired(this.config.zoneExpire)) { | ||
useCache = true; | ||
} | ||
options, callbackFunc) { | ||
var useCache = false; | ||
var that = this; | ||
if (this.config.zone) { | ||
if (this.config.zoneExpire == -1) { | ||
useCache = true; | ||
} else { | ||
if (!util.isTimestampExpired(this.config.zoneExpire)) { | ||
useCache = true; | ||
} | ||
} | ||
} | ||
} | ||
if (useCache) { | ||
moveReq(this.mac, this.config, srcBucket, srcKey, destBucket, destKey, | ||
options, callbackFunc); | ||
} else { | ||
zone.getZoneInfo(this.mac.accessKey, srcBucket, function(err, cZoneInfo, | ||
cZoneExpire) { | ||
if (err) { | ||
callbackFunc(err, null, null); | ||
return; | ||
} | ||
if (useCache) { | ||
moveReq(this.mac, this.config, srcBucket, srcKey, destBucket, destKey, | ||
options, callbackFunc); | ||
} else { | ||
zone.getZoneInfo(this.mac.accessKey, srcBucket, function(err, cZoneInfo, | ||
cZoneExpire) { | ||
if (err) { | ||
callbackFunc(err, null, null); | ||
return; | ||
} | ||
//update object | ||
that.config.zone = cZoneInfo; | ||
that.config.zoneExpire = cZoneExpire; | ||
//req | ||
moveReq(that.mac, that.config, srcBucket, srcKey, destBucket, | ||
destKey, options, callbackFunc); | ||
}); | ||
} | ||
} | ||
//update object | ||
that.config.zone = cZoneInfo; | ||
that.config.zoneExpire = cZoneExpire; | ||
//req | ||
moveReq(that.mac, that.config, srcBucket, srcKey, destBucket, | ||
destKey, options, callbackFunc); | ||
}); | ||
} | ||
}; | ||
function moveReq(mac, config, srcBucket, srcKey, destBucket, destKey, | ||
options, callbackFunc) { | ||
var scheme = config.useHttpsDomain ? "https://" : "http://"; | ||
var moveOp = exports.moveOp(srcBucket, srcKey, destBucket, destKey, options); | ||
var requestURI = scheme + config.zone.rsHost + moveOp; | ||
var digest = util.generateAccessToken(mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
options, callbackFunc) { | ||
var scheme = config.useHttpsDomain ? 'https://' : 'http://'; | ||
var moveOp = exports.moveOp(srcBucket, srcKey, destBucket, destKey, options); | ||
var requestURI = scheme + config.zone.rsHost + moveOp; | ||
var digest = util.generateAccessToken(mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
} | ||
@@ -230,44 +227,44 @@ | ||
BucketManager.prototype.copy = function(srcBucket, srcKey, destBucket, destKey, | ||
options, callbackFunc) { | ||
var useCache = false; | ||
var that = this; | ||
if (this.config.zone) { | ||
if (this.config.zoneExpire == -1) { | ||
useCache = true; | ||
} else { | ||
if (!util.isTimestampExpired(this.config.zoneExpire)) { | ||
useCache = true; | ||
} | ||
options, callbackFunc) { | ||
var useCache = false; | ||
var that = this; | ||
if (this.config.zone) { | ||
if (this.config.zoneExpire == -1) { | ||
useCache = true; | ||
} else { | ||
if (!util.isTimestampExpired(this.config.zoneExpire)) { | ||
useCache = true; | ||
} | ||
} | ||
} | ||
} | ||
if (useCache) { | ||
copyReq(this.mac, this.config, srcBucket, srcKey, destBucket, destKey, | ||
options, callbackFunc); | ||
} else { | ||
zone.getZoneInfo(this.mac.accessKey, srcBucket, function(err, cZoneInfo, | ||
cZoneExpire) { | ||
if (err) { | ||
callbackFunc(err, null, null); | ||
return; | ||
} | ||
if (useCache) { | ||
copyReq(this.mac, this.config, srcBucket, srcKey, destBucket, destKey, | ||
options, callbackFunc); | ||
} else { | ||
zone.getZoneInfo(this.mac.accessKey, srcBucket, function(err, cZoneInfo, | ||
cZoneExpire) { | ||
if (err) { | ||
callbackFunc(err, null, null); | ||
return; | ||
} | ||
//update object | ||
that.config.zone = cZoneInfo; | ||
that.config.zoneExpire = cZoneExpire; | ||
//req | ||
copyReq(that.mac, that.config, srcBucket, srcKey, destBucket, | ||
destKey, options, callbackFunc); | ||
}); | ||
} | ||
} | ||
//update object | ||
that.config.zone = cZoneInfo; | ||
that.config.zoneExpire = cZoneExpire; | ||
//req | ||
copyReq(that.mac, that.config, srcBucket, srcKey, destBucket, | ||
destKey, options, callbackFunc); | ||
}); | ||
} | ||
}; | ||
function copyReq(mac, config, srcBucket, srcKey, destBucket, destKey, | ||
options, callbackFunc) { | ||
options = options || {}; | ||
var scheme = config.useHttpsDomain ? "https://" : "http://"; | ||
var copyOp = exports.copyOp(srcBucket, srcKey, destBucket, destKey, options); | ||
var requestURI = scheme + config.zone.rsHost + copyOp; | ||
var digest = util.generateAccessToken(mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
options, callbackFunc) { | ||
options = options || {}; | ||
var scheme = config.useHttpsDomain ? 'https://' : 'http://'; | ||
var copyOp = exports.copyOp(srcBucket, srcKey, destBucket, destKey, options); | ||
var requestURI = scheme + config.zone.rsHost + copyOp; | ||
var digest = util.generateAccessToken(mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
} | ||
@@ -281,39 +278,39 @@ | ||
BucketManager.prototype.delete = function(bucket, key, callbackFunc) { | ||
var useCache = false; | ||
var that = this; | ||
if (this.config.zone) { | ||
if (this.config.zoneExpire == -1) { | ||
useCache = true; | ||
} else { | ||
if (!util.isTimestampExpired(this.config.zoneExpire)) { | ||
useCache = true; | ||
} | ||
var useCache = false; | ||
var that = this; | ||
if (this.config.zone) { | ||
if (this.config.zoneExpire == -1) { | ||
useCache = true; | ||
} else { | ||
if (!util.isTimestampExpired(this.config.zoneExpire)) { | ||
useCache = true; | ||
} | ||
} | ||
} | ||
} | ||
if (useCache) { | ||
deleteReq(this.mac, this.config, bucket, key, callbackFunc); | ||
} else { | ||
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo, | ||
cZoneExpire) { | ||
if (err) { | ||
callbackFunc(err, null, null); | ||
return; | ||
} | ||
if (useCache) { | ||
deleteReq(this.mac, this.config, bucket, key, callbackFunc); | ||
} else { | ||
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo, | ||
cZoneExpire) { | ||
if (err) { | ||
callbackFunc(err, null, null); | ||
return; | ||
} | ||
//update object | ||
that.config.zone = cZoneInfo; | ||
that.config.zoneExpire = cZoneExpire; | ||
//req | ||
deleteReq(that.mac, that.config, bucket, key, callbackFunc); | ||
}); | ||
} | ||
} | ||
//update object | ||
that.config.zone = cZoneInfo; | ||
that.config.zoneExpire = cZoneExpire; | ||
//req | ||
deleteReq(that.mac, that.config, bucket, key, callbackFunc); | ||
}); | ||
} | ||
}; | ||
function deleteReq(mac, config, bucket, key, callbackFunc) { | ||
var scheme = config.useHttpsDomain ? "https://" : "http://"; | ||
var deleteOp = exports.deleteOp(bucket, key); | ||
var requestURI = scheme + config.zone.rsHost + deleteOp; | ||
var digest = util.generateAccessToken(mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
var scheme = config.useHttpsDomain ? 'https://' : 'http://'; | ||
var deleteOp = exports.deleteOp(bucket, key); | ||
var requestURI = scheme + config.zone.rsHost + deleteOp; | ||
var digest = util.generateAccessToken(mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
} | ||
@@ -329,41 +326,41 @@ | ||
BucketManager.prototype.deleteAfterDays = function(bucket, key, days, | ||
callbackFunc) { | ||
var useCache = false; | ||
var that = this; | ||
if (this.config.zone) { | ||
if (this.config.zoneExpire == -1) { | ||
useCache = true; | ||
} else { | ||
if (!util.isTimestampExpired(this.config.zoneExpire)) { | ||
useCache = true; | ||
} | ||
callbackFunc) { | ||
var useCache = false; | ||
var that = this; | ||
if (this.config.zone) { | ||
if (this.config.zoneExpire == -1) { | ||
useCache = true; | ||
} else { | ||
if (!util.isTimestampExpired(this.config.zoneExpire)) { | ||
useCache = true; | ||
} | ||
} | ||
} | ||
} | ||
if (useCache) { | ||
deleteAfterDaysReq(this.mac, this.config, bucket, key, days, callbackFunc); | ||
} else { | ||
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo, | ||
cZoneExpire) { | ||
if (err) { | ||
callbackFunc(err, null, null); | ||
return; | ||
} | ||
if (useCache) { | ||
deleteAfterDaysReq(this.mac, this.config, bucket, key, days, callbackFunc); | ||
} else { | ||
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo, | ||
cZoneExpire) { | ||
if (err) { | ||
callbackFunc(err, null, null); | ||
return; | ||
} | ||
//update object | ||
that.config.zone = cZoneInfo; | ||
that.config.zoneExpire = cZoneExpire; | ||
//req | ||
deleteAfterDaysReq(that.mac, that.config, bucket, key, days, | ||
callbackFunc); | ||
}); | ||
} | ||
} | ||
//update object | ||
that.config.zone = cZoneInfo; | ||
that.config.zoneExpire = cZoneExpire; | ||
//req | ||
deleteAfterDaysReq(that.mac, that.config, bucket, key, days, | ||
callbackFunc); | ||
}); | ||
} | ||
}; | ||
function deleteAfterDaysReq(mac, config, bucket, key, days, callbackFunc) { | ||
var scheme = config.useHttpsDomain ? "https://" : "http://"; | ||
var deleteAfterDaysOp = exports.deleteAfterDaysOp(bucket, key, days); | ||
var requestURI = scheme + config.zone.rsHost + deleteAfterDaysOp; | ||
var digest = util.generateAccessToken(mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
var scheme = config.useHttpsDomain ? 'https://' : 'http://'; | ||
var deleteAfterDaysOp = exports.deleteAfterDaysOp(bucket, key, days); | ||
var requestURI = scheme + config.zone.rsHost + deleteAfterDaysOp; | ||
var digest = util.generateAccessToken(mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
} | ||
@@ -378,41 +375,41 @@ | ||
BucketManager.prototype.fetch = function(resUrl, bucket, key, callbackFunc) { | ||
var useCache = false; | ||
var that = this; | ||
if (this.config.zone) { | ||
if (this.config.zoneExpire == -1) { | ||
useCache = true; | ||
} else { | ||
if (!util.isTimestampExpired(this.config.zoneExpire)) { | ||
useCache = true; | ||
} | ||
var useCache = false; | ||
var that = this; | ||
if (this.config.zone) { | ||
if (this.config.zoneExpire == -1) { | ||
useCache = true; | ||
} else { | ||
if (!util.isTimestampExpired(this.config.zoneExpire)) { | ||
useCache = true; | ||
} | ||
} | ||
} | ||
} | ||
if (useCache) { | ||
fetchReq(this.mac, this.config, resUrl, bucket, key, callbackFunc); | ||
} else { | ||
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo, | ||
cZoneExpire) { | ||
if (err) { | ||
callbackFunc(err, null, null); | ||
return; | ||
} | ||
if (useCache) { | ||
fetchReq(this.mac, this.config, resUrl, bucket, key, callbackFunc); | ||
} else { | ||
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo, | ||
cZoneExpire) { | ||
if (err) { | ||
callbackFunc(err, null, null); | ||
return; | ||
} | ||
//update object | ||
that.config.zone = cZoneInfo; | ||
that.config.zoneExpire = cZoneExpire; | ||
//req | ||
fetchReq(that.mac, that.config, resUrl, bucket, key, callbackFunc); | ||
}); | ||
} | ||
} | ||
//update object | ||
that.config.zone = cZoneInfo; | ||
that.config.zoneExpire = cZoneExpire; | ||
//req | ||
fetchReq(that.mac, that.config, resUrl, bucket, key, callbackFunc); | ||
}); | ||
} | ||
}; | ||
function fetchReq(mac, config, resUrl, bucket, key, callbackFunc) { | ||
var scheme = config.useHttpsDomain ? "https://" : "http://"; | ||
var encodedEntryURI = util.encodedEntry(bucket, key); | ||
var encodedResURL = util.urlsafeBase64Encode(resUrl); | ||
var requestURI = scheme + config.zone.ioHost + '/fetch/' + encodedResURL + | ||
'/to/' + encodedEntryURI; | ||
var digest = util.generateAccessToken(mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
var scheme = config.useHttpsDomain ? 'https://' : 'http://'; | ||
var encodedEntryURI = util.encodedEntry(bucket, key); | ||
var encodedResURL = util.urlsafeBase64Encode(resUrl); | ||
var requestURI = scheme + config.zone.ioHost + '/fetch/' + encodedResURL + | ||
'/to/' + encodedEntryURI; | ||
var digest = util.generateAccessToken(mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
} | ||
@@ -426,39 +423,39 @@ | ||
BucketManager.prototype.prefetch = function(bucket, key, callbackFunc) { | ||
var useCache = false; | ||
var that = this; | ||
if (this.config.zone) { | ||
if (this.config.zoneExpire == -1) { | ||
useCache = true; | ||
} else { | ||
if (!util.isTimestampExpired(this.config.zoneExpire)) { | ||
useCache = true; | ||
} | ||
var useCache = false; | ||
var that = this; | ||
if (this.config.zone) { | ||
if (this.config.zoneExpire == -1) { | ||
useCache = true; | ||
} else { | ||
if (!util.isTimestampExpired(this.config.zoneExpire)) { | ||
useCache = true; | ||
} | ||
} | ||
} | ||
} | ||
if (useCache) { | ||
prefetchReq(this.mac, this.config, bucket, key, callbackFunc); | ||
} else { | ||
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo, | ||
cZoneExpire) { | ||
if (err) { | ||
callbackFunc(err, null, null); | ||
return; | ||
} | ||
if (useCache) { | ||
prefetchReq(this.mac, this.config, bucket, key, callbackFunc); | ||
} else { | ||
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo, | ||
cZoneExpire) { | ||
if (err) { | ||
callbackFunc(err, null, null); | ||
return; | ||
} | ||
//update object | ||
that.config.zone = cZoneInfo; | ||
that.config.zoneExpire = cZoneExpire; | ||
//req | ||
prefetchReq(that.mac, that.config, bucket, key, callbackFunc); | ||
}); | ||
} | ||
} | ||
//update object | ||
that.config.zone = cZoneInfo; | ||
that.config.zoneExpire = cZoneExpire; | ||
//req | ||
prefetchReq(that.mac, that.config, bucket, key, callbackFunc); | ||
}); | ||
} | ||
}; | ||
function prefetchReq(mac, config, bucket, key, callbackFunc) { | ||
var scheme = config.useHttpsDomain ? "https://" : "http://"; | ||
var encodedEntryURI = util.encodedEntry(bucket, key); | ||
var requestURI = scheme + config.zone.ioHost + '/prefetch/' + encodedEntryURI; | ||
var digest = util.generateAccessToken(mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
var scheme = config.useHttpsDomain ? 'https://' : 'http://'; | ||
var encodedEntryURI = util.encodedEntry(bucket, key); | ||
var requestURI = scheme + config.zone.ioHost + '/prefetch/' + encodedEntryURI; | ||
var digest = util.generateAccessToken(mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
} | ||
@@ -473,41 +470,41 @@ | ||
BucketManager.prototype.changeType = function(bucket, key, newType, | ||
callbackFunc) { | ||
var useCache = false; | ||
var that = this; | ||
if (this.config.zone) { | ||
if (this.config.zoneExpire == -1) { | ||
useCache = true; | ||
} else { | ||
if (!util.isTimestampExpired(this.config.zoneExpire)) { | ||
useCache = true; | ||
} | ||
callbackFunc) { | ||
var useCache = false; | ||
var that = this; | ||
if (this.config.zone) { | ||
if (this.config.zoneExpire == -1) { | ||
useCache = true; | ||
} else { | ||
if (!util.isTimestampExpired(this.config.zoneExpire)) { | ||
useCache = true; | ||
} | ||
} | ||
} | ||
} | ||
if (useCache) { | ||
changeTypeReq(this.mac, this.config, bucket, key, newType, callbackFunc); | ||
} else { | ||
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo, | ||
cZoneExpire) { | ||
if (err) { | ||
callbackFunc(err, null, null); | ||
return; | ||
} | ||
if (useCache) { | ||
changeTypeReq(this.mac, this.config, bucket, key, newType, callbackFunc); | ||
} else { | ||
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo, | ||
cZoneExpire) { | ||
if (err) { | ||
callbackFunc(err, null, null); | ||
return; | ||
} | ||
//update object | ||
that.config.zone = cZoneInfo; | ||
that.config.zoneExpire = cZoneExpire; | ||
//req | ||
changeTypeReq(that.mac, that.config, bucket, key, newType, | ||
callbackFunc); | ||
}); | ||
} | ||
} | ||
//update object | ||
that.config.zone = cZoneInfo; | ||
that.config.zoneExpire = cZoneExpire; | ||
//req | ||
changeTypeReq(that.mac, that.config, bucket, key, newType, | ||
callbackFunc); | ||
}); | ||
} | ||
}; | ||
function changeTypeReq(mac, config, bucket, key, newType, callbackFunc) { | ||
var scheme = config.useHttpsDomain ? "https://" : "http://"; | ||
var changeTypeOp = exports.changeTypeOp(bucket, key, newType); | ||
var requestURI = scheme + config.zone.rsHost + changeTypeOp; | ||
var digest = util.generateAccessToken(mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
var scheme = config.useHttpsDomain ? 'https://' : 'http://'; | ||
var changeTypeOp = exports.changeTypeOp(bucket, key, newType); | ||
var requestURI = scheme + config.zone.rsHost + changeTypeOp; | ||
var digest = util.generateAccessToken(mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
} | ||
@@ -522,14 +519,14 @@ | ||
// @param callbackFunc(err, respBody, respInfo) 回调函数 | ||
const PU_HOST = "http://pu.qbox.me:10200"; | ||
const PU_HOST = 'http://pu.qbox.me:10200'; | ||
BucketManager.prototype.image = function(bucket, srcSiteUrl, srcHost, | ||
callbackFunc) { | ||
var encodedSrcSite = util.urlsafeBase64Encode(srcSiteUrl); | ||
var requestURI = PU_HOST + "/image/" + bucket + "/from/" + encodedSrcSite; | ||
if (srcHost) { | ||
var encodedHost = util.urlsafeBase64Encode(srcHost); | ||
requestURI += "/host/" + encodedHost; | ||
} | ||
var digest = util.generateAccessToken(this.mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
} | ||
callbackFunc) { | ||
var encodedSrcSite = util.urlsafeBase64Encode(srcSiteUrl); | ||
var requestURI = PU_HOST + '/image/' + bucket + '/from/' + encodedSrcSite; | ||
if (srcHost) { | ||
var encodedHost = util.urlsafeBase64Encode(srcHost); | ||
requestURI += '/host/' + encodedHost; | ||
} | ||
var digest = util.generateAccessToken(this.mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
}; | ||
@@ -541,6 +538,6 @@ // 取消设置空间镜像源 | ||
BucketManager.prototype.unimage = function(bucket, callbackFunc) { | ||
var requestURI = PU_HOST + "/unimage/" + bucket; | ||
var digest = util.generateAccessToken(this.mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
} | ||
var requestURI = PU_HOST + '/unimage/' + bucket; | ||
var digest = util.generateAccessToken(this.mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
}; | ||
@@ -558,70 +555,151 @@ // 获取指定前缀的文件列表 | ||
BucketManager.prototype.listPrefix = function(bucket, options, callbackFunc) { | ||
var useCache = false; | ||
var that = this; | ||
if (this.config.zone) { | ||
if (this.config.zoneExpire == -1) { | ||
useCache = true; | ||
var useCache = false; | ||
var that = this; | ||
if (this.config.zone) { | ||
if (this.config.zoneExpire == -1) { | ||
useCache = true; | ||
} else { | ||
if (!util.isTimestampExpired(this.config.zoneExpire)) { | ||
useCache = true; | ||
} | ||
} | ||
} | ||
if (useCache) { | ||
listPrefixReq(this.mac, this.config, bucket, options, callbackFunc); | ||
} else { | ||
if (!util.isTimestampExpired(this.config.zoneExpire)) { | ||
useCache = true; | ||
} | ||
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo, | ||
cZoneExpire) { | ||
if (err) { | ||
callbackFunc(err, null, null); | ||
return; | ||
} | ||
//update object | ||
that.config.zone = cZoneInfo; | ||
that.config.zoneExpire = cZoneExpire; | ||
//req | ||
listPrefixReq(that.mac, that.config, bucket, options, callbackFunc); | ||
}); | ||
} | ||
} | ||
}; | ||
if (useCache) { | ||
listPrefixReq(this.mac, this.config, bucket, options, callbackFunc); | ||
} else { | ||
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo, | ||
cZoneExpire) { | ||
if (err) { | ||
callbackFunc(err, null, null); | ||
return; | ||
} | ||
function listPrefixReq(mac, config, bucket, options, callbackFunc) { | ||
options = options || {}; | ||
//必须参数 | ||
var reqParams = { | ||
bucket: bucket, | ||
}; | ||
//update object | ||
that.config.zone = cZoneInfo; | ||
that.config.zoneExpire = cZoneExpire; | ||
//req | ||
listPrefixReq(that.mac, that.config, bucket, options, callbackFunc); | ||
}); | ||
} | ||
if (options.prefix) { | ||
reqParams.prefix = options.prefix; | ||
} else { | ||
reqParams.prefix = ''; | ||
} | ||
if (options.limit >= 1 && options.limit <= 1000) { | ||
reqParams.limit = options.limit; | ||
} else { | ||
reqParams.limit = 1000; | ||
} | ||
if (options.marker) { | ||
reqParams.marker = options.marker; | ||
} else { | ||
reqParams.marker = ''; | ||
} | ||
if (options.delimiter) { | ||
reqParams.delimiter = options.delimiter; | ||
} else { | ||
reqParams.delimiter = ''; | ||
} | ||
var scheme = config.useHttpsDomain ? 'https://' : 'http://'; | ||
var reqSpec = querystring.stringify(reqParams); | ||
var requestURI = scheme + config.zone.rsfHost + '/list?' + reqSpec; | ||
var auth = util.generateAccessToken(mac, requestURI, null); | ||
rpc.postWithForm(requestURI, null, auth, callbackFunc); | ||
} | ||
function listPrefixReq(mac, config, bucket, options, callbackFunc) { | ||
options = options || {}; | ||
//必须参数 | ||
var reqParams = { | ||
bucket: bucket, | ||
}; | ||
if (options.prefix) { | ||
reqParams.prefix = options.prefix; | ||
} else { | ||
reqParams.prefix = ""; | ||
} | ||
// 获取指定前缀的文件列表 | ||
// | ||
// @param bucket 空间名称 | ||
// @param options 列举操作的可选参数 | ||
// prefix 列举的文件前缀 | ||
// marker 上一次列举返回的位置标记,作为本次列举的起点信息 | ||
// limit 每次返回的最大列举文件数量 | ||
// delimiter 指定目录分隔符 | ||
// @param callbackFunc(err, respBody, respInfo) - 回调函数 | ||
BucketManager.prototype.listPrefixV2 = function(bucket, options, callbackFunc) { | ||
var useCache = false; | ||
var that = this; | ||
if (this.config.zone) { | ||
if (this.config.zoneExpire == -1) { | ||
useCache = true; | ||
} else { | ||
if (!util.isTimestampExpired(this.config.zoneExpire)) { | ||
useCache = true; | ||
} | ||
} | ||
} | ||
if (options.limit >= 1 && options.limit <= 1000) { | ||
reqParams.limit = options.limit; | ||
} else { | ||
reqParams.limit = 1000; | ||
} | ||
if (useCache) { | ||
listPrefixReqV2(this.mac, this.config, bucket, options, callbackFunc); | ||
} else { | ||
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo, | ||
cZoneExpire) { | ||
if (err) { | ||
callbackFunc(err, null, null); | ||
return; | ||
} | ||
if (options.marker) { | ||
reqParams.marker = options.marker; | ||
} else { | ||
reqParams.marker = ""; | ||
} | ||
//update object | ||
that.config.zone = cZoneInfo; | ||
that.config.zoneExpire = cZoneExpire; | ||
//req | ||
listPrefixReqV2(that.mac, that.config, bucket, options, callbackFunc); | ||
}); | ||
} | ||
}; | ||
if (options.delimiter) { | ||
reqParams.delimiter = options.delimiter; | ||
} else { | ||
reqParams.delimiter = ""; | ||
} | ||
function listPrefixReqV2(mac, config, bucket, options, callbackFunc) { | ||
options = options || {}; | ||
//必须参数 | ||
var reqParams = { | ||
bucket: bucket, | ||
}; | ||
var scheme = config.useHttpsDomain ? "https://" : "http://"; | ||
var reqSpec = querystring.stringify(reqParams); | ||
var requestURI = scheme + config.zone.rsfHost + '/list?' + reqSpec; | ||
if (options.prefix) { | ||
reqParams.prefix = options.prefix; | ||
} else { | ||
reqParams.prefix = ''; | ||
} | ||
var auth = util.generateAccessToken(mac, requestURI, null); | ||
rpc.postWithForm(requestURI, null, auth, callbackFunc); | ||
if (options.limit) { | ||
reqParams.limit = Math.min(1000, Math.max(0, options.limit)); | ||
} else { | ||
reqParams.limit = 0; | ||
} | ||
if (options.marker) { | ||
reqParams.marker = options.marker; | ||
} else { | ||
reqParams.marker = ''; | ||
} | ||
if (options.delimiter) { | ||
reqParams.delimiter = options.delimiter; | ||
} else { | ||
reqParams.delimiter = ''; | ||
} | ||
var scheme = config.useHttpsDomain ? 'https://' : 'http://'; | ||
var reqSpec = querystring.stringify(reqParams); | ||
var requestURI = scheme + config.zone.rsfHost + '/v2/list?' + reqSpec; | ||
var auth = util.generateAccessToken(mac, requestURI, null); | ||
rpc.postWithForm(requestURI, null, auth, callbackFunc); | ||
} | ||
@@ -631,75 +709,75 @@ | ||
BucketManager.prototype.batch = function(operations, callbackFunc) { | ||
var requestURI = conf.RS_HOST + "/batch"; | ||
var reqParams = { | ||
op: operations, | ||
}; | ||
var reqBody = querystring.stringify(reqParams); | ||
var digest = util.generateAccessToken(this.mac, requestURI, reqBody); | ||
rpc.postWithForm(requestURI, reqBody, digest, callbackFunc); | ||
} | ||
var requestURI = conf.RS_HOST + '/batch'; | ||
var reqParams = { | ||
op: operations, | ||
}; | ||
var reqBody = querystring.stringify(reqParams); | ||
var digest = util.generateAccessToken(this.mac, requestURI, reqBody); | ||
rpc.postWithForm(requestURI, reqBody, digest, callbackFunc); | ||
}; | ||
// 批量操作支持的指令构造器 | ||
exports.statOp = function(bucket, key) { | ||
return "/stat/" + util.encodedEntry(bucket, key); | ||
} | ||
return '/stat/' + util.encodedEntry(bucket, key); | ||
}; | ||
exports.deleteOp = function(bucket, key) { | ||
return "/delete/" + util.encodedEntry(bucket, key); | ||
} | ||
return '/delete/' + util.encodedEntry(bucket, key); | ||
}; | ||
exports.deleteAfterDaysOp = function(bucket, key, days) { | ||
var encodedEntryURI = util.encodedEntry(bucket, key); | ||
return '/deleteAfterDays/' + encodedEntryURI + "/" + days; | ||
} | ||
var encodedEntryURI = util.encodedEntry(bucket, key); | ||
return '/deleteAfterDays/' + encodedEntryURI + '/' + days; | ||
}; | ||
exports.changeMimeOp = function(bucket, key, newMime) { | ||
var encodedEntryURI = util.encodedEntry(bucket, key); | ||
var encodedMime = util.urlsafeBase64Encode(newMime); | ||
return '/chgm/' + encodedEntryURI + '/mime/' + encodedMime; | ||
} | ||
var encodedEntryURI = util.encodedEntry(bucket, key); | ||
var encodedMime = util.urlsafeBase64Encode(newMime); | ||
return '/chgm/' + encodedEntryURI + '/mime/' + encodedMime; | ||
}; | ||
exports.changeHeadersOp = function(bucket, key, headers) { | ||
var encodedEntryURI = util.encodedEntry(bucket, key); | ||
var prefix = 'x-qn-meta-!'; | ||
var path = '/chgm/' + encodedEntryURI; | ||
for (var headerKey in headers) { | ||
var encodedValue = util.urlsafeBase64Encode(headers[headerKey]); | ||
var prefixedHeaderKey = prefix + headerKey; | ||
path += "/" + prefixedHeaderKey + "/" + encodedValue; | ||
} | ||
var encodedEntryURI = util.encodedEntry(bucket, key); | ||
var prefix = 'x-qn-meta-!'; | ||
var path = '/chgm/' + encodedEntryURI; | ||
for (var headerKey in headers) { | ||
var encodedValue = util.urlsafeBase64Encode(headers[headerKey]); | ||
var prefixedHeaderKey = prefix + headerKey; | ||
path += '/' + prefixedHeaderKey + '/' + encodedValue; | ||
} | ||
return path; | ||
} | ||
return path; | ||
}; | ||
exports.changeTypeOp = function(bucket, key, newType) { | ||
var encodedEntryURI = util.encodedEntry(bucket, key); | ||
return '/chtype/' + encodedEntryURI + '/type/' + newType; | ||
} | ||
var encodedEntryURI = util.encodedEntry(bucket, key); | ||
return '/chtype/' + encodedEntryURI + '/type/' + newType; | ||
}; | ||
exports.changeStatusOp = function(bucket, key, newStatus) { | ||
var encodedEntryURI = util.encodedEntry(bucket, key); | ||
return '/chstatus/' + encodedEntryURI + '/status/' + newStatus; | ||
} | ||
var encodedEntryURI = util.encodedEntry(bucket, key); | ||
return '/chstatus/' + encodedEntryURI + '/status/' + newStatus; | ||
}; | ||
exports.moveOp = function(srcBucket, srcKey, destBucket, destKey, options) { | ||
options = options || {}; | ||
var encodedEntryURISrc = util.encodedEntry(srcBucket, srcKey); | ||
var encodedEntryURIDest = util.encodedEntry(destBucket, destKey); | ||
var op = "/move/" + encodedEntryURISrc + "/" + encodedEntryURIDest; | ||
if (options.force) { | ||
op += "/force/true"; | ||
} | ||
return op; | ||
} | ||
options = options || {}; | ||
var encodedEntryURISrc = util.encodedEntry(srcBucket, srcKey); | ||
var encodedEntryURIDest = util.encodedEntry(destBucket, destKey); | ||
var op = '/move/' + encodedEntryURISrc + '/' + encodedEntryURIDest; | ||
if (options.force) { | ||
op += '/force/true'; | ||
} | ||
return op; | ||
}; | ||
exports.copyOp = function(srcBucket, srcKey, destBucket, destKey, options) { | ||
options = options || {}; | ||
var encodedEntryURISrc = util.encodedEntry(srcBucket, srcKey); | ||
var encodedEntryURIDest = util.encodedEntry(destBucket, destKey); | ||
var op = "/copy/" + encodedEntryURISrc + "/" + encodedEntryURIDest; | ||
if (options.force) { | ||
op += "/force/true"; | ||
} | ||
return op; | ||
} | ||
options = options || {}; | ||
var encodedEntryURISrc = util.encodedEntry(srcBucket, srcKey); | ||
var encodedEntryURIDest = util.encodedEntry(destBucket, destKey); | ||
var op = '/copy/' + encodedEntryURISrc + '/' + encodedEntryURIDest; | ||
if (options.force) { | ||
op += '/force/true'; | ||
} | ||
return op; | ||
}; | ||
@@ -714,16 +792,16 @@ // 空间资源下载 | ||
BucketManager.prototype.privateDownloadUrl = function(domain, fileName, | ||
deadline) { | ||
var baseUrl = this.publicDownloadUrl(domain, fileName); | ||
if (baseUrl.indexOf('?') >= 0) { | ||
baseUrl += '&e='; | ||
} else { | ||
baseUrl += '?e='; | ||
} | ||
baseUrl += deadline; | ||
deadline) { | ||
var baseUrl = this.publicDownloadUrl(domain, fileName); | ||
if (baseUrl.indexOf('?') >= 0) { | ||
baseUrl += '&e='; | ||
} else { | ||
baseUrl += '?e='; | ||
} | ||
baseUrl += deadline; | ||
var signature = util.hmacSha1(baseUrl, this.mac.secretKey); | ||
var encodedSign = util.base64ToUrlSafe(signature); | ||
var downloadToken = this.mac.accessKey + ':' + encodedSign; | ||
return baseUrl + '&token=' + downloadToken; | ||
} | ||
var signature = util.hmacSha1(baseUrl, this.mac.secretKey); | ||
var encodedSign = util.base64ToUrlSafe(signature); | ||
var downloadToken = this.mac.accessKey + ':' + encodedSign; | ||
return baseUrl + '&token=' + downloadToken; | ||
}; | ||
@@ -735,72 +813,548 @@ // 获取公开空间的下载链接 | ||
BucketManager.prototype.publicDownloadUrl = function(domain, fileName) { | ||
return domain + '/' + encodeUrl(fileName); | ||
return domain + '/' + encodeUrl(fileName); | ||
}; | ||
// 修改文件状态 | ||
// @link https://developer.qiniu.com/kodo/api/4173/modify-the-file-status | ||
// @param bucket 空间名称 | ||
// @param key 文件名称 | ||
// @param status 文件状态 | ||
// @param callbackFunc(err, respBody, respInfo) 回调函数 | ||
//updateObjectStatus(bucketName string, key string, status ObjectStatus, condition UpdateObjectInfoCondition) | ||
BucketManager.prototype.updateObjectStatus = function(bucket, key, status, | ||
callbackFunc) { | ||
var useCache = false; | ||
var that = this; | ||
if (this.config.zone) { | ||
if (this.config.zoneExpire == -1) { | ||
useCache = true; | ||
} else { | ||
if (!util.isTimestampExpired(this.config.zoneExpire)) { | ||
useCache = true; | ||
} | ||
} | ||
} | ||
if (useCache) { | ||
updateStatusReq(this.mac, this.config, bucket, key, status, callbackFunc); | ||
} else { | ||
zone.getZoneInfo(this.mac.accessKey, bucket, function(err, cZoneInfo, | ||
cZoneExpire) { | ||
if (err) { | ||
callbackFunc(err, null, null); | ||
return; | ||
} | ||
//update object | ||
that.config.zone = cZoneInfo; | ||
that.config.zoneExpire = cZoneExpire; | ||
//req | ||
updateStatusReq(that.mac, that.config, bucket, key, status, | ||
callbackFunc); | ||
}); | ||
} | ||
} | ||
function updateStatusReq(mac, config, bucket, key, status, callbackFunc) { | ||
var scheme = config.useHttpsDomain ? "https://" : "http://"; | ||
var changeStatusOp = exports.changeStatusOp(bucket, key, status); | ||
var requestURI = scheme + config.zone.rsHost + changeStatusOp; | ||
var digest = util.generateAccessToken(mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
} | ||
//列举bucket | ||
//@link https://developer.qiniu.com/kodo/api/3926/get-service | ||
//@param callbackFunc(err, respBody, respInfo) 回调函数 | ||
BucketManager.prototype.listBucket = function(callbackFunc) { | ||
var requestURI = 'https://rs.qbox.me/buckets'; | ||
var digest = util.generateAccessToken(this.mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
} | ||
//获取bucket信息 | ||
//@param bucket 空间名 | ||
//@param callbackFunc(err, respBody, respInfo) 回调函数 | ||
BucketManager.prototype.getBucketInfo = function(bucket, callbackFunc) { | ||
var scheme = this.config.useHttpsDomain ? 'https://' : 'http://'; | ||
requestURI = scheme + conf.UC_HOST + '/v2/bucketInfo?bucket=' + bucket; | ||
var digest = util.generateAccessToken(this.mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
} | ||
//rules/add增加bucket规则 | ||
//@param bucket 空间名 | ||
//@param name: 规则名称 bucket 内唯一,长度小于50,不能为空,只能为字母、数字、下划线 | ||
//@param prefix: 同一个 bucket 里面前缀不能重复 | ||
//@param to_line_after_days: 指定文件上传多少天后转低频存储。指定为0表示不转低频存储, | ||
// 小于0表示上传的文件立即变低频存储 | ||
//@param delete_after_days: 指定上传文件多少天后删除,指定为0表示不删除,大于0表示多少天后删除 | ||
//@param history_delete_after_days: 指定文件成为历史版本多少天后删除,指定为0表示不删除, | ||
// 大于0表示多少天后删除 | ||
//@param history_to_line_after_days: 指定文件成为历史版本多少天后转低频存储。指定为0表示不转低频存储 | ||
BucketManager.prototype.putBucketLifecycleRule = function(bucket, options, | ||
callbackFunc) { | ||
PutBucketLifecycleRule(this.mac, this.config, bucket, options, callbackFunc); | ||
} | ||
function PutBucketLifecycleRule(mac, config, bucket, options, callbackFunc) { | ||
options = options || {}; | ||
var reqParams = { | ||
bucket: bucket, | ||
name: options.name, | ||
}; | ||
if (options.prefix) { | ||
reqParams.prefix = options.prefix; | ||
} else { | ||
reqParams.prefix = ''; | ||
} | ||
if (options.to_line_after_days) { | ||
reqParams.to_line_after_days = options.to_line_after_days; | ||
} else { | ||
reqParams.to_line_after_days = 0; | ||
} | ||
if (options.delete_after_days) { | ||
reqParams.delete_after_days = options.delete_after_days; | ||
} else { | ||
reqParams.delete_after_days = 0; | ||
} | ||
if (options.history_delete_after_days) { | ||
reqParams.history_delete_after_days = options.history_delete_after_days; | ||
} else { | ||
reqParams.history_delete_after_days = 0; | ||
} | ||
if (options.history_to_line_after_days) { | ||
reqParams.history_to_line_after_days = options.history_to_line_after_days; | ||
} else { | ||
reqParams.history_to_line_after_days = 0; | ||
} | ||
var scheme = config.useHttpsDomain ? 'https://' : 'http://'; | ||
var reqSpec = querystring.stringify(reqParams); | ||
var requestURI = scheme + conf.UC_HOST + '/rules/add?' + reqSpec; | ||
var auth = util.generateAccessToken(mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, auth, callbackFunc); | ||
} | ||
//rules/delete 删除bucket规则 | ||
//@param bucket 空间名 | ||
//@param name: 规则名称 bucket 内唯一,长度小于50,不能为空,只能为字母、数字、下划线 | ||
BucketManager.prototype.deleteBucketLifecycleRule = function(bucket, name, callbackFunc) { | ||
var reqParams = { | ||
bucket: bucket, | ||
name: name, | ||
}; | ||
var scheme = this.config.useHttpsDomain ? 'https://' : 'http://'; | ||
var reqSpec = querystring.stringify(reqParams); | ||
var requestURI = scheme + conf.UC_HOST + '/rules/delete?' + reqSpec; | ||
var digest = util.generateAccessToken(this.mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
} | ||
//rules/update 更新bucket规则 | ||
//@param bucket 空间名 | ||
BucketManager.prototype.updateBucketLifecycleRule = function(bucket, options, callbackFunc) { | ||
options = options || {}; | ||
var reqParams = { | ||
bucket: bucket, | ||
name: options.name, | ||
}; | ||
if (options.prefix) { | ||
reqParams.prefix = options.prefix; | ||
} | ||
if (options.to_line_after_days) { | ||
reqParams.to_line_after_days = options.to_line_after_days; | ||
} | ||
if (options.delete_after_days) { | ||
reqParams.delete_after_days = options.delete_after_days; | ||
} | ||
if (options.history_delete_after_days) { | ||
reqParams.history_delete_after_days = options.history_delete_after_days; | ||
} | ||
if (options.history_to_line_after_days) { | ||
reqParams.history_to_line_after_days = options.history_to_line_after_days; | ||
} | ||
var scheme = this.config.useHttpsDomain ? 'https://' : 'http://'; | ||
var reqSpec = querystring.stringify(reqParams); | ||
var requestURI = scheme + conf.UC_HOST + '/rules/update?' + reqSpec; | ||
var digest = util.generateAccessToken(this.mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
} | ||
//rules/get 获取bucket规则 | ||
//@param bucket 空间名 | ||
BucketManager.prototype.getBucketLifecycleRule = function(bucket, callbackFunc) { | ||
var scheme = this.config.useHttpsDomain ? 'https://' : 'http://'; | ||
var requestURI = scheme + conf.UC_HOST + '/rules/get?bucket=' + bucket; | ||
var digest = util.generateAccessToken(this.mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
} | ||
//events/add 增加事件通知规则 | ||
BucketManager.prototype.putBucketEvent = function(bucket, options, callbackFunc) { | ||
PutBucketEvent(this.mac, this.config, options, bucket, callbackFunc); | ||
} | ||
function PutBucketEvent(mac, config, options, bucket, callbackFunc) { | ||
options = options || {}; | ||
var reqParams = { //必填参数 | ||
bucket: bucket, | ||
name: options.name, | ||
event: options.event, | ||
callbackURL: options.callbackURL, | ||
} | ||
if (options.prefix) { | ||
reqParams.prefix = options.prefix; | ||
} else { | ||
reqParams.prefix = ''; | ||
} | ||
if (options.suffix) { | ||
reqParams.suffix = options.suffix; | ||
} else { | ||
reqParams.suffix = ''; | ||
} | ||
if (options.access_key) { | ||
reqParams.access_key = options.access_key; | ||
} else { | ||
reqParams.access_key = ''; | ||
} | ||
if (options.host) { | ||
reqParams.host = options.host; | ||
} else { | ||
reqParams.host = ''; | ||
} | ||
var scheme = config.useHttpsDomain ? 'https://' : 'http://'; | ||
var reqSpec = querystring.stringify(reqParams); | ||
var requestURI = scheme + conf.UC_HOST + '/events/add?' + reqSpec; | ||
var digest = util.generateAccessToken(mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
} | ||
//events/get 更新事件通知规则 | ||
BucketManager.prototype.updateBucketEvent = function(bucket, options, callbackFunc) { | ||
UpdateBucketEvent(this.mac, this.config, options, bucket, callbackFunc); | ||
} | ||
function UpdateBucketEvent(mac, config, options, bucket, callbackFunc) { | ||
options = options || {}; | ||
var reqParams = { | ||
bucket: bucket, | ||
name: options.name, | ||
} | ||
if (options.prefix) { | ||
reqParams.prefix = options.prefix; | ||
} | ||
if (options.suffix) { | ||
reqParams.suffix = options.suffix; | ||
} | ||
if (options.event) { | ||
reqParams.event = options.event; | ||
} | ||
if (options.callbackURL) { | ||
reqParams.callbackURL = options.callbackURL; | ||
} | ||
if (options.access_key) { | ||
reqParams.access_key = options.access_key; | ||
} | ||
if (options.host) { | ||
reqParams.host = options.host; | ||
} | ||
var scheme = config.useHttpsDomain ? 'https://' : 'http://'; | ||
var reqSpec = querystring.stringify(reqParams); | ||
var requestURI = scheme + conf.UC_HOST + '/events/update?' + reqSpec; | ||
var digest = util.generateAccessToken(mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
} | ||
//events/get 获取事件通知规则 | ||
BucketManager.prototype.getBucketEvent = function(bucket, callbackFunc) { | ||
var scheme = this.config.useHttpsDomain ? 'https://' : 'http://'; | ||
var requestURI = scheme + conf.UC_HOST + '/events/get?bucket=' + bucket; | ||
var digest = util.generateAccessToken(this.mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
} | ||
//events/delete 删除事件通知规则 | ||
BucketManager.prototype.deleteBucketEvent = function(bucket, name, callbackFunc) { | ||
var reqParams = { | ||
bucket: bucket, | ||
name: name, | ||
}; | ||
var scheme = this.config.useHttpsDomain ? 'https://' : 'http://'; | ||
var reqSpec = querystring.stringify(reqParams); | ||
var requestURI = scheme + conf.UC_HOST + '/events/delete?' + reqSpec; | ||
var digest = util.generateAccessToken(this.mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
} | ||
//设置防盗链 | ||
//@param bucket: bucket 名 | ||
//@param mode 0: 表示关闭Referer; 1: 表示设置Referer白名单; 2: 表示设置Referer黑名单 | ||
//@param norefer 0: 表示不允许空 Refer 访问; 1: 表示允许空 Refer 访问 | ||
//@param pattern 一种为空主机头域名, 比如 foo.com; 一种是泛域名, 比如 *.bar.com; | ||
// 一种是完全通配符, 即一个 *; 多个规则之间用;隔开 | ||
//@param source_enabled=: 源站是否支持,默认为0只给CDN配置, 设置为1表示开启源站防盗链 | ||
BucketManager.prototype.putReferAntiLeech = function(bucket, options, callbackFunc) { | ||
PutReferAntiLeech(this.mac, this.config, bucket, options, callbackFunc); | ||
} | ||
function PutReferAntiLeech(mac, config, bucket, options, callbackFunc) { | ||
options = options || {}; | ||
var reqParams = { | ||
bucket: bucket, | ||
}; | ||
if (options.mode) { | ||
reqParams.mode = options.mode; | ||
} else { | ||
reqParams.mode = 0; | ||
} | ||
if (options.norefer) { | ||
reqParams.norefer = options.norefer; | ||
} else { | ||
reqParams.norefer = 0; | ||
} | ||
if (options.pattern) { | ||
reqParams.pattern = options.pattern; | ||
} else { | ||
reqParams.pattern = '*'; | ||
} | ||
if (options.source_enabled) { | ||
reqParams.source_enabled = options.source_enabled; | ||
} else { | ||
reqParams.source_enabled = 0; | ||
} | ||
var scheme = config.useHttpsDomain ? 'https://' : 'http://'; | ||
var reqSpec = querystring.stringify(reqParams); | ||
var requestURI = scheme + conf.UC_HOST + '/referAntiLeech?' + reqSpec; | ||
var digest = util.generateAccessToken(mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
} | ||
///corsRules/set 设置bucket的cors(跨域)规则 | ||
BucketManager.prototype.putCorsRules = function(bucket, body, callbackFunc) { | ||
PutCorsRules(this.mac, this.config, bucket, body, callbackFunc); | ||
} | ||
function PutCorsRules(mac, config, bucket, body, callbackFunc) { | ||
var reqBody = JSON.stringify(body); | ||
var scheme = config.useHttpsDomain ? 'https://' : 'http://'; | ||
var requestURI = scheme + conf.UC_HOST + '/corsRules/set/' + bucket; | ||
var auth = util.generateAccessToken(mac, requestURI, reqBody); | ||
rpc.postWithForm(requestURI, reqBody, auth, callbackFunc); | ||
} | ||
///corsRules/get 获取bucket跨域 | ||
BucketManager.prototype.getCorsRules = function(bucket, callbackFunc) { | ||
GetCorsRules(this.mac, this.config, bucket, callbackFunc); | ||
} | ||
function GetCorsRules(mac, config, bucket, callbackFunc) { | ||
var scheme = config.useHttpsDomain ? 'https://' : 'http://'; | ||
var requestURI = scheme + conf.UC_HOST + '/corsRules/get/' + bucket; | ||
var digest = util.generateAccessToken(mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
} | ||
// BucketManager.prototype.getBucketSourceConfig = function(body, callbackFunc) { | ||
// var reqBody = JSON.stringify(body); | ||
// console.log(reqBody); | ||
// var scheme = this.config.useHttpsDomain ? 'https://' : 'http://'; | ||
// var requestURI = scheme + conf.UC_HOST + '/mirrorConfig/get'; | ||
// var digest = util.generateAccessTokenV2(this.mac, requestURI, 'POST', conf.FormMimeJson, reqBody); | ||
// rpc.postWithForm(requestURI, reqBody,digest, callbackFunc); | ||
// } | ||
//原图保护 | ||
//@param bucket 空间名称 | ||
//@param mode 为1表示开启原图保护,0表示关闭 | ||
BucketManager.prototype.putBucketAccessStyleMode = function(bucket, mode, callbackFunc) { | ||
var scheme = this.config.useHttpsDomain ? 'https://' : 'http://'; | ||
var requestURI = scheme + conf.UC_HOST + '/accessMode/' + bucket + '/mode/' + mode; | ||
var digest = util.generateAccessToken(this.mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
} | ||
//设置Bucket的cache-control: max-age属性 | ||
//@param maxAge:为0或者负数表示为默认值(31536000) | ||
BucketManager.prototype.putBucketMaxAge = function(bucket, options, callbackFunc) { | ||
var max_age = options.maxAge; | ||
if (max_age <= 0) { | ||
max_age = 31536000; | ||
} | ||
var reqParams = { | ||
bucket: bucket, | ||
maxAge: max_age, | ||
}; | ||
var scheme = this.config.useHttpsDomain ? 'https://' : 'http://'; | ||
var reqSpec = querystring.stringify(reqParams); | ||
var requestURI = scheme + conf.UC_HOST + '/maxAge?' + reqSpec; | ||
var digest = util.generateAccessToken(this.mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
} | ||
//设置Bucket私有属性 | ||
//@param private为0表示公开,为1表示私有 | ||
BucketManager.prototype.putBucketAccessMode = function(bucket, options, callbackFunc) { | ||
options = options || {}; | ||
var reqParams = { | ||
bucket: bucket, | ||
}; | ||
if (options.private) { | ||
reqParams.private = options.private; | ||
} else { | ||
reqParams.private = 0; | ||
} | ||
var scheme = this.config.useHttpsDomain ? 'https://' : 'http://'; | ||
var reqSpec = querystring.stringify(reqParams); | ||
var requestURI = scheme + conf.UC_HOST + '/private?' + reqSpec; | ||
var digest = util.generateAccessToken(this.mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
} | ||
//设置配额 | ||
//@param bucket: 空间名称,不支持授权空间 | ||
//@param size: 空间存储量配额,参数传入0或不传表示不更改当前配置,传入-1表示取消限额,新创建的空间默认没有限额。 | ||
//@param count: 空间文件数配额,参数含义同<size> | ||
BucketManager.prototype.putBucketQuota = function(bucket, options, callbackFunc) { | ||
options = options || {}; | ||
var reqParams = { | ||
bucket: bucket, | ||
}; | ||
if (options.size) { | ||
reqParams.size = options.size; | ||
} else { | ||
reqParams.size = 0; | ||
} | ||
if (options.count) { | ||
reqParams.count = options.count; | ||
} else { | ||
reqParams.count = 0; | ||
} | ||
var scheme = this.config.useHttpsDomain ? 'https://' : 'http://'; | ||
var reqSpec = `${reqParams.bucket}/size/${reqParams.size}/count/${reqParams.count}`; | ||
var requestURI = scheme + conf.UC_HOST + '/setbucketquota/' + reqSpec; | ||
var digest = util.generateAccessToken(this.mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
} | ||
//获取配额 | ||
//@param bucket: 空间名称,不支持授权空间 | ||
BucketManager.prototype.getBucketQuota = function(bucket, callbackFunc) { | ||
var scheme = this.config.useHttpsDomain ? 'https://' : 'http://'; | ||
var requestURI = scheme + conf.UC_HOST + '/getbucketquota/' + bucket; | ||
var digest = util.generateAccessToken(this.mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
} | ||
//获得Bucket的所有域名 | ||
//@param bucket:bucketName | ||
BucketManager.prototype.listBucketDomains = function(bucket, callbackFunc) { | ||
var scheme = this.config.useHttpsDomain ? 'https://' : 'http://'; | ||
var requestURI = scheme + conf.UC_HOST + '/v3/domains?tbl=' + bucket; | ||
var digest = util.generateAccessToken(this.mac, requestURI, null); | ||
rpc.postWithoutForm(requestURI, digest, callbackFunc); | ||
} | ||
// 上传策略 | ||
// @link https://developer.qiniu.com/kodo/manual/1206/put-policy | ||
function PutPolicy(options) { | ||
if (typeof options !== 'object') { | ||
throw new Error('invalid putpolicy options'); | ||
} | ||
if (typeof options !== 'object') { | ||
throw new Error('invalid putpolicy options'); | ||
} | ||
this.scope = options.scope || null; | ||
this.isPrefixalScope = options.isPrefixalScope || null; | ||
this.expires = options.expires || 3600; | ||
this.insertOnly = options.insertOnly || null; | ||
this.scope = options.scope || null; | ||
this.isPrefixalScope = options.isPrefixalScope || null; | ||
this.expires = options.expires || 3600; | ||
this.insertOnly = options.insertOnly || null; | ||
this.saveKey = options.saveKey || null; | ||
this.endUser = options.endUser || null; | ||
this.saveKey = options.saveKey || null; | ||
this.endUser = options.endUser || null; | ||
this.returnUrl = options.returnUrl || null; | ||
this.returnBody = options.returnBody || null; | ||
this.returnUrl = options.returnUrl || null; | ||
this.returnBody = options.returnBody || null; | ||
this.callbackUrl = options.callbackUrl || null; | ||
this.callbackHost = options.callbackHost || null; | ||
this.callbackBody = options.callbackBody || null; | ||
this.callbackBodyType = options.callbackBodyType || null; | ||
this.callbackFetchKey = options.callbackFetchKey || null; | ||
this.callbackUrl = options.callbackUrl || null; | ||
this.callbackHost = options.callbackHost || null; | ||
this.callbackBody = options.callbackBody || null; | ||
this.callbackBodyType = options.callbackBodyType || null; | ||
this.callbackFetchKey = options.callbackFetchKey || null; | ||
this.persistentOps = options.persistentOps || null; | ||
this.persistentNotifyUrl = options.persistentNotifyUrl || null; | ||
this.persistentPipeline = options.persistentPipeline || null; | ||
this.persistentOps = options.persistentOps || null; | ||
this.persistentNotifyUrl = options.persistentNotifyUrl || null; | ||
this.persistentPipeline = options.persistentPipeline || null; | ||
this.fsizeLimit = options.fsizeLimit || null; | ||
this.fsizeMin = options.fsizeMin || null; | ||
this.mimeLimit = options.mimeLimit || null; | ||
this.fsizeLimit = options.fsizeLimit || null; | ||
this.fsizeMin = options.fsizeMin || null; | ||
this.mimeLimit = options.mimeLimit || null; | ||
this.detectMime = options.detectMime || null; | ||
this.deleteAfterDays = options.deleteAfterDays || null; | ||
this.fileType = options.fileType || null; | ||
this.detectMime = options.detectMime || null; | ||
this.deleteAfterDays = options.deleteAfterDays || null; | ||
this.fileType = options.fileType || null; | ||
} | ||
PutPolicy.prototype.getFlags = function() { | ||
var flags = {}; | ||
var attrs = ['scope', 'isPrefixalScope', 'insertOnly', 'saveKey', 'endUser', | ||
'returnUrl', 'returnBody', 'callbackUrl', 'callbackHost', | ||
'callbackBody', 'callbackBodyType', 'callbackFetchKey', 'persistentOps', | ||
'persistentNotifyUrl', 'persistentPipeline', 'fsizeLimit', 'fsizeMin', | ||
'detectMime', 'mimeLimit', 'deleteAfterDays', 'fileType' | ||
]; | ||
var flags = {}; | ||
var attrs = ['scope', 'isPrefixalScope', 'insertOnly', 'saveKey', 'endUser', | ||
'returnUrl', 'returnBody', 'callbackUrl', 'callbackHost', | ||
'callbackBody', 'callbackBodyType', 'callbackFetchKey', 'persistentOps', | ||
'persistentNotifyUrl', 'persistentPipeline', 'fsizeLimit', 'fsizeMin', | ||
'detectMime', 'mimeLimit', 'deleteAfterDays', 'fileType' | ||
]; | ||
for (var i = attrs.length - 1; i >= 0; i--) { | ||
if (this[attrs[i]] !== null) { | ||
flags[attrs[i]] = this[attrs[i]]; | ||
for (var i = attrs.length - 1; i >= 0; i--) { | ||
if (this[attrs[i]] !== null) { | ||
flags[attrs[i]] = this[attrs[i]]; | ||
} | ||
} | ||
} | ||
flags['deadline'] = this.expires + Math.floor(Date.now() / 1000); | ||
flags['deadline'] = this.expires + Math.floor(Date.now() / 1000); | ||
return flags; | ||
} | ||
return flags; | ||
}; | ||
PutPolicy.prototype.uploadToken = function(mac) { | ||
mac = mac || new digest.Mac(); | ||
var flags = this.getFlags(); | ||
var encodedFlags = util.urlsafeBase64Encode(JSON.stringify(flags)); | ||
var encoded = util.hmacSha1(encodedFlags, mac.secretKey); | ||
var encodedSign = util.base64ToUrlSafe(encoded); | ||
var uploadToken = mac.accessKey + ':' + encodedSign + ':' + encodedFlags; | ||
return uploadToken; | ||
} | ||
mac = mac || new digest.Mac(); | ||
var flags = this.getFlags(); | ||
var encodedFlags = util.urlsafeBase64Encode(JSON.stringify(flags)); | ||
var encoded = util.hmacSha1(encodedFlags, mac.secretKey); | ||
var encodedSign = util.base64ToUrlSafe(encoded); | ||
var uploadToken = mac.accessKey + ':' + encodedSign + ':' + encodedFlags; | ||
return uploadToken; | ||
}; |
var url = require('url'); | ||
var crypto = require('crypto'); | ||
var conf = require('./conf'); | ||
// Check Timestamp Expired or not | ||
exports.isTimestampExpired = function(timestamp) { | ||
return timestamp < parseInt(Date.now() / 1000); | ||
} | ||
return timestamp < parseInt(Date.now() / 1000); | ||
}; | ||
// Encoded Entry | ||
exports.encodedEntry = function(bucket, key) { | ||
return exports.urlsafeBase64Encode(bucket + (key ? ':' + key : '')); | ||
} | ||
return exports.urlsafeBase64Encode(bucket + (key ? ':' + key : '')); | ||
}; | ||
// Get accessKey from uptoken | ||
exports.getAKFromUptoken = function(uploadToken) { | ||
var sepIndex = uploadToken.indexOf(":"); | ||
return uploadToken.substring(0, sepIndex); | ||
} | ||
var sepIndex = uploadToken.indexOf(':'); | ||
return uploadToken.substring(0, sepIndex); | ||
}; | ||
// Get bucket from uptoken | ||
exports.getBucketFromUptoken = function(uploadToken) { | ||
var sepIndex = uploadToken.lastIndexOf(":"); | ||
var encodedPutPolicy = uploadToken.substring(sepIndex + 1); | ||
var putPolicy = exports.urlSafeBase64Decode(encodedPutPolicy); | ||
var putPolicyObj = JSON.parse(putPolicy); | ||
var scope = putPolicyObj.scope; | ||
var scopeSepIndex = scope.indexOf(":"); | ||
if (scopeSepIndex == -1) { | ||
return scope; | ||
} else { | ||
return scope.substring(0, scopeSepIndex); | ||
} | ||
} | ||
var sepIndex = uploadToken.lastIndexOf(':'); | ||
var encodedPutPolicy = uploadToken.substring(sepIndex + 1); | ||
var putPolicy = exports.urlSafeBase64Decode(encodedPutPolicy); | ||
var putPolicyObj = JSON.parse(putPolicy); | ||
var scope = putPolicyObj.scope; | ||
var scopeSepIndex = scope.indexOf(':'); | ||
if (scopeSepIndex == -1) { | ||
return scope; | ||
} else { | ||
return scope.substring(0, scopeSepIndex); | ||
} | ||
}; | ||
exports.base64ToUrlSafe = function(v) { | ||
return v.replace(/\//g, '_').replace(/\+/g, '-'); | ||
} | ||
return v.replace(/\//g, '_').replace(/\+/g, '-'); | ||
}; | ||
exports.urlSafeToBase64 = function(v) { | ||
return v.replace(/\_/g, '/').replace(/\-/g, '+'); | ||
} | ||
return v.replace(/_/g, '/').replace(/-/g, '+'); | ||
}; | ||
// UrlSafe Base64 Decode | ||
exports.urlsafeBase64Encode = function(jsonFlags) { | ||
var encoded = new Buffer(jsonFlags).toString('base64'); | ||
return exports.base64ToUrlSafe(encoded); | ||
} | ||
var encoded = new Buffer(jsonFlags).toString('base64'); | ||
return exports.base64ToUrlSafe(encoded); | ||
}; | ||
// UrlSafe Base64 Decode | ||
exports.urlSafeBase64Decode = function(fromStr) { | ||
return new Buffer(exports.urlSafeToBase64(fromStr), 'base64').toString(); | ||
} | ||
return new Buffer(exports.urlSafeToBase64(fromStr), 'base64').toString(); | ||
}; | ||
// Hmac-sha1 Crypt | ||
exports.hmacSha1 = function(encodedFlags, secretKey) { | ||
/* | ||
/* | ||
*return value already encoded with base64 | ||
* */ | ||
var hmac = crypto.createHmac('sha1', secretKey); | ||
hmac.update(encodedFlags); | ||
return hmac.digest('base64'); | ||
} | ||
var hmac = crypto.createHmac('sha1', secretKey); | ||
hmac.update(encodedFlags); | ||
return hmac.digest('base64'); | ||
}; | ||
@@ -72,14 +71,14 @@ // 创建 AccessToken 凭证 | ||
exports.generateAccessToken = function(mac, requestURI, reqBody) { | ||
var u = url.parse(requestURI); | ||
var path = u.path; | ||
var access = path + '\n'; | ||
var u = url.parse(requestURI); | ||
var path = u.path; | ||
var access = path + '\n'; | ||
if (reqBody) { | ||
access += reqBody; | ||
} | ||
if (reqBody) { | ||
access += reqBody; | ||
} | ||
var digest = exports.hmacSha1(access, mac.secretKey); | ||
var safeDigest = exports.base64ToUrlSafe(digest); | ||
return 'QBox ' + mac.accessKey + ':' + safeDigest; | ||
} | ||
var digest = exports.hmacSha1(access, mac.secretKey); | ||
var safeDigest = exports.base64ToUrlSafe(digest); | ||
return 'QBox ' + mac.accessKey + ':' + safeDigest; | ||
}; | ||
@@ -94,37 +93,37 @@ // 创建 AccessToken 凭证 | ||
exports.generateAccessTokenV2 = function (mac, requestURI, reqMethod, reqContentType, reqBody) { | ||
var u = url.parse(requestURI); | ||
var path = u.path; | ||
var query = u.query; | ||
var host = u.host; | ||
var port = u.port; | ||
var u = url.parse(requestURI); | ||
var path = u.path; | ||
var query = u.query; | ||
var host = u.host; | ||
var port = u.port; | ||
var access = reqMethod.toUpperCase() + ' ' + path; | ||
if (query) { | ||
access += '?' + query; | ||
} | ||
// add host | ||
access += '\nHost: ' + host; | ||
// add port | ||
if (port) { | ||
access += ':' + port; | ||
} | ||
var access = reqMethod.toUpperCase() + ' ' + path; | ||
if (query) { | ||
access += '?' + query; | ||
} | ||
// add host | ||
access += '\nHost: ' + host; | ||
// add port | ||
if (port) { | ||
access += ':' + port; | ||
} | ||
// add content type | ||
if (reqContentType && (reqContentType=="application/json" || reqContentType=="application/x-www-form-urlencoded")) { | ||
access += '\nContent-Type: ' + reqContentType; | ||
} | ||
// add content type | ||
if (reqContentType && (reqContentType=='application/json' || reqContentType=='application/x-www-form-urlencoded')) { | ||
access += '\nContent-Type: ' + reqContentType; | ||
} | ||
access += '\n\n'; | ||
access += '\n\n'; | ||
// add reqbody | ||
if (reqBody) { | ||
access += reqBody; | ||
} | ||
// add reqbody | ||
if (reqBody) { | ||
access += reqBody; | ||
} | ||
console.log(access); | ||
// console.log(access); | ||
var digest = exports.hmacSha1(access, mac.secretKey); | ||
var safeDigest = exports.base64ToUrlSafe(digest); | ||
return 'Qiniu ' + mac.accessKey + ':' + safeDigest; | ||
} | ||
var digest = exports.hmacSha1(access, mac.secretKey); | ||
var safeDigest = exports.base64ToUrlSafe(digest); | ||
return 'Qiniu ' + mac.accessKey + ':' + safeDigest; | ||
}; | ||
@@ -138,4 +137,4 @@ // 校验七牛上传回调的Authorization | ||
exports.isQiniuCallback = function(mac, requestURI, reqBody, callbackAuth) { | ||
var auth = exports.generateAccessToken(mac, requestURI, reqBody); | ||
return auth === callbackAuth; | ||
} | ||
var auth = exports.generateAccessToken(mac, requestURI, reqBody); | ||
return auth === callbackAuth; | ||
}; |
@@ -1,3 +0,3 @@ | ||
const urllib = require('urllib') | ||
const util = require('util') | ||
const urllib = require('urllib'); | ||
const util = require('util'); | ||
const conf = require('./conf'); | ||
@@ -10,10 +10,10 @@ | ||
'up-xs.qiniup.com', | ||
], [ | ||
], [ | ||
'upload.qiniup.com', | ||
'upload-nb.qiniup.com', | ||
'upload-xs.qiniup.com', | ||
], 'iovip.qbox.me', | ||
'rs.qbox.me', | ||
'rsf.qbox.me', | ||
'api.qiniu.com'); | ||
], 'iovip.qbox.me', | ||
'rs.qbox.me', | ||
'rsf.qbox.me', | ||
'api.qiniu.com'); | ||
@@ -23,8 +23,8 @@ //huabei | ||
'up-z1.qiniup.com', | ||
], [ | ||
], [ | ||
'upload-z1.qiniup.com', | ||
], 'iovip-z1.qbox.me', | ||
'rs-z1.qbox.me', | ||
'rsf-z1.qbox.me', | ||
'api-z1.qiniu.com'); | ||
], 'iovip-z1.qbox.me', | ||
'rs-z1.qbox.me', | ||
'rsf-z1.qbox.me', | ||
'api-z1.qiniu.com'); | ||
@@ -36,10 +36,10 @@ //huanan | ||
'up-fs.qiniup.com' | ||
], [ | ||
], [ | ||
'upload-z2.qiniup.com', | ||
'upload-gz.qiniup.com', | ||
'upload-fs.qiniup.com', | ||
], 'iovip-z2.qbox.me', | ||
'rs-z2.qbox.me', | ||
'rsf-z2.qbox.me', | ||
'api-z2.qiniu.com'); | ||
], 'iovip-z2.qbox.me', | ||
'rs-z2.qbox.me', | ||
'rsf-z2.qbox.me', | ||
'api-z2.qiniu.com'); | ||
@@ -50,70 +50,70 @@ | ||
'up-na0.qiniup.com', | ||
], [ | ||
], [ | ||
'upload-na0.qiniup.com', | ||
], 'iovip-na0.qbox.me', | ||
'rs-na0.qbox.me', | ||
'rsf-na0.qbox.me', | ||
'api-na0.qiniu.com') | ||
], 'iovip-na0.qbox.me', | ||
'rs-na0.qbox.me', | ||
'rsf-na0.qbox.me', | ||
'api-na0.qiniu.com'); | ||
exports.Zone_as0 = new conf.Zone([ | ||
'up-as0.qiniup.com', | ||
'up-as0.qiniup.com', | ||
], [ | ||
'upload-as0.qiniup.com', | ||
'upload-as0.qiniup.com', | ||
], 'iovip-as0.qbox.me', | ||
'rs-as0.qbox.me', | ||
'rsf-as0.qbox.me', | ||
'api-as0.qiniu.com') | ||
'api-as0.qiniu.com'); | ||
exports.getZoneInfo = function(accessKey, bucket, callbackFunc) { | ||
var apiAddr = util.format('https://uc.qbox.me/v2/query?ak=%s&bucket=%s', | ||
accessKey, bucket); | ||
urllib.request(apiAddr, function(respErr, respData, respInfo) { | ||
if (respErr) { | ||
callbackFunc(respErr, null, null); | ||
return; | ||
} | ||
var apiAddr = util.format('https://uc.qbox.me/v2/query?ak=%s&bucket=%s', | ||
accessKey, bucket); | ||
urllib.request(apiAddr, function(respErr, respData, respInfo) { | ||
if (respErr) { | ||
callbackFunc(respErr, null, null); | ||
return; | ||
} | ||
if (respInfo.statusCode != 200) { | ||
//not ok | ||
respErr = new Error(respInfo.statusCode + "\n" + respData); | ||
callbackFunc(respErr, null, null); | ||
return; | ||
} | ||
if (respInfo.statusCode != 200) { | ||
//not ok | ||
respErr = new Error(respInfo.statusCode + '\n' + respData); | ||
callbackFunc(respErr, null, null); | ||
return; | ||
} | ||
var zoneData = JSON.parse(respData); | ||
var srcUpHosts = []; | ||
var cdnUpHosts = []; | ||
var zoneExpire = 0; | ||
var zoneData = JSON.parse(respData); | ||
var srcUpHosts = []; | ||
var cdnUpHosts = []; | ||
var zoneExpire = 0; | ||
try { | ||
zoneExpire = zoneData.ttl; | ||
//read src hosts | ||
zoneData.up.src.main.forEach(function(host) { | ||
srcUpHosts.push(host); | ||
}); | ||
if (zoneData.up.src.backup) { | ||
zoneData.up.src.backup.forEach(function(host) { | ||
srcUpHosts.push(host); | ||
}); | ||
} | ||
try { | ||
zoneExpire = zoneData.ttl; | ||
//read src hosts | ||
zoneData.up.src.main.forEach(function(host) { | ||
srcUpHosts.push(host); | ||
}); | ||
if (zoneData.up.src.backup) { | ||
zoneData.up.src.backup.forEach(function(host) { | ||
srcUpHosts.push(host); | ||
}); | ||
} | ||
//read acc hosts | ||
zoneData.up.acc.main.forEach(function(host) { | ||
cdnUpHosts.push(host); | ||
}); | ||
if (zoneData.up.acc.backup) { | ||
zoneData.up.acc.backup.forEach(function(host) { | ||
cdnUpHosts.push(host); | ||
}); | ||
} | ||
//read acc hosts | ||
zoneData.up.acc.main.forEach(function(host) { | ||
cdnUpHosts.push(host); | ||
}); | ||
if (zoneData.up.acc.backup) { | ||
zoneData.up.acc.backup.forEach(function(host) { | ||
cdnUpHosts.push(host); | ||
}); | ||
} | ||
var ioHost = zoneData.io.src.main[0]; | ||
var zoneInfo = new conf.Zone(srcUpHosts, cdnUpHosts, ioHost) | ||
callbackFunc(null, zoneInfo, zoneExpire); | ||
} catch (e) { | ||
callbackFunc(e, null, null); | ||
} | ||
}); | ||
} | ||
var ioHost = zoneData.io.src.main[0]; | ||
var zoneInfo = new conf.Zone(srcUpHosts, cdnUpHosts, ioHost); | ||
callbackFunc(null, zoneInfo, zoneExpire); | ||
} catch (e) { | ||
callbackFunc(e, null, null); | ||
} | ||
}); | ||
}; |
@@ -5,4 +5,4 @@ # Qiniu Cloud SDK for Node.js | ||
[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg)](LICENSE.md) | ||
[![Build Status](https://travis-ci.org/qiniu/nodejs-sdk.v6.png?branch=master)](https://travis-ci.org/qiniu/nodejs-sdk.v6) | ||
[![Code Climate](https://codeclimate.com/github/qiniu/nodejs-sdk.png)](https://codeclimate.com/github/qiniu/nodejs-sdk) | ||
[![Build Status](https://travis-ci.org/qiniu/nodejs-sdk.v6.svg?branch=master)](https://travis-ci.org/qiniu/nodejs-sdk.v6) | ||
[![Code Climate](https://codeclimate.com/github/qiniu/nodejs-sdk.svg)](https://codeclimate.com/github/qiniu/nodejs-sdk) | ||
[![Latest Stable Version](https://img.shields.io/npm/v/qiniu.svg)](https://www.npmjs.com/package/qiniu) | ||
@@ -9,0 +9,0 @@ |
173221
59
4504
16