* 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)
| 71 | * @return {undefined} |
| 72 | */ |
| 73 | function 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) { |
nothing calls this directly
no test coverage detected