# HG changeset patch # User Sune Foldager # Date 2009-11-02 09:20:04 # Node ID 8269fe2d48f6caa7808242803d64b7415ba0745a # Parent c40a1ee20aa51378c66b931b9d51dd2459274d6e hgweb: send proper error messages to the client Fixes a bug in protocol which caused an exception during exception handling in some cases on Windows. Also makes sure the server error message is correctly propagated to the client, instead of being thrown away. diff --git a/mercurial/hgweb/common.py b/mercurial/hgweb/common.py --- a/mercurial/hgweb/common.py +++ b/mercurial/hgweb/common.py @@ -31,8 +31,8 @@ def _statusmessage(code): responses = BaseHTTPRequestHandler.responses return responses.get(code, ('Error', 'Unknown error'))[0] -def statusmessage(code): - return '%d %s' % (code, _statusmessage(code)) +def statusmessage(code, message=None): + return '%d %s' % (code, message or _statusmessage(code)) def get_mtime(repo_path): store_path = os.path.join(repo_path, ".hg") diff --git a/mercurial/hgweb/protocol.py b/mercurial/hgweb/protocol.py --- a/mercurial/hgweb/protocol.py +++ b/mercurial/hgweb/protocol.py @@ -181,18 +181,19 @@ def unbundle(repo, req): except ValueError, inst: raise ErrorResponse(HTTP_OK, inst) except (OSError, IOError), inst: - filename = getattr(inst, 'filename', '') - # Don't send our filesystem layout to the client - if filename.startswith(repo.root): - filename = filename[len(repo.root)+1:] - else: - filename = '' error = getattr(inst, 'strerror', 'Unknown error') if inst.errno == errno.ENOENT: code = HTTP_NOT_FOUND else: code = HTTP_SERVER_ERROR - raise ErrorResponse(code, '%s: %s' % (error, filename)) + filename = getattr(inst, 'filename', '') + # Don't send our filesystem layout to the client + if filename and filename.startswith(repo.root): + filename = filename[len(repo.root)+1:] + text = '%s: %s' % (error, filename) + else: + text = error.replace(repo.root + os.path.sep, '') + raise ErrorResponse(code, text) finally: fp.close() os.unlink(tempname) diff --git a/mercurial/hgweb/request.py b/mercurial/hgweb/request.py --- a/mercurial/hgweb/request.py +++ b/mercurial/hgweb/request.py @@ -77,7 +77,7 @@ class wsgirequest(object): if isinstance(status, ErrorResponse): self.header(status.headers) - status = statusmessage(status.code) + status = statusmessage(status.code, status.message) elif status == 200: status = '200 Script output follows' elif isinstance(status, int):