diff options
author | Yehuda Sadeh <yehuda@inktank.com> | 2013-06-06 21:53:00 -0700 |
---|---|---|
committer | Greg Farnum <greg@inktank.com> | 2013-06-07 14:00:09 -0700 |
commit | c75760e39d8df5b1971343e9f9186fd67e154af6 (patch) | |
tree | ccabb755b513a512bac1c4b735eb1899fa51f4c9 | |
parent | bd12e81e48014024171c55f5984c9183c8e363cb (diff) | |
download | ceph-c75760e39d8df5b1971343e9f9186fd67e154af6.tar.gz |
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 <yehuda@inktank.com>
Reviewed-by: Greg Farnum <greg@inktank.com>
(cherry picked from commit ad3934e335399f7844e45fcfd17f7802800d2cb3)
-rw-r--r-- | src/rgw/rgw_rest.cc | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/rgw/rgw_rest.cc b/src/rgw/rgw_rest.cc index 64f9e150b64..8bbf82f0cf9 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<string, RGWRESTMgr *>::iterator iter = resource_mgrs.find(r); + if (iter != resource_mgrs.end()) { + delete iter->second; + } resource_mgrs[r] = mgr; resources_by_size.insert(pair<size_t, string>(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<size_t, string>(s.size(), s)); + } + + pos = r.find('/', pos + 1); + } } void RGWRESTMgr::register_default_mgr(RGWRESTMgr *mgr) |