summaryrefslogtreecommitdiff
path: root/repoze/bfg/traversal.py
diff options
context:
space:
mode:
Diffstat (limited to 'repoze/bfg/traversal.py')
-rw-r--r--repoze/bfg/traversal.py47
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)
+