From: Matt Benjamin Date: Wed, 10 Jan 2018 20:51:20 +0000 (-0500) Subject: rgw: return valid Location element, CompleteMultipartUpload X-Git-Tag: v13.0.2~371^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=0357a8b7ce01a7cd5e3a73f5e0f42617d56b7cfb;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 --- diff --git a/src/rgw/rgw_rest.h b/src/rgw/rgw_rest.h index 495827791a2a..f1bae2ff1445 100644 --- a/src/rgw/rgw_rest.h +++ b/src/rgw/rgw_rest.h @@ -713,6 +713,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, @@ -745,7 +761,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 d660068e7082..79888b38dfea 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -2538,23 +2538,24 @@ void RGWCompleteMultipart_ObjStore_S3::send_response() dump_errno(s); dump_header_if_nonempty(s, "x-amz-version-id", version_id); 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);