]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: return valid Location element, CompleteMultipartUpload 19902/head
authorMatt Benjamin <mbenjamin@redhat.com>
Wed, 10 Jan 2018 20:51:20 +0000 (15:51 -0500)
committerMatt Benjamin <mbenjamin@redhat.com>
Thu, 11 Jan 2018 15:51:14 +0000 (10:51 -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>
src/rgw/rgw_rest.h
src/rgw/rgw_rest_s3.cc

index 495827791a2a6de8253d6f4ca099437edaa8ddb8..f1bae2ff1445a4629d01abe2b0689c2b251e04c4 100644 (file)
@@ -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", "<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,
@@ -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 */
index d660068e70820046c458c325c13df9b3063617d0..79888b38dfea33c5da8c2ce7854dd8ea40deeb1a 100644 (file)
@@ -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);