changeset 9694:8269fe2d48f6

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.
author Sune Foldager <cryo@cyanite.org>
date Mon, 02 Nov 2009 10:20:04 +0100
parents c40a1ee20aa5
children e4211db457c0
files mercurial/hgweb/common.py mercurial/hgweb/protocol.py mercurial/hgweb/request.py
diffstat 3 files changed, 11 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/hgweb/common.py	Mon Nov 02 10:19:14 2009 +0100
+++ b/mercurial/hgweb/common.py	Mon Nov 02 10:20:04 2009 +0100
@@ -31,8 +31,8 @@
     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")
--- a/mercurial/hgweb/protocol.py	Mon Nov 02 10:19:14 2009 +0100
+++ b/mercurial/hgweb/protocol.py	Mon Nov 02 10:20:04 2009 +0100
@@ -181,18 +181,19 @@
         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)
--- a/mercurial/hgweb/request.py	Mon Nov 02 10:19:14 2009 +0100
+++ b/mercurial/hgweb/request.py	Mon Nov 02 10:20:04 2009 +0100
@@ -77,7 +77,7 @@
 
             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):