Mercurial > public > mercurial-scm > hg
comparison mercurial/hgweb/hgweb_mod.py @ 2434:a2df85adface
http server: support persistent connections.
only "hg serve" affected yet. http server running cgi script will not
use persistent connections. support for fastcgi will help that.
clients that support keepalive can use one tcp connection for all
commands during clone and pull. this makes latency of binary search
during pull much lower over wan.
if server does not know content-length, it will force connection to
close at end. right fix is to use chunked transfer-encoding but this is
easier and does not hurt performance. only command that is affected is
"changegroup" which is always last command during a pull.
author | Vadim Gelfer <vadim.gelfer@gmail.com> |
---|---|
date | Thu, 15 Jun 2006 12:55:58 -0700 |
parents | a8f1049d1d2d |
children | f910b91dd912 |
comparison
equal
deleted
inserted
replaced
2433:d09da6fc1061 | 2434:a2df85adface |
---|---|
8 | 8 |
9 import os | 9 import os |
10 import os.path | 10 import os.path |
11 import mimetypes | 11 import mimetypes |
12 from mercurial.demandload import demandload | 12 from mercurial.demandload import demandload |
13 demandload(globals(), "re zlib ConfigParser") | 13 demandload(globals(), "re zlib ConfigParser cStringIO") |
14 demandload(globals(), "mercurial:mdiff,ui,hg,util,archival,templater") | 14 demandload(globals(), "mercurial:mdiff,ui,hg,util,archival,templater") |
15 demandload(globals(), "mercurial.hgweb.request:hgrequest") | 15 demandload(globals(), "mercurial.hgweb.request:hgrequest") |
16 demandload(globals(), "mercurial.hgweb.common:get_mtime,staticfile") | 16 demandload(globals(), "mercurial.hgweb.common:get_mtime,staticfile") |
17 from mercurial.node import * | 17 from mercurial.node import * |
18 from mercurial.i18n import gettext as _ | 18 from mercurial.i18n import gettext as _ |
759 elif cmd == 'filelog': | 759 elif cmd == 'filelog': |
760 req.write(self.filelog(clean(req.form['file'][0]), | 760 req.write(self.filelog(clean(req.form['file'][0]), |
761 req.form['filenode'][0])) | 761 req.form['filenode'][0])) |
762 | 762 |
763 elif cmd == 'heads': | 763 elif cmd == 'heads': |
764 req.httphdr("application/mercurial-0.1") | 764 resp = " ".join(map(hex, self.repo.heads())) + "\n" |
765 h = self.repo.heads() | 765 req.httphdr("application/mercurial-0.1", length=len(resp)) |
766 req.write(" ".join(map(hex, h)) + "\n") | 766 req.write(resp) |
767 | 767 |
768 elif cmd == 'branches': | 768 elif cmd == 'branches': |
769 req.httphdr("application/mercurial-0.1") | |
770 nodes = [] | 769 nodes = [] |
771 if req.form.has_key('nodes'): | 770 if req.form.has_key('nodes'): |
772 nodes = map(bin, req.form['nodes'][0].split(" ")) | 771 nodes = map(bin, req.form['nodes'][0].split(" ")) |
772 resp = cStringIO.StringIO() | |
773 for b in self.repo.branches(nodes): | 773 for b in self.repo.branches(nodes): |
774 req.write(" ".join(map(hex, b)) + "\n") | 774 resp.write(" ".join(map(hex, b)) + "\n") |
775 resp = resp.getvalue() | |
776 req.httphdr("application/mercurial-0.1", length=len(resp)) | |
777 req.write(resp) | |
775 | 778 |
776 elif cmd == 'between': | 779 elif cmd == 'between': |
777 req.httphdr("application/mercurial-0.1") | |
778 nodes = [] | 780 nodes = [] |
779 if req.form.has_key('pairs'): | 781 if req.form.has_key('pairs'): |
780 pairs = [map(bin, p.split("-")) | 782 pairs = [map(bin, p.split("-")) |
781 for p in req.form['pairs'][0].split(" ")] | 783 for p in req.form['pairs'][0].split(" ")] |
784 resp = cStringIO.StringIO() | |
782 for b in self.repo.between(pairs): | 785 for b in self.repo.between(pairs): |
783 req.write(" ".join(map(hex, b)) + "\n") | 786 resp.write(" ".join(map(hex, b)) + "\n") |
787 resp = resp.getvalue() | |
788 req.httphdr("application/mercurial-0.1", length=len(resp)) | |
789 req.write(resp) | |
784 | 790 |
785 elif cmd == 'changegroup': | 791 elif cmd == 'changegroup': |
786 req.httphdr("application/mercurial-0.1") | 792 req.httphdr("application/mercurial-0.1") |
787 nodes = [] | 793 nodes = [] |
788 if not self.allowpull: | 794 if not self.allowpull: |
817 req.write(staticfile(static, fname) | 823 req.write(staticfile(static, fname) |
818 or self.t("error", error="%r not found" % fname)) | 824 or self.t("error", error="%r not found" % fname)) |
819 | 825 |
820 else: | 826 else: |
821 req.write(self.t("error")) | 827 req.write(self.t("error")) |
828 req.done() |