[Checkins] SVN: z3c.traverser/trunk/src/z3c/traverser/stackinfo/ Fixed problem with virtual hosts

Jürgen Kartnaller juergen at kartnaller.at
Sat Oct 14 08:15:50 EDT 2006


Log message for revision 70612:
  Fixed problem with virtual hosts
  

Changed:
  U   z3c.traverser/trunk/src/z3c/traverser/stackinfo/README.txt
  U   z3c.traverser/trunk/src/z3c/traverser/stackinfo/traversing.py

-=-
Modified: z3c.traverser/trunk/src/z3c/traverser/stackinfo/README.txt
===================================================================
--- z3c.traverser/trunk/src/z3c/traverser/stackinfo/README.txt	2006-10-13 15:30:13 UTC (rev 70611)
+++ z3c.traverser/trunk/src/z3c/traverser/stackinfo/README.txt	2006-10-14 12:15:49 UTC (rev 70612)
@@ -163,6 +163,23 @@
   >>> len(ti)
   0
 
+
+Virtual Host
+============
+
+If virtual hosts are used the traversal stack contains aditional information
+for the virtual host which will interfere which the stack consumer.
+
+  >>> stack = [u'index.html', u'value', u'key',
+  ...          u'kv', u'++', u'inside vh', '++vh++something']
+  >>> request.setTraversalStack(stack)
+  >>> consumers = list(traversing.getStackConsumers(content, request))
+  >>> consumers
+  [(u'kv', <KeyValueConsumer named u'kv'>)]
+  >>> request.getTraversalStack()
+  [u'index.html', u'++', u'inside vh', '++vh++something']
+
+
 URL Handling
 ============
 

Modified: z3c.traverser/trunk/src/z3c/traverser/stackinfo/traversing.py
===================================================================
--- z3c.traverser/trunk/src/z3c/traverser/stackinfo/traversing.py	2006-10-13 15:30:13 UTC (rev 70611)
+++ z3c.traverser/trunk/src/z3c/traverser/stackinfo/traversing.py	2006-10-14 12:15:49 UTC (rev 70612)
@@ -10,8 +10,34 @@
 
 def getStackConsumers(context, request):
     """consumes the stack"""
+    class VHStack:
+        vh = []
+        def prepare(self):
+            if not self.vh:
+                stack = request.getTraversalStack()
+                if not stack:
+                    return
+                name = stack[-1]
+                if name.startswith('++vh++'):
+                    while True:
+                        self.vh.append(stack.pop())
+                        if name == '++':
+                            break
+                        if not stack:
+                            break
+                        name = stack[-1]
+                    # set stack without virtual host entries
+                    request.setTraversalStack(stack)
+        def reset(self):
+            if self.vh:
+                stack = request.getTraversalStack()
+                while self.vh:
+                    stack.append(self.vh.pop())
+                request.setTraversalStack(stack)
+    vhStack = VHStack()
     while True:
-        stack = request.getTraversalStack() 
+        vhStack.prepare()
+        stack = request.getTraversalStack()
         if not stack:
             break
         name = stack[-1]
@@ -19,14 +45,15 @@
             (context, request),
             interface=interfaces.ITraversalStackConsumer,
             name=name)
-        if consumer is not None:
-            try:
-                consumer.consume()
-            except IndexError:
-                raise NotFound(context, name, request)
-            yield (name, consumer)
-            continue
-        break
+        if consumer is None:
+            break
+        try:
+            consumer.consume()
+        except IndexError:
+            raise NotFound(context, name, request)
+        vhStack.reset()
+        yield (name, consumer)
+    vhStack.reset()
 
 def applyStackConsumers(context, request):
     if not request.annotations.has_key(CONSUMED_ANNOTATION_KEY):
@@ -51,7 +78,7 @@
     return urllib.quote(v.encode('utf-8'), _safe)
 
 def unconsumedURL(context, request):
-    
+
     consumed = list(request.annotations.get(CONSUMED_ANNOTATION_KEY))
     if not consumed:
         return absoluteURL(context, request)
@@ -82,7 +109,4 @@
         return unconsumedURL(self.context, self.request)
 
     __call__ = __str__
-            
-    
-    
-    
+



More information about the Checkins mailing list