From: Yehuda Sadeh Date: Fri, 7 Jun 2013 04:53:00 +0000 (-0700) Subject: rgw: handle deep uri resources X-Git-Tag: v0.56.7~13 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5047a4ff16f556ec25b6624fe8f1a07e3ec5f864;p=ceph.git 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 (cherry picked from commit ad3934e335399f7844e45fcfd17f7802800d2cb3) --- diff --git a/src/rgw/rgw_rest.cc b/src/rgw/rgw_rest.cc index 72a9ba3b6cf1..00baf7cabccb 100644 --- a/src/rgw/rgw_rest.cc +++ b/src/rgw/rgw_rest.cc @@ -1076,8 +1076,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)