From 533b6177395559dbe7e1e0dffb4cd3a3097f62e8 Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Mon, 29 Feb 2016 23:25:57 +0100 Subject: [PATCH] rgw: send proper ETag value during GET on DLO/SLO through S3 API. Signed-off-by: Radoslaw Zarzynski --- src/rgw/rgw_rest_s3.cc | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index 9cbbd860aace..fc7a2d9840e8 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -149,12 +149,20 @@ int RGWGetObj_ObjStore_S3::send_response_data(bufferlist& bl, off_t bl_ofs, dump_last_modified(s, lastmod); if (! op_ret) { - map::iterator iter = attrs.find(RGW_ATTR_ETAG); - if (iter != attrs.end()) { - bufferlist& bl = iter->second; - if (bl.length()) { - char *etag = bl.c_str(); - dump_etag(s, etag); + if (! lo_etag.empty()) { + /* Handle etag of Swift API's large objects (DLO/SLO). It's entirerly + * legit to perform GET on them through S3 API. In such situation, + * a client should receive the composited content with corresponding + * etag value. */ + dump_etag(s, lo_etag.c_str()); + } else { + auto iter = attrs.find(RGW_ATTR_ETAG); + if (iter != attrs.end()) { + bufferlist& bl = iter->second; + if (bl.length()) { + const char * etag = bl.c_str(); + dump_etag(s, etag); + } } } @@ -171,7 +179,7 @@ int RGWGetObj_ObjStore_S3::send_response_data(bufferlist& bl, off_t bl_ofs, } } - for (iter = attrs.begin(); iter != attrs.end(); ++iter) { + for (auto iter = attrs.begin(); iter != attrs.end(); ++iter) { const char *name = iter->first.c_str(); map::iterator aiter = rgw_to_http_attrs.find(name); if (aiter != rgw_to_http_attrs.end()) { -- 2.47.3