Mercurial > public > mercurial-scm > hg
comparison mercurial/hgweb.py @ 2123:c0729a7f6f8a
Fixed path handling of the standalone server, fixed typo.
author | Alexander Schremmer <alex AT alexanderweb DOT de> |
---|---|
date | Sun, 23 Apr 2006 00:34:07 +0200 |
parents | 9383ba6b069a |
children | 27fd8b7a6c51 |
comparison
equal
deleted
inserted
replaced
2122:9383ba6b069a | 2123:c0729a7f6f8a |
---|---|
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 SocketServer") | 13 demandload(globals(), "tempfile StringIO BaseHTTPServer util SocketServer") |
14 demandload(globals(), "archival mimetypes templater") | 14 demandload(globals(), "archival mimetypes templater urllib") |
15 from node import * | 15 from node import * |
16 from i18n import gettext as _ | 16 from i18n import gettext as _ |
17 | |
18 def splitURI(uri): | |
19 """ Return path and query splited from uri | |
20 | |
21 Just like CGI environment, the path is unquoted, the query is | |
22 not. | |
23 """ | |
24 if '?' in uri: | |
25 path, query = uri.split('?', 1) | |
26 else: | |
27 path, query = uri, '' | |
28 return urllib.unquote(path), query | |
17 | 29 |
18 def up(p): | 30 def up(p): |
19 if p[0] != "/": | 31 if p[0] != "/": |
20 p = "/" + p | 32 p = "/" + p |
21 if p[-1] == "/": | 33 if p[-1] == "/": |
916 if self.address_family is None: | 928 if self.address_family is None: |
917 raise hg.RepoError(_('IPv6 not available on this system')) | 929 raise hg.RepoError(_('IPv6 not available on this system')) |
918 BaseHTTPServer.HTTPServer.__init__(self, *args, **kwargs) | 930 BaseHTTPServer.HTTPServer.__init__(self, *args, **kwargs) |
919 | 931 |
920 class hgwebhandler(BaseHTTPServer.BaseHTTPRequestHandler): | 932 class hgwebhandler(BaseHTTPServer.BaseHTTPRequestHandler): |
933 | |
921 def log_error(self, format, *args): | 934 def log_error(self, format, *args): |
922 errorlog.write("%s - - [%s] %s\n" % (self.address_string(), | 935 errorlog.write("%s - - [%s] %s\n" % (self.address_string(), |
923 self.log_date_time_string(), | 936 self.log_date_time_string(), |
924 format % args)) | 937 format % args)) |
925 | 938 |
937 | 950 |
938 def do_GET(self): | 951 def do_GET(self): |
939 self.do_POST() | 952 self.do_POST() |
940 | 953 |
941 def do_hgweb(self): | 954 def do_hgweb(self): |
942 query = "" | 955 path_info, query = splitURI(self.path) |
943 p = self.path.find("?") | 956 |
944 if p: | |
945 query = self.path[p + 1:] | |
946 query = query.replace('+', ' ') | |
947 | |
948 env = {} | 957 env = {} |
949 env['GATEWAY_INTERFACE'] = 'CGI/1.1' | 958 env['GATEWAY_INTERFACE'] = 'CGI/1.1' |
950 env['REQUEST_METHOD'] = self.command | 959 env['REQUEST_METHOD'] = self.command |
951 env['SERVER_NAME'] = self.server.server_name | 960 env['SERVER_NAME'] = self.server.server_name |
952 env['SERVER_PORT'] = str(self.server.server_port) | 961 env['SERVER_PORT'] = str(self.server.server_port) |
953 env['REQUEST_URI'] = "/" | 962 env['REQUEST_URI'] = "/" |
963 env['PATH_INFO'] = path_info | |
954 if query: | 964 if query: |
955 env['QUERY_STRING'] = query | 965 env['QUERY_STRING'] = query |
956 host = self.address_string() | 966 host = self.address_string() |
957 if host != self.client_address[0]: | 967 if host != self.client_address[0]: |
958 env['REMOTE_HOST'] = host | 968 env['REMOTE_HOST'] = host |
975 | 985 |
976 req = hgrequest(self.rfile, self.wfile, env) | 986 req = hgrequest(self.rfile, self.wfile, env) |
977 self.send_response(200, "Script output follows") | 987 self.send_response(200, "Script output follows") |
978 | 988 |
979 if webdir_conf: | 989 if webdir_conf: |
980 hgwebobj = hgwebdir(hgwebdir_conf) | 990 hgwebobj = hgwebdir(webdir_conf) |
981 else: | 991 else: |
982 hgwebobj = hgweb(repo.__class__(repo.ui, repo.origroot)) | 992 hgwebobj = hgweb(repo.__class__(repo.ui, repo.origroot)) |
983 hgwebobj.run(req) | 993 hgwebobj.run(req) |
984 | 994 |
985 | 995 |