UNPKG

nos-node.js-sdk

Version:

NOS Node.js SDK实现了NOS对象操作接口,基于此SDK能方便快速地实现JavaScript应用程序来使用NOS的对象存储服务。

150 lines (124 loc) 5.53 kB
/** * Created by hzlichaolin on 2016/7/15. * this module show multipart upload situation */ var httpRequest = require('./httpRequest'); var inherits = require('./inherits'); var authrization = require('../services/authorization'); var querystring = require('querystring'); var encoder = require('../services/urlEncoder'); var bucketValidator = require('../services/validateBucketName'); var keyValidator = require('../services/validateKey'); var xml2js = require('xml2js'); var utils = require('../services/utils'); function listPartsRequest() { httpRequest.call(this); this.options = {host: null, port: -1, path: null, method: 'GET', headers:{} }; this.bucketName = null; this.objectName = null; this.uploadId = null; this.max_parts = null; this.part_number_marker = null; } inherits(listPartsRequest,httpRequest); listPartsRequest.prototype.setBucketName = function (bucketName) { this.bucketName = bucketName; } listPartsRequest.prototype.setObjectName = function (objectName) { this.objectName = encoder(objectName); } listPartsRequest.prototype.setUploadId = function (uploadId) { this.uploadId = uploadId; } listPartsRequest.prototype.setMaxParts = function (maxParts) { this.max_parts = maxParts; } listPartsRequest.prototype.setPartNumberMarker = function (partNumberMarker) { this.part_number_marker = partNumberMarker; } listPartsRequest.prototype.sendRequest = function (func) { if (!bucketValidator(this.bucketName)){ throw new Error('invalid bucket name'); } if(!keyValidator(this.objectName)){ throw new Error('invalid object name'); } var para = {}; if (this.uploadId != null){ para['uploadId'] = this.uploadId; } if (this.max_parts != null){ para['max-parts'] = this.max_parts; } if (this.part_number_marker != null){ para['part-number-marker '] = this.part_number_marker; } var query = querystring.stringify(para); if (query.length > 0){ query = '?'+query; } var resource = '/' + this.bucketName + '/' + this.objectName + '?uploadId=' + this.uploadId; this.options.host = this.bucketName + '.' + this.options.host; this.options.path = '/' +this.objectName + query; this.options.headers['Date'] = (new Date()).toUTCString(); var authStr = authrization(this.accessId,this.secretKey,this.options.method,this.options.headers,resource); this.options.headers['Authorization'] = authStr; 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; result['headers'] = res.headers; var data = ''; res.on('data',function (chunk) { data += chunk; }); res.on('end',function () { var parser = new xml2js.Parser(); parser.parseString(data,function (err, obj) { var temp = {}; temp['bucket'] = obj['ListPartsResult']['Bucket'][0]; temp['is_truncated'] = obj['ListPartsResult']['IsTruncated'][0]; temp['key'] = obj['ListPartsResult']['Key'][0]; temp['max_parts'] = obj['ListPartsResult']['MaxParts'][0]; temp['next_part_number_marker'] = obj['ListPartsResult']['NextPartNumberMarker'][0]; var owner = {}; owner['productid'] = obj['ListPartsResult']['Owner'][0]['ID'][0]; temp['owner'] = owner; temp['part_number_marker'] = obj['ListPartsResult']['PartNumberMarker'][0]; temp['storageclass'] = obj['ListPartsResult']['StorageClass'][0]; temp['upload_id'] = obj['ListPartsResult']['UploadId'][0]; var parts = obj['ListPartsResult']['Part'] || []; var part_list = []; for (var i=0;i<parts.length;i++){ part_list[i] = {}; part_list[i]['etag'] = parts[i]['ETag'][0].replaceAll("\"",""); part_list[i]['last_modified'] = parts[i]['LastModified'][0]; part_list[i]['part_number'] = parts[i]['PartNumber'][0]; part_list[i]['size'] = parts[i]['Size'][0]; } temp['part_list'] = part_list; result['list_parts_info'] = temp; func(result); }); }); } }; httpRequest.prototype.sendRequest(this.options,responseFunc); } module.exports = listPartsRequest;