Skip to content

Commit a1d0c63

Browse files
committed
Added fixes as per the comments
Signed-off-by: Aayush Chouhan <achouhan@redhat.com>
1 parent b47cbd9 commit a1d0c63

File tree

5 files changed

+37
-34
lines changed

5 files changed

+37
-34
lines changed

src/endpoint/s3/ops/s3_get_object.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ async function get_object(req, res) {
3939

4040
const object_md = await req.object_sdk.read_object_md(md_params);
4141

42+
http_utils.set_expiration_header(req, res); // setting expiration header for bucket lifecycle
4243
s3_utils.set_response_object_md(res, object_md);
4344
s3_utils.set_encryption_response_headers(req, res, object_md.encryption);
4445
if (object_md.storage_class === s3_utils.STORAGE_CLASS_GLACIER) {

src/endpoint/s3/ops/s3_head_object.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ async function head_object(req, res) {
2424
if (req.query.get_from_cache !== undefined) {
2525
params.get_from_cache = true;
2626
}
27+
http_utils.set_expiration_header(req, res); // setting expiration header for bucket lifecycle
28+
2729
const object_md = await req.object_sdk.read_object_md(params);
2830

2931
s3_utils.set_response_object_md(res, object_md);

src/endpoint/s3/ops/s3_put_object.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ async function put_object(req, res) {
3232
sha256_b64: req.content_sha256_buf && req.content_sha256_buf.toString('base64'),
3333
};
3434

35+
http_utils.set_expiration_header(req, res); // setting expiration header for bucket lifecycle
36+
3537
dbg.log0('PUT OBJECT', req.params.bucket, req.params.key,
3638
req.headers['x-amz-copy-source'] || '', encryption || '');
3739
//for copy, use correct s3_event_method. otherwise, just use default (req.method)

src/endpoint/s3/s3_rest.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,6 @@ async function handle_request(req, res) {
139139
authenticate_request(req);
140140
await authorize_request(req);
141141

142-
await http_utils.set_expiration_header(req, res);
143-
144142
dbg.log1('S3 REQUEST', req.method, req.originalUrl, 'op', op_name, 'request_id', req.request_id, req.headers);
145143
usage_report.s3_usage_info.total_calls += 1;
146144
usage_report.s3_usage_info[op_name] = (usage_report.s3_usage_info[op_name] || 0) + 1;

src/util/http_utils.js

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -665,51 +665,51 @@ function set_amz_headers(req, res) {
665665
res.setHeader('x-amz-id-2', req.request_id);
666666
}
667667

668-
const s3_error_options = {
669-
ErrorClass: S3Error,
670-
error_missing_content_length: S3Error.MissingContentLength
671-
};
672668
/**
669+
* set_expiration_header sets the `x-amz-expiration` response header for GET, PUT, or HEAD object requests
670+
* if the object matches any enabled bucket lifecycle rule
671+
*
673672
* @param {Object} req
674673
* @param {http.ServerResponse} res
675674
*/
676675
async function set_expiration_header(req, res) {
677-
if (req.method === 'HEAD' || req.method === 'GET' || req.method === 'PUT') {
678-
const rules = req.params.bucket && await req.object_sdk.read_bucket_lifecycle_config_info(req.params.bucket);
679-
const object_md = {
680-
bucket: req.params.bucket,
681-
key: req.params.key,
682-
size: req.headers['x-amz-decoded-content-length'] || req.headers['content-length'] ? parse_content_length(req, s3_error_options) : undefined,
683-
tagging: req.body && req.body.Tagging ? s3_utils.parse_body_tagging_xml(req) : undefined,
684-
};
676+
const rules = req.params.bucket && await req.object_sdk.read_bucket_lifecycle_config_info(req.params.bucket);
677+
const object_md = {
678+
bucket: req.params.bucket,
679+
key: req.params.key,
680+
size: req.headers['x-amz-decoded-content-length'] || req.headers['content-length'] ? parse_content_length(req, {
681+
ErrorClass: S3Error,
682+
error_missing_content_length: S3Error.MissingContentLength
683+
}) : undefined,
684+
tagging: req.body && req.body.Tagging ? s3_utils.parse_body_tagging_xml(req) : undefined,
685+
};
685686

686-
if (object_md.key && rules?.length > 0) { // updating x-amz-expiration if object key is present
687-
for (const rule of rules) {
688-
if (rule?.status !== 'Enabled') continue;
687+
if (object_md.key && rules?.length > 0) {
688+
for (const rule of rules) {
689+
if (rule?.status !== 'Enabled') continue;
689690

690-
const filter = rule?.filter || {};
691+
const filter = rule?.filter || {};
691692

692-
if (filter.prefix && !object_md?.key.startsWith(filter.prefix)) continue;
693+
if (filter.prefix && !object_md?.key.startsWith(filter.prefix)) continue;
693694

694-
if (filter.object_size_greater_than && object_md?.size <= filter.object_size_greater_than) continue;
695-
if (filter.object_size_less_than && object_md?.size >= filter.object_size_less_than) continue;
695+
if (filter.object_size_greater_than && object_md?.size <= filter.object_size_greater_than) continue;
696+
if (filter.object_size_less_than && object_md?.size >= filter.object_size_less_than) continue;
696697

697-
if (filter.tagging && Array.isArray(filter.tagging)) {
698-
const obj_tags = object_md?.tagging || [];
698+
if (filter.tagging && Array.isArray(filter.tagging)) {
699+
const obj_tags = object_md?.tagging || [];
699700

700-
const matches_all_tags = filter.tagging.every(filter_tag =>
701-
obj_tags.some(obj_tag => obj_tag.key === filter_tag.key && obj_tag.value === filter_tag.value)
702-
);
701+
const matches_all_tags = filter.tagging.every(filter_tag =>
702+
obj_tags.some(obj_tag => obj_tag.key === filter_tag.key && obj_tag.value === filter_tag.value)
703+
);
703704

704-
if (!matches_all_tags) continue;
705-
}
705+
if (!matches_all_tags) continue;
706+
}
706707

707-
const expiration_head = parse_expiration_header(rule?.expiration, rule?.id);
708-
if (expiration_head) {
709-
dbg.log0('set x_amz_expiration header from applied rule: ', rule);
710-
res.setHeader('x-amz-expiration', expiration_head);
711-
break; // apply only for first matching rule
712-
}
708+
const expiration_header = parse_expiration_header(rule?.expiration, rule?.id);
709+
if (expiration_header) {
710+
dbg.log1('set x_amz_expiration header from applied rule: ', rule);
711+
res.setHeader('x-amz-expiration', expiration_header);
712+
break; // apply only for first matching rule
713713
}
714714
}
715715
}

0 commit comments

Comments
 (0)