|
Gregory (Grisha) Trubetskoy
grisha at modpython.org
Sat Aug 9 13:13:09 EST 2003
Russel -
Since mod_python isn't a CGI environment (and doesn't care to be one
either), the definition of SCRIPT_NAME is rather blurry.
In CGI it is meant to refer to the script which is executed as a separate
process - in mod_python there is no separate process, and the file
containing the code isn't located by the web server, but rather follows
the Python sys.path search rules.
I don't think it would be right to tinker with what req.subprocess_env
contains - it should return whatever apache put there, uncensored, so to
that degree it's not a bug as far as I am concerned.
P.S. If you look at build_cgi_env() in apache.py, it seems to adress this
issue.
Grisha
On Sat, 9 Aug 2003, Russell Yanofsky wrote:
> I've noticed that req.subprocess_env['SCRIPT_NAME'] seems to have the wrong
> value whenever the requested URL ends in a forward slash. This happens with
> mod_python 3.0.3 and apache 2.0.47. Here are some examples:
>
> Requested URL: /mptest/mptest.py/
> Actual SCRIPT_NAME = /mptest/mptest.py/
> Expected SCRIPT_NAME = /mptest/mptest.py
> PATH_INFO = /
>
> Requested URL: /mptest/mptest.py/abc/
> Actual SCRIPT_NAME = /mptest/mptest.py/abc
> Expected SCRIPT_NAME = /mptest/mptest.py
> PATH_INFO = /abc/
>
> Requested URL: /mptest/mptest.py/abc/123/
> Actual SCRIPT_NAME = /mptest/mptest.py/abc/123
> Expected SCRIPT_NAME = /mptest/mptest.py
> PATH_INFO = /abc/123/
>
> When the request doesn't end with a forward slash there's no problem:
>
> Requested URL: /mptest/mptest.py
> Actual SCRIPT_NAME = /mptest/mptest.py
> Expected SCRIPT_NAME = /mptest/mptest.py
> PATH_INFO =
>
> Requested URL: /mptest/mptest.py/abc
> Actual SCRIPT_NAME = /mptest/mptest.py
> Expected SCRIPT_NAME = /mptest/mptest.py
> PATH_INFO = /abc
>
> Requested URL: /mptest/mptest.py/abc/123
> Actual SCRIPT_NAME = /mptest/mptest.py
> Expected SCRIPT_NAME = /mptest/mptest.py
> PATH_INFO = /abc/123
>
> Here's the code I used to produce the above output:
>
> -- begin .htaccess listing --
> AddHandler python-program .py
> PythonHandler mptest
> PythonDebug On
> -- end .htaccess listing --
>
> -- begin mptest.py listing --
> from mod_python import apache
>
> def handler(req):
> req.content_type = 'text/plain'
> env = req.subprocess_env
> req.write('Requested URL: %s\n' % env['REQUEST_URI'])
> req.write(' Actual SCRIPT_NAME = %s\n' % env['SCRIPT_NAME'])
> fixenv(env)
> req.write(' Expected SCRIPT_NAME = %s\n' % env['SCRIPT_NAME'])
> req.write(' PATH_INFO = %s\n' % env.get('PATH_INFO', ''))
> return apache.OK
>
> # This is only a partial fix, does not work in the presence
> # of double slashes in the PATH_INFO segment
> def fixenv(env):
> path_info = env.get('PATH_INFO', '')
> if path_info and path_info[-1] == '/':
> script_name = env['SCRIPT_NAME']
> path_len = len(path_info) - 1
> if path_len:
> assert script_name[-path_len:] == path_info[:-1]
> env['SCRIPT_NAME'] = script_name[:-path_len]
> else:
> assert script_name[-1] == '/'
> env['SCRIPT_NAME'] = script_name[:-1]
> -- end mptest.py listing --
>
> This behavior only seems to occur in mod_python. SCRIPT_NAME does seem to
> have the right value in CGI scripts.
>
> - Russ
>
>
> _______________________________________________
> Mod_python mailing list
> Mod_python at modpython.org
> http://mailman.modpython.org/mailman/listinfo/mod_python
>
|