return handler;
}
+bool RGWHandler_REST_S3Website::web_dir() const {
+ std::string subdir_name = url_decode(s->object.name);
+
+ if (subdir_name.empty()) {
+ return false;
+ } else if (subdir_name.back() == '/') {
+ subdir_name.pop_back();
+ }
+
+ rgw_obj obj(s->bucket, subdir_name);
+
+ RGWObjectCtx& obj_ctx = *static_cast<RGWObjectCtx *>(s->obj_ctx);
+ obj_ctx.obj.set_atomic(obj);
+ obj_ctx.obj.set_prefetch_data(obj);
+
+ RGWObjState* state = nullptr;
+ if (store->get_obj_state(&obj_ctx, s->bucket_info, obj, &state, false) < 0) {
+ return false;
+ }
+ if (! state->exists) {
+ return false;
+ }
+ return state->exists;
+}
+
int RGWHandler_REST_S3Website::retarget(RGWOp* op, RGWOp** new_op) {
*new_op = op;
ldout(s->cct, 10) << __func__ << "Starting retarget" << dendl;
}
rgw_obj_key new_obj;
- s->bucket_info.website_conf.get_effective_key(s->object.name, &new_obj.name);
+ s->bucket_info.website_conf.get_effective_key(s->object.name, &new_obj.name, web_dir());
ldout(s->cct, 10) << "retarget get_effective_key " << s->object << " -> "
<< new_obj << dendl;
#include "rgw_rest_s3.h"
class RGWHandler_REST_S3Website : public RGWHandler_REST_S3 {
+ bool web_dir() const;
protected:
int retarget(RGWOp *op, RGWOp **new_op) override;
// TODO: this should be virtual I think, and ensure that it's always
return true;
}
-void RGWBucketWebsiteConf::get_effective_key(const string& key, string *effective_key) const
+void RGWBucketWebsiteConf::get_effective_key(const string& key, string *effective_key, bool is_file) const
{
if (key.empty()) {
*effective_key = index_doc_suffix;
} else if (key[key.size() - 1] == '/') {
*effective_key = key + index_doc_suffix;
+ } else if (! is_file) {
+ *effective_key = key + "/" + index_doc_suffix;
} else {
*effective_key = key;
}
RGWBWRoutingRule *redirect);
void get_effective_key(const std::string& key,
- std::string *effective_key) const;
+ std::string *effective_key, bool is_file) const;
const std::string& get_index_doc() const {
return index_doc_suffix;