I added a ticket about this until I have time to review it:

http://code.google.com/p/web2py/issues/detail?id=1220&thanks=1220&ts=1355368119

@Jonathan, what do you think?

On Sunday, 2 December 2012 09:15:57 UTC-6, Chris wrote:
>
> 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