diff mercurial/hgweb/request.py @ 5561:22713dce19f6

hgweb: return meaningful HTTP status codes instead of nonsense
author Bryan O'Sullivan <bos@serpentine.com>
date Wed, 28 Nov 2007 08:38:42 -0800
parents ff7253a0d1da
children d61fea133f2d
line wrap: on
line diff
--- a/mercurial/hgweb/request.py	Wed Nov 28 08:38:06 2007 -0800
+++ b/mercurial/hgweb/request.py	Wed Nov 28 08:38:42 2007 -0800
@@ -8,6 +8,7 @@
 
 import socket, cgi, errno
 from mercurial.i18n import gettext as _
+from common import ErrorResponse
 
 class wsgiapplication(object):
     def __init__(self, destmaker):
@@ -42,25 +43,37 @@
     def read(self, count=-1):
         return self.inp.read(count)
 
-    def write(self, *things):
+    def respond(self, status, *things):
         for thing in things:
             if hasattr(thing, "__iter__"):
                 for part in thing:
-                    self.write(part)
+                    self.respond(status, part)
             else:
                 thing = str(thing)
                 if self.server_write is None:
                     if not self.headers:
                         raise RuntimeError("request.write called before headers sent (%s)." % thing)
-                    self.server_write = self.start_response('200 Script output follows',
+                    code = None
+                    if isinstance(status, ErrorResponse):
+                        code = status.code
+                    elif isinstance(status, int):
+                        code = status
+                    if code:
+                        from httplib import responses
+                        status = '%d %s' % (
+                            code, responses.get(code, 'Error'))
+                    self.server_write = self.start_response(status,
                                                             self.headers)
                     self.start_response = None
-                    self.headers = None
+                    self.headers = []
                 try:
                     self.server_write(thing)
                 except socket.error, inst:
                     if inst[0] != errno.ECONNRESET:
                         raise
+        
+    def write(self, *things):
+        self.respond('200 Script output follows', *things)
 
     def writelines(self, lines):
         for line in lines: