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):