diff --git a/src/rgw/rgw_common.h b/src/rgw/rgw_common.h index dd62c3e254b641..4204f97691cb63 100644 --- a/src/rgw/rgw_common.h +++ b/src/rgw/rgw_common.h @@ -353,6 +353,15 @@ class RGWHTTPArgs { bool sub_resource_exists(const char *name) const { return (sub_resources.find(name) != std::end(sub_resources)); } + bool exist_obj_excl_sub_resource() const { + char* obj_sub_resource[] = {"append", "torrent", "uploadId", + "uploads", "partNumber", "versionId"}; + for (int i = 0; i != std::size(obj_sub_resource); i++) { + if (sub_resource_exists(obj_sub_resource[i])) return true; + } + return false; + } + std::map& get_params() { return val_map; } diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index 5c1a2d9412140d..104190dde36417 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -4878,10 +4878,12 @@ RGWHandler_REST* RGWRESTMgr_S3::get_handler(rgw::sal::RGWRadosStore *store, } else { if (s->init_state.url_bucket.empty()) { handler = new RGWHandler_REST_Service_S3(auth_registry, enable_sts, enable_iam, enable_pubsub); - } else if (rgw::sal::RGWObject::empty(s->object.get())) { - handler = new RGWHandler_REST_Bucket_S3(auth_registry, enable_pubsub); - } else { + } else if (!rgw::sal::RGWObject::empty(s->object.get())) { handler = new RGWHandler_REST_Obj_S3(auth_registry); + } else if (s->info.args.exist_obj_excl_sub_resource()) { + return NULL; + } else { + handler = new RGWHandler_REST_Bucket_S3(auth_registry, enable_pubsub); } }