diff -ur -x .svn -x '*.pyc' web.py-0.33/web/application.py ../src/ulib/ext/web/application.py
--- web.py-0.33/web/application.py	2009-10-28 09:45:10.000000000 +0400
+++ ../src/ulib/ext/web/application.py	2009-11-18 08:54:43.000000000 +0400
@@ -352,7 +352,7 @@
         ctx.realhome = ctx.home
         ctx.ip = env.get('REMOTE_ADDR')
         ctx.method = env.get('REQUEST_METHOD')
-        ctx.path = env.get('PATH_INFO')
+        ctx.path = env.get('PATH_INFO') or ''
         # http://trac.lighttpd.net/trac/ticket/406 requires:
         if env.get('SERVER_SOFTWARE', '').startswith('lighttpd/'):
             ctx.path = lstrips(env.get('REQUEST_URI').split('?')[0], ctx.homepath)
@@ -376,6 +376,15 @@
         
         ctx.app_stack = []
 
+    _handler_configurator = None
+    
+    def set_handler_configurator(self, handler_configurator):
+        self._handler_configurator = handler_configurator
+    
+    def configure_handler(self, handler):
+        if self._handler_configurator is not None:
+            self._handler_configurator(handler)
+
     def _delegate(self, f, fvars, args=[]):
         def handle_class(cls):
             meth = web.ctx.method
@@ -383,7 +392,9 @@
                 meth = 'GET'
             if not hasattr(cls, meth):
                 raise web.nomethod(cls)
-            tocall = getattr(cls(), meth)
+            handler = cls()
+            self.configure_handler(handler)
+            tocall = getattr(handler, meth)
             return tocall(*args)
             
         def is_class(o): return isinstance(o, (types.ClassType, type))
diff -ur -x .svn -x '*.pyc' web.py-0.33/web/httpserver.py ../src/ulib/ext/web/httpserver.py
--- web.py-0.33/web/httpserver.py	2009-10-28 09:45:10.000000000 +0400
+++ ../src/ulib/ext/web/httpserver.py	2009-11-18 08:54:44.000000000 +0400
@@ -1,6 +1,8 @@
 __all__ = ["runsimple"]
 
 import sys, os
+from os import path
+import urlparse, posixpath, urllib
 from SimpleHTTPServer import SimpleHTTPRequestHandler
 
 import webapi as web
@@ -126,7 +128,7 @@
             self.app = func
             self.serverShuttingDown = 0
 
-    print "http://%s:%d/" % server_address
+    #print "http://%s:%d/" % server_address
     WSGIServer(func, server_address).serve_forever()
 
 def runsimple(func, server_address=("0.0.0.0", 8080)):
@@ -141,7 +143,7 @@
     
     server = WSGIServer(server_address, func)
 
-    print "http://%s:%d/" % server_address
+    #print "http://%s:%d/" % server_address
     try:
         server.start()
     except KeyboardInterrupt:
@@ -161,6 +163,19 @@
         self.environ = environ
         self.start_response = start_response
 
+    def translate_path(self, path):
+        path = urlparse.urlparse(path)[2]
+        path = posixpath.normpath(urllib.unquote(path))
+        words = path.split('/')
+        words = filter(None, words)
+        path = web.config.get('BASEDIR', os.getcwd())
+        for word in words:
+            _, word = os.path.splitdrive(word)
+            _, word = os.path.split(word)
+            if word in (os.curdir, os.pardir): continue
+            path = os.path.join(path, word)
+        return path
+    
     def send_response(self, status, msg=""):
         self.status = str(status) + " " + msg
 
diff -ur -x .svn -x '*.pyc' web.py-0.33/web/__init__.py ../src/ulib/ext/web/__init__.py
--- web.py-0.33/web/__init__.py	2009-10-28 09:45:10.000000000 +0400
+++ ../src/ulib/ext/web/__init__.py	2009-11-18 08:54:43.000000000 +0400
@@ -26,7 +26,7 @@
 from debugerror import *
 from application import *
 from browser import *
-import test
+#import test
 try:
     import webopenid as openid
 except ImportError:
diff -ur -x .svn -x '*.pyc' web.py-0.33/web/template.py ../src/ulib/ext/web/template.py
--- web.py-0.33/web/template.py	2009-10-28 09:45:10.000000000 +0400
+++ ../src/ulib/ext/web/template.py	2009-11-18 10:00:17.314384800 +0400
@@ -382,6 +382,21 @@
         readline = iter([text]).next
         tokens = tokenize.generate_tokens(readline)
         return [t[1] for t in tokens]
+    
+    def tabsout(self, line, indent):
+        indent = indent.replace('\t', '    ')
+        re_tabs = re_compile(r'^\t+')
+        mo = re_tabs.match(line)
+        if mo is None:
+            return line, 0
+        else:
+            actual_nbtabs = len(mo.group(0))
+            nbtabs = max(0, actual_nbtabs - len(indent) / 4)
+            return re_compile(r'\t').sub('    ', line, actual_nbtabs), nbtabs
+        
+    def tabsin(self, line, nbtabs):
+        if nbtabs > 0: line = re_compile(r'    ').sub('\t', line, nbtabs)
+        return line
         
     def read_indented_block(self, text, indent):
         r"""Read a block of text. A block is what typically follows a for or it statement.
@@ -400,11 +415,13 @@
             
         block = ""
         while text:
-            line, text2 = splitline(text)
+            oline, text2 = splitline(text)
+            line, nbtabs = self.tabsout(oline, indent)
             if line.strip() == "":
                 block += '\n'
             elif line.startswith(indent):
-                block += line[len(indent):]
+                line = line[len(indent):]
+                block += self.tabsin(line, nbtabs)
             else:
                 break
             text = text2
@@ -446,10 +463,12 @@
                 return first_indent or ""
 
             # find the indentation of the block by looking at the first line
+            text, nbtabs = self.tabsout(text, begin_indent)
             first_indent = find_indent(text)[len(begin_indent):]
             indent = begin_indent + min(first_indent, INDENT)
             
             block, text = self.read_indented_block(text, indent)
+            text = self.tabsin(text, nbtabs)
             
         return self.create_block_node(keyword, stmt, block, begin_indent), text
         
@@ -520,7 +539,7 @@
         return self.defwith + self.suite.emit(indent + INDENT)
 
     def __repr__(self):
-        return "<defwith: %s, %s>" % (self.defwith, self.nodes)
+        return "<defwith: %s, %s>" % (self.defwith, self.suite)
 
 class TextNode:
     def __init__(self, value):
Seulement dans ../src/ulib/ext/web/wsgiserver: LICENSE.txt