From: Matt Benjamin Date: Wed, 10 Jan 2018 20:51:20 +0000 (-0500) Subject: rgw: return valid Location element, CompleteMultipartUpload X-Git-Tag: v12.2.4~14^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5e8e655e11164dca6a8938abe86cc80ed5d8c139;p=ceph.git rgw: return valid Location element, CompleteMultipartUpload Returns URIs that should reach the server regardless of domain configuration, and following tenant:bucket convention, if applicable. Fixes: https://tracker.ceph.com/issues/22655 Signed-off-by: Matt Benjamin (cherry picked from commit 0357a8b7ce01a7cd5e3a73f5e0f42617d56b7cfb) --- diff --git a/src/rgw/rgw_rest.h b/src/rgw/rgw_rest.h index 515057dfcd679..61d497d36ae44 100644 --- a/src/rgw/rgw_rest.h +++ b/src/rgw/rgw_rest.h @@ -716,6 +716,22 @@ static inline void dump_header_if_nonempty(struct req_state* s, } } +static inline std::string compute_domain_uri(const struct req_state *s) { + std::string uri = (!s->info.domain.empty()) ? s->info.domain : + [&s]() -> std::string { + auto env = *(s->info.env); + std::string uri = + env.get("SERVER_PORT_SECURE") ? "https://" : "http://"; + if (env.exists("SERVER_NAME")) { + uri.append(env.get("SERVER_NAME", "")); + } else { + uri.append(env.get("HTTP_HOST", "")); + } + return uri; + }(); + return uri; +} + extern void dump_content_length(struct req_state *s, uint64_t len); extern int64_t parse_content_length(const char *content_length); extern void dump_etag(struct req_state *s, @@ -748,7 +764,6 @@ extern void dump_access_control(req_state *s, RGWOp *op); extern int dump_body(struct req_state* s, const char* buf, size_t len); extern int dump_body(struct req_state* s, /* const */ ceph::buffer::list& bl); extern int dump_body(struct req_state* s, const std::string& str); - extern int recv_body(struct req_state* s, char* buf, size_t max); #endif /* CEPH_RGW_REST_H */ diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index ec9011a06bc44..0320a2dfed665 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -2536,23 +2536,24 @@ void RGWCompleteMultipart_ObjStore_S3::send_response() set_req_state_err(s, op_ret); dump_errno(s); end_header(s, this, "application/xml"); - if (op_ret == 0) { + if (op_ret == 0) { dump_start(s); s->formatter->open_object_section_in_ns("CompleteMultipartUploadResult", XMLNS_AWS_S3); + std::string base_uri = compute_domain_uri(s); if (!s->bucket_tenant.empty()) { - if (s->info.domain.length()) { - s->formatter->dump_format("Location", "%s.%s.%s", - s->bucket_name.c_str(), - s->bucket_tenant.c_str(), - s->info.domain.c_str()); - } + s->formatter->dump_format("Location", "%s/%s:%s/%s", + base_uri.c_str(), + s->bucket_tenant.c_str(), + s->bucket_name.c_str(), + s->object.name.c_str() + ); s->formatter->dump_string("Tenant", s->bucket_tenant); } else { - if (s->info.domain.length()) { - s->formatter->dump_format("Location", "%s.%s", - s->bucket_name.c_str(), - s->info.domain.c_str()); - } + s->formatter->dump_format("Location", "%s/%s/%s", + base_uri.c_str(), + s->bucket_name.c_str(), + s->object.name.c_str() + ); } s->formatter->dump_string("Bucket", s->bucket_name); s->formatter->dump_string("Key", s->object.name);