]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: return valid Location element, CompleteMultipartUpload 20266/head
authorMatt Benjamin <mbenjamin@redhat.com>
Wed, 10 Jan 2018 20:51:20 +0000 (15:51 -0500)
committerMatt Benjamin <mbenjamin@redhat.com>
Fri, 2 Feb 2018 16:42:29 +0000 (11:42 -0500)
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 <mbenjamin@redhat.com>
(cherry picked from commit 0357a8b7ce01a7cd5e3a73f5e0f42617d56b7cfb)

src/rgw/rgw_rest.h
src/rgw/rgw_rest_s3.cc

index 515057dfcd679c8b622603477ed3f23022903239..61d497d36ae440fd8f363eda779ad7fe34d77f2a 100644 (file)
@@ -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", "<SERVER_NAME>"));
+    } else {
+      uri.append(env.get("HTTP_HOST", "<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 */
index ec9011a06bc44d7640a563bc826e54709bb34237..0320a2dfed665ceaeba575ff40c3ca7535bfa000 100644 (file)
@@ -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);