MCPcopy
hub / github.com/scality/cloudserver / completeMultipartUpload

Function completeMultipartUpload

lib/api/completeMultipartUpload.js:73–633  ·  view source on GitHub ↗

* completeMultipartUpload - Complete a multipart upload * @param {AuthInfo} authInfo - Instance of AuthInfo class with requester's info * @param {object} request - http request object * @param {object} log - Werelogs logger * @param {function} callback - callback to server * @return {undefined}

(authInfo, request, log, callback)

Source from the content-addressed store, hash-verified

71 * @return {undefined}
72 */
73function completeMultipartUpload(authInfo, request, log, callback) {
74 log.debug('processing request', { method: 'completeMultipartUpload' });
75 const bucketName = request.bucketName;
76 const objectKey = request.objectKey;
77 const hostname = request.parsedHost;
78 const uploadId = request.query.uploadId;
79 const metadataValParams = {
80 authInfo,
81 bucketName,
82 objectKey,
83 uploadId,
84 // Note: permissions for completing a multipart upload are the
85 // same as putting a part.
86 requestType: request.apiMethods || 'putPart or complete',
87 log,
88 request,
89 };
90 const xmlParams = {
91 bucketName,
92 objectKey,
93 hostname,
94 };
95 let oldByteLength = null;
96 const responseHeaders = {};
97
98 let versionId;
99 const putVersionId = request.headers['x-scal-s3-version-id'];
100 const isPutVersion = putVersionId || putVersionId === '';
101 if (putVersionId) {
102 const decodedVidResult = decodeVID(putVersionId);
103 if (decodedVidResult instanceof Error) {
104 log.trace('invalid x-scal-s3-version-id header', {
105 versionId: putVersionId,
106 error: decodedVidResult,
107 });
108 return process.nextTick(() => callback(decodedVidResult));
109 }
110 versionId = decodedVidResult;
111 }
112
113 const queryContainsVersionId = checkQueryVersionId(request.query);
114 if (queryContainsVersionId instanceof Error) {
115 return callback(queryContainsVersionId);
116 }
117
118 function parseXml(xmlToParse, next) {
119 return parseString(xmlToParse, (err, result) => {
120 if (err || !result || !result.CompleteMultipartUpload
121 || !result.CompleteMultipartUpload.Part) {
122 return next(errors.MalformedXML);
123 }
124 const jsonList = result.CompleteMultipartUpload;
125 return next(null, jsonList);
126 });
127 }
128
129 return async.waterfall([
130 function validateDestBucket(next) {

Callers

nothing calls this directly

Calls 15

decodeVIDFunction · 0.85
checkQueryVersionIdFunction · 0.85
validatePutVersionIdFunction · 0.85
parseXmlFunction · 0.85
getReplicationInfoFunction · 0.85
setSSEHeadersFunction · 0.85
overwritingVersioningFunction · 0.85
versioningPreprocessingFunction · 0.85
locationKeysHaveChangedFunction · 0.85
setExpirationHeadersFunction · 0.85
validateQuotasFunction · 0.85

Tested by

no test coverage detected