diff -rup eggbasket.old/eggbasket/controllers/errorcatcher.py eggbasket/eggbasket/controllers/errorcatcher.py --- eggbasket.old/eggbasket/controllers/errorcatcher.py 2010-05-17 12:40:16.000000000 +0800 +++ eggbasket/eggbasket/controllers/errorcatcher.py 2010-05-17 12:38:19.000000000 +0800 @@ -114,10 +114,17 @@ class ErrorCatcher(controllers.RootContr self.smtp_password = config.get('mail.password') self.no_email_on = config.get('error_catcher.no_email_on', (401, 403, 404)) + self.redirect_404_to_pypi = config.get('error_catcher.redirect_404_to_pypi', + True) + self.pypi_base = config.get('error_catcher.pypi_base', 'http://pypi.python.org/simple') def cp_on_http_error(self, status, message): """Handle HTTP errors by sending an error page and email.""" try: + if self.redirect_404_to_pypi and status == 404: + self.redirect_error(redirect=self.pypi_base + cherrypy.request.path_info) + return + cherrypy._cputil._cp_on_http_error(status, message) error_msg = self._get_error_message(status, message) url = cherrypy.request.requestLine @@ -165,6 +172,10 @@ class ErrorCatcher(controllers.RootContr if config.get('error_catcher.on', False): _cp_on_http_error = cp_on_http_error + def redirect_error(self, **data): + cherrypy.response.status = 302 + cherrypy.response.headers['Location'] = data['redirect'] + def send_error_page(self, **data): """Render error page using template looked up in self._error_templates. """