createAndStoreObject - store data, store metadata, and delete old data * and old metadata as necessary * @param {string} bucketName - name of bucket * @param {BucketInfo} bucketMD - BucketInfo instance * @param {string} objectKey - name of object * @param {object} objMD - object metadata * @pa
(bucketName, bucketMD, objectKey, objMD, authInfo,
canonicalID, cipherBundle, request, isDeleteMarker, streamingV4Params,
overheadField, log, originOp, callback)
| 60 | * result.versionId - unencrypted versionId returned by metadata |
| 61 | */ |
| 62 | function createAndStoreObject(bucketName, bucketMD, objectKey, objMD, authInfo, |
| 63 | canonicalID, cipherBundle, request, isDeleteMarker, streamingV4Params, |
| 64 | overheadField, log, originOp, callback) { |
| 65 | const putVersionId = request.headers['x-scal-s3-version-id']; |
| 66 | const isPutVersion = putVersionId || putVersionId === ''; |
| 67 | |
| 68 | const size = isDeleteMarker ? 0 : request.parsedContentLength; |
| 69 | // although the request method may actually be 'DELETE' if creating a |
| 70 | // delete marker, for our purposes we consider this to be a 'PUT' |
| 71 | // operation |
| 72 | const requestMethod = 'PUT'; |
| 73 | const websiteRedirectHeader = |
| 74 | request.headers['x-amz-website-redirect-location']; |
| 75 | if (!validateWebsiteHeader(websiteRedirectHeader)) { |
| 76 | const err = errors.InvalidRedirectLocation; |
| 77 | log.debug('invalid x-amz-website-redirect-location' + |
| 78 | `value ${websiteRedirectHeader}`, { error: err }); |
| 79 | return callback(err); |
| 80 | } |
| 81 | |
| 82 | const metaHeaders = isDeleteMarker ? [] : getMetaHeaders(request.headers); |
| 83 | if (metaHeaders instanceof Error) { |
| 84 | log.debug('user metadata validation failed', { |
| 85 | error: metaHeaders, |
| 86 | method: 'createAndStoreObject', |
| 87 | }); |
| 88 | return process.nextTick(() => callback(metaHeaders)); |
| 89 | } |
| 90 | // if the request occurs within a Zenko deployment, we place a user-metadata |
| 91 | // field on the object |
| 92 | applyZenkoUserMD(metaHeaders); |
| 93 | |
| 94 | log.trace('meta headers', { metaHeaders, method: 'objectPut' }); |
| 95 | const objectKeyContext = { |
| 96 | bucketName, |
| 97 | owner: canonicalID, |
| 98 | namespace: request.namespace, |
| 99 | objectKey, |
| 100 | metaHeaders, |
| 101 | tagging: request.headers['x-amz-tagging'], |
| 102 | isDeleteMarker, |
| 103 | }; |
| 104 | // If the request was made with a pre-signed url, the x-amz-acl 'header' |
| 105 | // might be in the query string rather than the actual headers so include |
| 106 | // it here |
| 107 | const headers = request.headers; |
| 108 | if (request.query && request.query['x-amz-acl']) { |
| 109 | headers['x-amz-acl'] = request.query['x-amz-acl']; |
| 110 | } |
| 111 | const metadataStoreParams = { |
| 112 | objectKey, |
| 113 | authInfo, |
| 114 | metaHeaders, |
| 115 | size, |
| 116 | headers, |
| 117 | isDeleteMarker, |
| 118 | replicationInfo: getReplicationInfo(config, |
| 119 | objectKey, bucketMD, false, size, null, null, authInfo), |
no test coverage detected