mercurial/hgweb/request.py
changeset 2434 a2df85adface
parent 2394 a8f1049d1d2d
child 2464 09b1c9ef317c
--- a/mercurial/hgweb/request.py
+++ b/mercurial/hgweb/request.py
@@ -16,6 +16,7 @@ class hgrequest(object):
         self.out = out or sys.stdout
         self.env = env or os.environ
         self.form = cgi.parse(self.inp, self.env, keep_blank_values=1)
+        self.will_close = True
 
     def write(self, *things):
         for thing in things:
@@ -29,16 +30,30 @@ class hgrequest(object):
                     if inst[0] != errno.ECONNRESET:
                         raise
 
+    def done(self):
+        if self.will_close:
+            self.inp.close()
+            self.out.close()
+        else:
+            self.out.flush()
+
     def header(self, headers=[('Content-type','text/html')]):
         for header in headers:
             self.out.write("%s: %s\r\n" % header)
         self.out.write("\r\n")
 
-    def httphdr(self, type, file="", size=0):
+    def httphdr(self, type, filename=None, length=0):
 
         headers = [('Content-type', type)]
-        if file:
-            headers.append(('Content-disposition', 'attachment; filename=%s' % file))
-        if size > 0:
-            headers.append(('Content-length', str(size)))
+        if filename:
+            headers.append(('Content-disposition', 'attachment; filename=%s' %
+                            filename))
+        # we do not yet support http 1.1 chunked transfer, so we have
+        # to force connection to close if content-length not known
+        if length:
+            headers.append(('Content-length', str(length)))
+            self.will_close = False
+        else:
+            headers.append(('Connection', 'close'))
+            self.will_close = True
         self.header(headers)