nos-node.js-sdk
Version:
NOS Node.js SDK实现了NOS对象操作接口,基于此SDK能方便快速地实现JavaScript应用程序来使用NOS的对象存储服务。
135 lines (111 loc) • 4.27 kB
JavaScript
/**
* Created by hzlichaolin on 2016/7/15.
* this module let you upload a part of a big object
*/
var httpRequest = require('./httpRequest');
var inherits = require('./inherits');
var authrization = require('../services/authorization');
var crypto = require('crypto');
var querystring = require('querystring');
var encoder = require('../services/urlEncoder');
var bucketValidator = require('../services/validateBucketName');
var keyValidator = require('../services/validateKey');
var lengthValidator = require('../services/validateContentLength');
var xml2js = require('xml2js');
var utils = require('../services/utils');
var _16k = 16*1024;
function uploadPartRequest() {
httpRequest.call(this)
this.options = {host: null, port: -1, path: null, method: 'PUT', headers:{}
};
this.contentLength = null;
this.bucketName = null
this.objectName = null
this.partNumber = null
this.uploadId = null
this.expect = null
this.body = null
}
inherits(uploadPartRequest,httpRequest)
uploadPartRequest.prototype.setBucketName = function (bucketName) {
this.bucketName = bucketName
}
uploadPartRequest.prototype.setObjectName = function (objectName) {
this.objectName = encoder(objectName)
}
uploadPartRequest.prototype.setPartNumber = function (partNumber) {
this.partNumber = partNumber
}
uploadPartRequest.prototype.setUploadId = function (uploadId) {
this.uploadId = uploadId
}
uploadPartRequest.prototype.setBody = function (body) {
this.body = body
}
uploadPartRequest.prototype.setContentLength = function (length) {
this.contentLength = length;
}
uploadPartRequest.prototype.sendRequest = function (func) {
if (!bucketValidator(this.bucketName)){
throw new Error('invalid bucket name');
}
if(!keyValidator(this.objectName)){
throw new Error('invalid object name');
}
if (this.contentLength == null){
throw new Error('this part no content length');
}
var para = {};
if (this.partNumber != null){
para['partNumber'] = this.partNumber;
}
if (this.uploadId != null){
para['uploadId'] = this.uploadId;
}
var query = querystring.stringify(para);
if (query.length > 0){
query = '?'+query;
}
this.options.path = '/' + this.objectName +query;;
this.options.host = this.bucketName + '.' + this.options.host;
var resource = '/' + this.bucketName + '/' + this.objectName +query;
this.options.headers['Date'] = (new Date()).toUTCString();
var outer = this;
var responseFunc = function (res) {
if (!utils.isOK(res.statusCode)){
res.on('data',function (body) {
var parser = new xml2js.Parser();
parser.parseString(body,function (err, obj) {
var errMessage = {
statusCode:res.statusCode,
errorCode:obj['Error']['Code'][0],
message:obj['Error']['Message'][0],
requestId:obj['Error']['RequestId'][0],
resource:obj['Error']['Resource'[0]]
};
errMessage = JSON.stringify(errMessage);
throw new Error(errMessage);
});
});
}else {
var result = {};
result['statusCode'] = res.statusCode;
if (res.headers.etag != null){
res.headers.etag = res.headers.etag.replaceAll("\"","");
}
result['headers'] = res.headers;
result['partNumber'] = outer.partNumber;
func(result);
}
};
outer.options.body = this.body;
outer.options.headers['Content-Length'] = this.contentLength;
if (outer.expect != null){
outer.options.headers['Expect'] = outer.expect;
}
var authStr = authrization(outer.accessId,outer.secretKey,
outer.options.method,outer.options.headers,resource);
outer.options.headers['Authorization'] = authStr;
httpRequest.prototype.sendRequest(outer.options,responseFunc);
};
module.exports = uploadPartRequest;