2009/9/28 Ian Bicking <i...@colorstudy.com>:
> I tried implementing some code to convert REQUEST_URI (the raw request URL)
> and CGI-style SCRIPT_NAME/PATH_INFO into a raw script_name/path_info.
>   http://bitbucket.org/ianb/wsgi-peps/src/tip/request_uri.py (python 2)
>   http://bitbucket.org/ianb/wsgi-peps/src/tip/request_uri3.py (python 3)
> Admittedly the tests are not very complete, I just wasn't feeling creative
> about test cases.  In terms of performance this avoids being entirely brute
> force, but feels kind of complex.  I'm betting there's an entirely different
> approach which is faster.  But whatever.

Got an error:

 mod_wsgi (pid=4301): Exception occurred processing WSGI script
'/Users/grahamd/Testing/tests/wsgi20.wsgi'.
 Traceback (most recent call last):
   File "/Users/grahamd/Testing/tests/wsgi20.wsgi", line 80, in application
     environ['PATH_INFO'])
   File "/Users/grahamd/Testing/tests/wsgi20.wsgi", line 64, in
request_uri_to_path
     remove_segments = remove_segments - 1 -
qscript_name_parts[-1].lower().count('%2f')
 IndexError: list index out of range

This was an extreme corner case where Apache mod_rewrite was being
used to do stuff:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /wsgi20.wsgi/$1 [QSA,PT,L]

and Apache was configured to allow encoded slashes. The input would have been:

REQUEST_URI: '/a%2fb/c/d'
SCRIPT_NAME: '/wsgi20.wsgi'
PATH_INFO: '/a/b/c/d'

That style of rewrite rule is quite often used with Apache, although
allowing encoded slashes isn't.

That SCRIPT_NAME needs to be adjusted is a known consideration with
this rewrite rule. Usually you would use wrapper around WSGI
application which does:

def _application(environ, start_response):
    # The original application.
    ...

import posixpath

def application(environ, start_response):
    # Wrapper to set SCRIPT_NAME to actual mount point.
    environ['SCRIPT_NAME'] = posixpath.dirname(environ['SCRIPT_NAME'])
    if environ['SCRIPT_NAME'] == '/':
        environ['SCRIPT_NAME'] = ''
    return _application(environ, start_response)

If that algorithm is used in WSGI adapter however, would never get the
opportunity to do that though as would already have failed before it
got called.

Graham
_______________________________________________
Web-SIG mailing list
Web-SIG@python.org
Web SIG: http://www.python.org/sigs/web-sig
Unsubscribe: 
http://mail.python.org/mailman/options/web-sig/archive%40mail-archive.com

Reply via email to