diff options
Diffstat (limited to 'repoze/bfg/traversal.py')
| -rw-r--r-- | repoze/bfg/traversal.py | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/repoze/bfg/traversal.py b/repoze/bfg/traversal.py new file mode 100644 index 000000000..1b9cfb332 --- /dev/null +++ b/repoze/bfg/traversal.py @@ -0,0 +1,47 @@ +import urllib + +from zope.interface import implements + +from repoze.bfg.interfaces import ITraversalPolicy +from repoze.bfg.interfaces import ITraverser + +def split_path(path): + if path.startswith('/'): + path = path[1:] + if path.endswith('/'): + path = path[:-1] + clean=[] + for segment in path.split('/'): + segment = urllib.unquote(segment) # deal with spaces in path segment + if not segment or segment=='.': + continue + elif segment == '..': + del clean[-1] + else: + clean.append(segment) + return clean + +class NaiveTraversalPolicy: + implements(ITraversalPolicy) + + def __call__(self, environ, root): + path = split_path(environ['PATH_INFO']) + + ob = root + name = '' + + while path: + segment = pop(path) + traverser = ITraverser(ob) + next = traverser(environ, segment) + if next is None: + if path: + name = pop(path) + break + ob = next + + return ob, name, path + +def pop(path): + return path.pop(0) + |
