8 |
8 |
9 import os, cgi, sys |
9 import os, cgi, sys |
10 import mimetypes |
10 import mimetypes |
11 from demandload import demandload |
11 from demandload import demandload |
12 demandload(globals(), "mdiff time re socket zlib errno ui hg ConfigParser") |
12 demandload(globals(), "mdiff time re socket zlib errno ui hg ConfigParser") |
13 demandload(globals(), "tempfile StringIO BaseHTTPServer util") |
13 demandload(globals(), "tempfile StringIO BaseHTTPServer util SocketServer") |
14 demandload(globals(), "archival mimetypes templater") |
14 demandload(globals(), "archival mimetypes templater") |
15 from node import * |
15 from node import * |
16 from i18n import gettext as _ |
16 from i18n import gettext as _ |
17 |
17 |
18 def up(p): |
18 def up(p): |
876 |
876 |
877 else: |
877 else: |
878 req.write(self.t("error")) |
878 req.write(self.t("error")) |
879 |
879 |
880 def create_server(repo): |
880 def create_server(repo): |
881 |
881 use_threads = True |
|
882 |
882 def openlog(opt, default): |
883 def openlog(opt, default): |
883 if opt and opt != '-': |
884 if opt and opt != '-': |
884 return open(opt, 'w') |
885 return open(opt, 'w') |
885 return default |
886 return default |
886 |
887 |
887 address = repo.ui.config("web", "address", "") |
888 address = repo.ui.config("web", "address", "") |
888 port = int(repo.ui.config("web", "port", 8000)) |
889 port = int(repo.ui.config("web", "port", 8000)) |
889 use_ipv6 = repo.ui.configbool("web", "ipv6") |
890 use_ipv6 = repo.ui.configbool("web", "ipv6") |
890 accesslog = openlog(repo.ui.config("web", "accesslog", "-"), sys.stdout) |
891 accesslog = openlog(repo.ui.config("web", "accesslog", "-"), sys.stdout) |
891 errorlog = openlog(repo.ui.config("web", "errorlog", "-"), sys.stderr) |
892 errorlog = openlog(repo.ui.config("web", "errorlog", "-"), sys.stderr) |
892 |
893 |
893 class IPv6HTTPServer(BaseHTTPServer.HTTPServer): |
894 if use_threads: |
|
895 try: |
|
896 from threading import activeCount |
|
897 except ImportError: |
|
898 use_threads = False |
|
899 |
|
900 if use_threads: |
|
901 _mixin = SocketServer.ThreadingMixIn |
|
902 else: |
|
903 if hasattr(os, "fork"): |
|
904 _mixin = SocketServer.ForkingMixIn |
|
905 else: |
|
906 class _mixin: pass |
|
907 |
|
908 class MercurialHTTPServer(_mixin, BaseHTTPServer.HTTPServer): |
|
909 pass |
|
910 |
|
911 class IPv6HTTPServer(MercurialHTTPServer): |
894 address_family = getattr(socket, 'AF_INET6', None) |
912 address_family = getattr(socket, 'AF_INET6', None) |
895 |
913 |
896 def __init__(self, *args, **kwargs): |
914 def __init__(self, *args, **kwargs): |
897 if self.address_family is None: |
915 if self.address_family is None: |
898 raise hg.RepoError(_('IPv6 not available on this system')) |
916 raise hg.RepoError(_('IPv6 not available on this system')) |
954 accept = accept + line[7:].split(',') |
972 accept = accept + line[7:].split(',') |
955 env['HTTP_ACCEPT'] = ','.join(accept) |
973 env['HTTP_ACCEPT'] = ','.join(accept) |
956 |
974 |
957 req = hgrequest(self.rfile, self.wfile, env) |
975 req = hgrequest(self.rfile, self.wfile, env) |
958 self.send_response(200, "Script output follows") |
976 self.send_response(200, "Script output follows") |
959 hg.run(req) |
977 hgweb(repo.__class__(repo.ui, repo.origroot)).run(req) |
960 |
978 |
961 hg = hgweb(repo) |
|
962 if use_ipv6: |
979 if use_ipv6: |
963 return IPv6HTTPServer((address, port), hgwebhandler) |
980 return IPv6HTTPServer((address, port), hgwebhandler) |
964 else: |
981 else: |
965 return BaseHTTPServer.HTTPServer((address, port), hgwebhandler) |
982 return MercurialHTTPServer((address, port), hgwebhandler) |
966 |
983 |
967 # This is a stopgap |
984 # This is a stopgap |
968 class hgwebdir(object): |
985 class hgwebdir(object): |
969 def __init__(self, config): |
986 def __init__(self, config): |
970 def cleannames(items): |
987 def cleannames(items): |