durusmail: qp: empty script_name for unslashed root requests under cgi
empty script_name for unslashed root requests under cgi
2007-08-09
2007-08-09
2007-08-09
2007-08-09
2007-08-10
2007-08-10
2007-08-10
empty script_name for unslashed root requests under cgi
David Binger
2007-08-10
On Aug 9, 2007, at 1:31 PM, Mario Ruggier wrote:

> Quoting David Binger :
>
>> Perhaps your web server is providing the correct SCRIPT_NAME,
>> and the problem is introduced in Publisher.process(), which attempts
>> to work around a common, similar SCRIPT_NAME/PATH_INFO problem in
>> a way that would make matters worse for your setup.
>
> This one is Apache/2.0.49 on a Suze linux box. Thanks for pointing
> me to
> Publisher.process() (should have read the source code better ;-).
> Interestingly
> though, it seems to get it all wrong for the special case here, as
> when the cgi
> script is requested without any trailing slash, the incoming env to
> process
> gives:
>
>     # location: '/app.cgi'
>     SCRIPT_NAME: ''
>     PATH_INFO: '/app.cgi'

Ugh.  I want Apache + app.cgi to provide
SCRIPT_NAME: '/app.cgi'
and
PATH_INFO: ''
In this case.

If you use:
    ScriptAlias /foo 
do you get the same results?

>
>     # location: '/app.cgi/'
>     SCRIPT_NAME: '/app.cgi'
>     PATH_INFO: '/'
>
>> In your case, I think you could try overriding this method and
>> changing any empty PATH_INFO to "/" and removing the "if"
>> statement that
>> appears above.
>
> OK, i tried this instead of what I had on _q_traverse() before:
>
>     def process (self, stdin, env):
>         print env.get('SCRIPT_NAME'), ':', env.get('PATH_INFO')
>         if env.get('SCRIPT_FILENAME'):
>             if not env.get('SCRIPT_NAME'):
>                 if env.get('SCRIPT_FILENAME').endswith(env.get
> ('PATH_INFO')):
>                   # self.redirect(env.get('PATH_INFO') + '/')
>                   env['SCRIPT_NAME'] = env.get('PATH_INFO')
>                   env['PATH_INFO'] = '/'
>         return super(Publisher, self).process(stdin, env)

I think you should not be using SCRIPT_FILENAME at all, since it is not
part of the CGI 1.1 specification.
In your case, it looks like this method could be:

     def process (self, stdin, env):
         if env.get('PATH_INFO') == '':
             env['PATH_INFO'] = env.get('SCRIPT_NAME')
             env['SCRIPT_NAME'] = ''
         hit = Hit(stdin, env)
         self.process_hit(hit)
         return hit

This hack also frustrates me though.  The cgi-caller really should
provide
a SCRIPT_NAME that makes sense.


Another idea:

Add this to your root directory:

        def _q_lookup(self, component):
            redirect('')

Wouldn't this redirect all unknown paths, like '/app.cgi', to '/'?


reply