Mercurial > public > mercurial-scm > hg
comparison mercurial/hgweb/server.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 | ffc3b2f1ab6a |
children | 01b856927970 |
comparison
equal
deleted
inserted
replaced
2433:d09da6fc1061 | 2434:a2df85adface |
---|---|
25 path, query = uri, '' | 25 path, query = uri, '' |
26 return urllib.unquote(path), query | 26 return urllib.unquote(path), query |
27 | 27 |
28 class _hgwebhandler(object, BaseHTTPServer.BaseHTTPRequestHandler): | 28 class _hgwebhandler(object, BaseHTTPServer.BaseHTTPRequestHandler): |
29 def __init__(self, *args, **kargs): | 29 def __init__(self, *args, **kargs): |
30 self.protocol_version = 'HTTP/1.1' | |
30 BaseHTTPServer.BaseHTTPRequestHandler.__init__(self, *args, **kargs) | 31 BaseHTTPServer.BaseHTTPRequestHandler.__init__(self, *args, **kargs) |
31 | 32 |
32 def log_error(self, format, *args): | 33 def log_error(self, format, *args): |
33 errorlog = self.server.errorlog | 34 errorlog = self.server.errorlog |
34 errorlog.write("%s - - [%s] %s\n" % (self.address_string(), | 35 errorlog.write("%s - - [%s] %s\n" % (self.address_string(), |
83 accept = accept + line[7:].split(',') | 84 accept = accept + line[7:].split(',') |
84 env['HTTP_ACCEPT'] = ','.join(accept) | 85 env['HTTP_ACCEPT'] = ','.join(accept) |
85 | 86 |
86 req = hgrequest(self.rfile, self.wfile, env) | 87 req = hgrequest(self.rfile, self.wfile, env) |
87 self.send_response(200, "Script output follows") | 88 self.send_response(200, "Script output follows") |
88 self.server.make_and_run_handler(req) | 89 self.close_connection = self.server.make_and_run_handler(req) |
89 | 90 |
90 def create_server(ui, repo): | 91 def create_server(ui, repo): |
91 use_threads = True | 92 use_threads = True |
92 | 93 |
93 def openlog(opt, default): | 94 def openlog(opt, default): |
133 hgwebobj = self.repoviewmaker(repo.__class__(repo.ui, | 134 hgwebobj = self.repoviewmaker(repo.__class__(repo.ui, |
134 repo.origroot)) | 135 repo.origroot)) |
135 else: | 136 else: |
136 raise hg.RepoError(_('no repo found')) | 137 raise hg.RepoError(_('no repo found')) |
137 hgwebobj.run(req) | 138 hgwebobj.run(req) |
139 return req.will_close | |
138 | 140 |
139 class IPv6HTTPServer(MercurialHTTPServer): | 141 class IPv6HTTPServer(MercurialHTTPServer): |
140 address_family = getattr(socket, 'AF_INET6', None) | 142 address_family = getattr(socket, 'AF_INET6', None) |
141 | 143 |
142 def __init__(self, *args, **kwargs): | 144 def __init__(self, *args, **kwargs): |