From: Radoslaw Zarzynski Date: Mon, 29 Feb 2016 22:25:57 +0000 (+0100) Subject: rgw: send proper ETag value during GET on DLO/SLO through S3 API. X-Git-Tag: v10.1.0~232^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F7764%2Fhead;p=ceph.git rgw: send proper ETag value during GET on DLO/SLO through S3 API. Signed-off-by: Radoslaw Zarzynski --- 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()) {