bool MDSCapMatch::match_path(string_view target_path) const
{
- if (path.length()) {
- if (target_path.find(path) != 0)
+ string _path = path;
+ // drop any tailing /
+ while (_path.length() && _path[_path.length() - 1] == '/') {
+ _path = path.substr(0, _path.length() - 1);
+ }
+
+ if (_path.length()) {
+ if (target_path.find(_path) != 0)
return false;
- // if path doesn't already have a trailing /, make sure the target
- // does so that path=/foo doesn't match target_path=/food
- if (target_path.length() > path.length() &&
- path[path.length()-1] != '/' &&
- target_path[path.length()] != '/')
+ /* In case target_path.find(_path) == 0 && target_path.length() == _path.length():
+ * path=/foo _path=/foo target_path=/foo --> match
+ * path=/foo/ _path=/foo target_path=/foo --> match
+ *
+ * In case target_path.find(_path) == 0 && target_path.length() > _path.length():
+ * path=/foo/ _path=/foo target_path=/foo/ --> match
+ * path=/foo _path=/foo target_path=/foo/ --> match
+ * path=/foo/ _path=/foo target_path=/foo/d --> match
+ * path=/foo _path=/foo target_path=/food --> mismatch
+ *
+ * All the other cases --> mismatch
+ */
+ if (target_path.length() > _path.length() &&
+ target_path[_path.length()] != '/')
return false;
}