}
}
+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,
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 */
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);