diff -r a9fd11ffa13f -r cf5c76017e11 mercurial/hgweb/server.py --- a/mercurial/hgweb/server.py Tue Jan 15 01:10:08 2013 +0100 +++ b/mercurial/hgweb/server.py Tue Jan 15 01:10:08 2013 +0100 @@ -133,10 +133,12 @@ self.saved_headers = [] self.sent_headers = False self.length = None + self._chunked = None for chunk in self.server.application(env, self._start_response): self._write(chunk) if not self.sent_headers: self.send_headers() + self._done() def send_headers(self): if not self.saved_status: @@ -145,16 +147,19 @@ saved_status = self.saved_status.split(None, 1) saved_status[0] = int(saved_status[0]) self.send_response(*saved_status) - should_close = True + self.length = None + self._chunked = False for h in self.saved_headers: self.send_header(*h) if h[0].lower() == 'content-length': - should_close = False self.length = int(h[1]) - # The value of the Connection header is a list of case-insensitive - # tokens separated by commas and optional whitespace. - if should_close: - self.send_header('Connection', 'close') + if self.length is None: + self._chunked = (not self.close_connection and + self.request_version == "HTTP/1.1") + if self._chunked: + self.send_header('Transfer-Encoding', 'chunked') + else: + self.send_header('Connection', 'close') self.end_headers() self.sent_headers = True @@ -177,9 +182,16 @@ raise AssertionError("Content-length header sent, but more " "bytes than specified are being written.") self.length = self.length - len(data) + elif self._chunked and data: + data = '%x\r\n%s\r\n' % (len(data), data) self.wfile.write(data) self.wfile.flush() + def _done(self): + if self._chunked: + self.wfile.write('0\r\n\r\n') + self.wfile.flush() + class _httprequesthandleropenssl(_httprequesthandler): """HTTPS handler based on pyOpenSSL"""