On Friday, September 9, 2011 9:17:12 AM UTC-4, kachna wrote:

> I made some investigation and here is results. 
>
> 1) "routes_onerror" do not work with static files. It is cased by 
> lines 488 and 489 in gluon.main 
>
>                 if static_file: 
>                     return http_response.to(responder) 
>
> I comment them and static files HTTP errors works now. 
>
> On Sep 9, 2:38 am, kachna <petr.marti...@gmail.com> wrote: 
> > Hi, 
> > I am trying to catch "invalid request" after requesting non-existing 
> > file from static folder of application "eshop". ...
> > ... 
> > On my PC it works good. Just request.vars.requested_uri in HTTP_error 
> > function is None. It stop working When I move the code on hosting. 
>
>

On issue #1, I agree -- when localhost:8000/default/static/images/logo.png 
downloads properly and I change to a non-existent file name ...fake.png, I 
always receive the plain "invalid request" screen even though I have 
routes_on_error in place that works fine for all kinds of other errors. 
 Commenting out the two lines fixes it.  Thanks!  Massimo and others, can 
you comment on whether this is a correct fix?  It solves the proximate 
cause but may have a ripple effect ...


On issue #2, there are other posts that say request.vars.requested_uri 
won't always be available.  For anyone who wants to reproduce this problem 
... if http://localhost:8000/index.html works, just make the extension 
invalid like this -- http://localhost:8000/index.html&&; .  The error 
handler is invoked, but the request_url, requested_uri and text fields are 
missing from request.vars or '' or None.  (Hard to provide a meaningful 
error message since all the details are blank!)

However there is a way around this specific problem -- in 
gluon.rewrite.try_rewrite_on_error:

if uri.startswith('http://') or uri.startswith('https://'):
    # make up a response
    url = path_info+'?'+query_string
    message = 'You are being redirected <a href="%s">here</a>'
    return HTTP(303, message % url, Location=url), environ
else:
    error_raising_path = environ['PATH_INFO']
    environ['PRAGMA_error_raising_path'] = error_raising_path
    # Rewrite routes_onerror path.
    path_info = '/' + path_info.lstrip('/') # add leading '/' if missing
    environ['PATH_INFO'] = path_info
    error_handling_path = url_in(request, environ)[1]['PATH_INFO']
    # Avoid infinite loop.
    if error_handling_path != error_raising_path:
        # wsgibase will be called recursively with the routes_onerror path.
        environ['PATH_INFO'] = path_info
        environ['QUERY_STRING'] = query_string
        return None, environ

I added the part in red.  Then in gluon.rewrite.map_function:

if not self.router._acfe_match.match(self.function):
    self.env['PRAGMA_web2py_error'] = 'Invalid request'
    raise HTTP(400, thread.routes.error_message % 'invalid request',
               web2py_error='invalid function')
if self.extension and not self.router._acfe_match.match(self.extension):
    self.env['PRAGMA_web2py_error'] = 'Invalid extension'
    raise HTTP(400, thread.routes.error_message % 'invalid request',
               web2py_error='invalid extension')

Then at the top of your error handler controller, attempt to fill in the 
blanks:

request.vars.request_url = request.vars.request_url or request.env.
pragma_error_raising_path
request.vars.text = request.vars.text or request.env.pragma_web2py_error

The result (from my example above) is request_url = '/index.html&&' and 
text = 'invalid extension'

The way I "fixed" this isn't particularly clever.  There are other places 
where web2py_error is passed to HTTP that I didn't handle in this way; I 
didn't want to make unnecessary changes in gluon, but I don't like the lack 
of parallelism.  If it were true that all should be handled this way, then 
setting the pragma variable inside HTTP() would be cleaner.

Massimo and others can judge what's the right way to fix this.  My changes 
here are pretty quick-and-dirty.

Regards --

-- 



Reply via email to