Russell Yanofsky
rey4 at columbia.edu
Sat Aug 9 11:01:21 EST 2003
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
|