# HG changeset patch # User David Barts # Date 1563221626 25200 # Node ID a78c74c73d9803a3ddf8419cc99e171507252804 # Parent c168aad7a7316d69508e0c8ff4dad939fd19798b Get rid of bogus "None" messages in the standard error pages. diff -r c168aad7a731 -r a78c74c73d98 setup.py --- a/setup.py Mon Jul 15 08:13:51 2019 -0700 +++ b/setup.py Mon Jul 15 13:13:46 2019 -0700 @@ -13,7 +13,7 @@ author_email="tincan@bartsent.com", url='http://bartsent.com/tincan.pspx', py_modules=['tincan'], - scripts=['bin/install-static', 'bin/launch'], + scripts=['tincan.py', 'bin/install-static', 'bin/launch'], license='MIT', platforms='any', install_requires=['bottle>=0.12.0'], diff -r c168aad7a731 -r a78c74c73d98 tincan.py --- a/tincan.py Mon Jul 15 08:13:51 2019 -0700 +++ b/tincan.py Mon Jul 15 13:13:46 2019 -0700 @@ -221,6 +221,17 @@ # U t i l i t i e s +def _hterror(**kwargs): + """ + Make a suitable bottle.HttpError object, with a message that is + always meaningful. + """ + if "status" not in kwargs: + raise ValueError("status argument is mandatory") + if "body" not in kwargs: + kwargs["body"] = "No further details available." + return bottle.HTTPError(**kwargs) + def _normpath(base, unsplit): """ Split, normalize and ensure a possibly relative path is absolute. First @@ -482,12 +493,12 @@ mtime = os.fstat(fp.fileno()).st_mtime bytes = fp.read() except FileNotFoundError as e: - return bottle.HTTPError(status=404, exception=e) + return _hterror(status=404, exception=e) except PermissionError as e: - return bottle.HTTPError(status=403, exception=e) + return _hterror(status=403, exception=e) except OSError as e: self.logger.exception("unexpected exception reading %r", self._fspath) - return bottle.HTTPError(status=500, exception=e) + return _hterror(status=500, exception=e) # Establish preliminary standard headers. headers = { "Content-Type": self._type, @@ -539,7 +550,7 @@ # this will cause a "Critical error while processing request" # page to be displayed, and any installed error pages to be # ignored. - raise bottle.HTTPError(status=500, exception=e) + raise _hterror(status=500, exception=e) class _TinCanRoute(_TinCanBaseRoute): """ @@ -791,10 +802,11 @@ return e except Exception as e: self.logger.exception("%s: unexpected exception", self._urlpath) - raise bottle.HTTPError(status=500, exception=e) + raise _hterror(status=500, exception=e) if target is None: - self.logger.error("%s: unexpected null target", self._urlpath) - raise bottle.HTTPError(status=500, exception=TinCanError(message)) + message = "{0}: unexpected null target".format(self._urlpath) + self.logger.error(message) + raise _hterror(status=500, exception=TinCanError(message)) # We get here if we are doing a server-side programmatic # forward. environ = bottle.request.environ @@ -803,8 +815,9 @@ if _FLOOP not in environ: environ[_FLOOP] = set([self._urlpath]) elif target in environ[_FLOOP]: - self.logger.error("%s: forward loop detected", environ[_FORIG]) - raise bottle.HTTPError(status=500, exception=TinCanError(message)) + message = "{0}: forward loop detected".format(environ[_FORIG]) + self.logger.error(message) + raise _hterror(status=500, exception=TinCanError(message)) environ[_FLOOP].add(target) environ['bottle.raw_path'] = target environ['PATH_INFO'] = urllib.parse.quote(target)