From df98196912cdcfc9a235a3ddc7eadc4d39413bd7 Mon Sep 17 00:00:00 2001 From: yuliyang Date: Tue, 6 Feb 2018 12:21:53 +0800 Subject: [PATCH] rgw: return valid Location element, PostObj PostResponse should contain ETag and urlencode bucket name object name and tenant name and correct Location uri Fixes: http://tracker.ceph.com/issues/22927 Signed-off-by: yuliyang --- src/rgw/rgw_rest_s3.cc | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index e6e3010a2d5a4..d0e0b8bb87665 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -2008,14 +2008,23 @@ done: for (auto &it : crypt_http_responses) dump_header(s, it.first, it.second); s->formatter->open_object_section("PostResponse"); - if (g_conf()->rgw_dns_name.length()) - s->formatter->dump_format("Location", "%s/%s", - s->info.script_uri.c_str(), - s->object.name.c_str()); - if (!s->bucket_tenant.empty()) + std::string base_uri = compute_domain_uri(s); + if (!s->bucket_tenant.empty()){ + s->formatter->dump_format("Location", "%s/%s:%s/%s", + base_uri.c_str(), + url_encode(s->bucket_tenant).c_str(), + url_encode(s->bucket_name).c_str(), + url_encode(s->object.name).c_str()); s->formatter->dump_string("Tenant", s->bucket_tenant); + } else { + s->formatter->dump_format("Location", "%s/%s/%s", + base_uri.c_str(), + url_encode(s->bucket_name).c_str(), + url_encode(s->object.name).c_str()); + } s->formatter->dump_string("Bucket", s->bucket_name); s->formatter->dump_string("Key", s->object.name); + s->formatter->dump_string("ETag", etag); s->formatter->close_section(); } s->err.message = err_msg; -- 2.39.5