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 -- > --