From ad3934e335399f7844e45fcfd17f7802800d2cb3 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Thu, 6 Jun 2013 21:53:00 -0700 Subject: [PATCH] rgw: handle deep uri resources In case of deep uri resources (ones created beyond a single level of hierarchy, e.g. auth/v1.0) we want to create a new empty handlers for the path if no handlers exists. E.g., for auth/v1.0 we need to have a handler for 'auth', otherwise the default S3 handler will be used, which we don't want. Signed-off-by: Yehuda Sadeh Reviewed-by: Greg Farnum --- src/rgw/rgw_rest.cc | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/rgw/rgw_rest.cc b/src/rgw/rgw_rest.cc index 35d9b17294562..a9fb136a4df97 100644 --- a/src/rgw/rgw_rest.cc +++ b/src/rgw/rgw_rest.cc @@ -1163,8 +1163,33 @@ void RGWRESTMgr::register_resource(string resource, RGWRESTMgr *mgr) { string r = "/"; r.append(resource); + + /* do we have a resource manager registered for this entry point? */ + map::iterator iter = resource_mgrs.find(r); + if (iter != resource_mgrs.end()) { + delete iter->second; + } resource_mgrs[r] = mgr; resources_by_size.insert(pair(r.size(), r)); + + /* now build default resource managers for the path (instead of nested entry points) + * e.g., if the entry point is /auth/v1.0/ then we'd want to create a default + * manager for /auth/ + */ + + size_t pos = r.find('/', 1); + + while (pos != r.size() - 1 && pos != string::npos) { + string s = r.substr(0, pos); + + iter = resource_mgrs.find(s); + if (iter == resource_mgrs.end()) { /* only register it if one does not exist */ + resource_mgrs[s] = new RGWRESTMgr; /* a default do-nothing manager */ + resources_by_size.insert(pair(s.size(), s)); + } + + pos = r.find('/', pos + 1); + } } void RGWRESTMgr::register_default_mgr(RGWRESTMgr *mgr) -- 2.39.5