# HG changeset patch # User Augie Fackler # Date 2018-02-17 06:11:48 # Node ID af0a19d8812bcc789ec4661d342b612f250c2644 # Parent 46c97973ee46619438f54eac22f7ec5492384a0d py3: get bytes-repr of network errors portably This resolves a lot of weird issues in Python 3 around error strings. Differential Revision: https://phab.mercurial-scm.org/D2295 diff --git a/mercurial/hgweb/hgweb_mod.py b/mercurial/hgweb/hgweb_mod.py --- a/mercurial/hgweb/hgweb_mod.py +++ b/mercurial/hgweb/hgweb_mod.py @@ -443,20 +443,20 @@ class hgweb(object): except (error.LookupError, error.RepoLookupError) as err: req.respond(HTTP_NOT_FOUND, ctype) - msg = str(err) + msg = pycompat.bytestr(err) if (util.safehasattr(err, 'name') and not isinstance(err, error.ManifestLookupError)): msg = 'revision not found: %s' % err.name return tmpl('error', error=msg) except (error.RepoError, error.RevlogError) as inst: req.respond(HTTP_SERVER_ERROR, ctype) - return tmpl('error', error=str(inst)) + return tmpl('error', error=pycompat.bytestr(inst)) except ErrorResponse as inst: req.respond(inst, ctype) if inst.code == HTTP_NOT_MODIFIED: # Not allowed to return a body on a 304 return [''] - return tmpl('error', error=str(inst)) + return tmpl('error', error=pycompat.bytestr(inst)) def check_perm(self, rctx, req, op): for permhook in permhooks: diff --git a/mercurial/hgweb/request.py b/mercurial/hgweb/request.py --- a/mercurial/hgweb/request.py +++ b/mercurial/hgweb/request.py @@ -121,7 +121,8 @@ class wsgirequest(object): elif isinstance(status, int): status = statusmessage(status) - self.server_write = self._start_response(status, self.headers) + self.server_write = self._start_response( + pycompat.sysstr(status), self.headers) self._start_response = None self.headers = [] if body is not None: diff --git a/mercurial/hgweb/webutil.py b/mercurial/hgweb/webutil.py --- a/mercurial/hgweb/webutil.py +++ b/mercurial/hgweb/webutil.py @@ -347,7 +347,7 @@ def linerange(req): try: return util.processlinerange(fromline, toline) except error.ParseError as exc: - raise ErrorResponse(HTTP_BAD_REQUEST, str(exc)) + raise ErrorResponse(HTTP_BAD_REQUEST, pycompat.bytestr(exc)) def formatlinerange(fromline, toline): return '%d:%d' % (fromline + 1, toline) diff --git a/mercurial/wireproto.py b/mercurial/wireproto.py --- a/mercurial/wireproto.py +++ b/mercurial/wireproto.py @@ -879,11 +879,11 @@ def getbundle(repo, proto, others): # cleanly forward Abort error to the client if not exchange.bundle2requested(opts.get('bundlecaps')): if proto.name == 'http-v1': - return ooberror(str(exc) + '\n') + return ooberror(pycompat.bytestr(exc) + '\n') raise # cannot do better for bundle1 + ssh # bundle2 request expect a bundle2 reply bundler = bundle2.bundle20(repo.ui) - manargs = [('message', str(exc))] + manargs = [('message', pycompat.bytestr(exc))] advargs = [] if exc.hint is not None: advargs.append(('hint', exc.hint)) diff --git a/mercurial/wireprotoserver.py b/mercurial/wireprotoserver.py --- a/mercurial/wireprotoserver.py +++ b/mercurial/wireprotoserver.py @@ -339,7 +339,7 @@ def _handlehttperror(e, req, cmd): # TODO This response body assumes the failed command was # "unbundle." That assumption is not always valid. - req.respond(e, HGTYPE, body='0\n%s\n' % e) + req.respond(e, HGTYPE, body='0\n%s\n' % pycompat.bytestr(e)) return ''