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