In gluon/wsgiserver.py, web2py's development http server will split and
unquote url path, as in line 434:

426

427          # Unquote the path+params (e.g. "/this%20path" -> "this path").
428          #
http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5.1.2
429          #
430          # But note that "...a URI must be separated into its components
431          # before the escaped characters within those components can be
432          # safely decoded." http://www.ietf.org/rfc/rfc2396.txt, sec
2.4.2
433          try:
434              atoms = [unquote(x) for x in quoted_slash.split(path)]
435          except ValueError, ex:
436              self.simple_response("400 Bad Request", ex.args[0])
437              return
438          path = "%2F".join(atoms)
439          environ["PATH_INFO"] = path
440

the problem is that, in line 438, the path is reformed but every element in
atoms is unquoted, yet "%2F"("/") is still quoted.

This will raise inconsistency issue when applications run under development
mode and production mode. Under development mode, your application will
received quoted url arguments, but under production mode, e.g. deployed with
fcgi, your application will receive unquoted url arguments.

A small patch would fix this:

Index: web2py-read-only/gluon/
wsgiserver.py
===================================================================
--- web2py-read-only/gluon/wsgiserver.py   2010-02-21 12:08:55.000000000
+0800
+++ web2py-read-only/gluon/wsgiserver.py        2010-02-21
12:22:47.000000000 +0800
@@ -88,7 +88,7 @@
 import threading
 import time
 import traceback
-from urllib import unquote
+from urllib import quote, unquote
 from urlparse import urlparse
 import warnings

@@ -434,7 +434,7 @@
         except ValueError, ex:
             self.simple_response("400 Bad Request", ex.args[0])
             return
-        path = "%2F".join(atoms)
+        path = "%2F".join([quote(x) for x in atoms])
         environ["PATH_INFO"] = path

         # Note that, like wsgiref and most other WSGI servers,


Best regards

-- 
Luyun Xie
谢路云
http://magefromhell.blogspot.com/
(http://blog.hellmage.info/)

-- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To post to this group, send email to web...@googlegroups.com.
To unsubscribe from this group, send email to 
web2py+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/web2py?hl=en.

Index: web2py-read-only/gluon/
wsgiserver.py
===================================================================
--- web2py-read-only/gluon/wsgiserver.py   2010-02-21 12:08:55.000000000 +0800
+++ web2py-read-only/gluon/wsgiserver.py   2010-02-21 12:22:47.000000000 +0800
@@ -88,7 +88,7 @@
 import threading
 import time
 import traceback
-from urllib import unquote
+from urllib import quote, unquote
 from urlparse import urlparse
 import warnings

@@ -434,7 +434,7 @@
         except ValueError, ex:
         self.simple_response("400 Bad Request", ex.args[0])
             return
-        path = "%2F".join(atoms)
+        path = "%2F".join([quote(x) for x in atoms])
         environ["PATH_INFO"] = path

         # Note that, like wsgiref and most other WSGI servers,

Reply via email to