##// END OF EJS Templates
Use SCRIPT_NAME and PATH_INFO instead of REQUEST_URI. This is required by WSGI (fixes issue846).
Dirkjan Ochtman -
r5579:e15f7db0 default
parent child Browse files
Show More
@@ -0,0 +1,74 b''
1 #!/bin/sh
2
3 mkdir repo
4 cd repo
5 hg init
6 echo foo > bar
7 hg add bar
8 hg commit -m "test" -d "0 0" -u "Testing"
9 hg tip
10
11 cat > request.py <<EOF
12 from mercurial.hgweb import hgweb, hgwebdir
13 from StringIO import StringIO
14 import os, sys
15
16 errors = StringIO()
17 input = StringIO()
18
19 def startrsp(headers, data):
20 print '---- HEADERS'
21 print headers
22 print '---- DATA'
23 print data
24 return output.write
25
26 env = {
27 'wsgi.version': (1, 0),
28 'wsgi.url_scheme': 'http',
29 'wsgi.errors': errors,
30 'wsgi.input': input,
31 'wsgi.multithread': False,
32 'wsgi.multiprocess': False,
33 'wsgi.run_once': False,
34 'REQUEST_METHOD': 'GET',
35 'SCRIPT_NAME': '',
36 'SERVER_NAME': '127.0.0.1',
37 'SERVER_PORT': os.environ['HGPORT'],
38 'SERVER_PROTOCOL': 'HTTP/1.0'
39 }
40
41 output = StringIO()
42 env['PATH_INFO'] = '/'
43 env['QUERY_STRING'] = 'style=atom'
44 hgweb('.', name = 'repo')(env, startrsp)
45 print output.getvalue()
46 print '---- ERRORS'
47 print errors.getvalue()
48
49 output = StringIO()
50 env['PATH_INFO'] = '/file/tip/'
51 env['QUERY_STRING'] = 'style=raw'
52 hgweb('.', name = 'repo')(env, startrsp)
53 print output.getvalue()
54 print '---- ERRORS'
55 print errors.getvalue()
56
57 output = StringIO()
58 env['PATH_INFO'] = '/'
59 env['QUERY_STRING'] = 'style=raw'
60 hgwebdir({'repo': '.'})(env, startrsp)
61 print output.getvalue()
62 print '---- ERRORS'
63 print errors.getvalue()
64
65 output = StringIO()
66 env['PATH_INFO'] = '/repo/file/tip/'
67 env['QUERY_STRING'] = 'style=raw'
68 hgwebdir({'repo': '.'})(env, startrsp)
69 print output.getvalue()
70 print '---- ERRORS'
71 print errors.getvalue()
72 EOF
73
74 python request.py | sed "s/http:\/\/127\.0\.0\.1:[0-9]*\//http:\/\/127.0.0.1\//"
@@ -0,0 +1,72 b''
1 changeset: 0:4cbec7e6f8c4
2 tag: tip
3 user: Testing
4 date: Thu Jan 01 00:00:00 1970 +0000
5 summary: test
6
7 ---- HEADERS
8 200 Script output follows
9 ---- DATA
10 [('content-type', 'application/atom+xml; charset=ascii')]
11 <?xml version="1.0" encoding="ascii"?>
12 <feed xmlns="http://www.w3.org/2005/Atom">
13 <!-- Changelog -->
14 <id>http://127.0.0.1/</id>
15 <link rel="self" href="http://127.0.0.1/atom-log"/>
16 <link rel="alternate" href="http://127.0.0.1/"/>
17 <title>repo Changelog</title>
18 <updated>1970-01-01T00:00:00+00:00</updated>
19
20 <entry>
21 <title>test</title>
22 <id>http://www.selenic.com/mercurial/#changeset-4cbec7e6f8c42eb52b6b52670e1f7560ae9a101e</id>
23 <link href="http://127.0.0.1/rev/4cbec7e6f8c42eb52b6b52670e1f7560ae9a101e"/>
24 <author>
25 <name>Testing</name>
26 <email>&#84;&#101;&#115;&#116;&#105;&#110;&#103;</email>
27 </author>
28 <updated>1970-01-01T00:00:00+00:00</updated>
29 <published>1970-01-01T00:00:00+00:00</published>
30 <content type="xhtml">
31 <div xmlns="http://www.w3.org/1999/xhtml">
32 <pre xml:space="preserve">test</pre>
33 </div>
34 </content>
35 </entry>
36
37 </feed>
38
39 ---- ERRORS
40
41 ---- HEADERS
42 200 Script output follows
43 ---- DATA
44 [('content-type', 'text/plain; charset=ascii')]
45
46 -rw-r--r-- 4 bar
47
48
49
50 ---- ERRORS
51
52 ---- HEADERS
53 200 Script output follows
54 ---- DATA
55 [('content-type', 'text/plain; charset=ascii')]
56
57 /repo/
58
59
60 ---- ERRORS
61
62 ---- HEADERS
63 200 Script output follows
64 ---- DATA
65 [('content-type', 'text/plain; charset=ascii')]
66
67 -rw-r--r-- 4 bar
68
69
70
71 ---- ERRORS
72
@@ -726,37 +726,21 b' class hgweb(object):'
726 def rewrite_request(req):
726 def rewrite_request(req):
727 '''translate new web interface to traditional format'''
727 '''translate new web interface to traditional format'''
728
728
729 def spliturl(req):
729 req.url = req.env['SCRIPT_NAME']
730 def firstitem(query):
730 if not req.url.endswith('/'):
731 return query.split('&', 1)[0].split(';', 1)[0]
731 req.url += '/'
732
732 if req.env.has_key('REPO_NAME'):
733 def normurl(url):
733 req.url += req.env['REPO_NAME'] + '/'
734 inner = '/'.join([x for x in url.split('/') if x])
734
735 tl = len(url) > 1 and url.endswith('/') and '/' or ''
735 if req.env.get('PATH_INFO'):
736
736 parts = req.env.get('PATH_INFO').strip('/').split('/')
737 return '%s%s%s' % (url.startswith('/') and '/' or '',
737 repo_parts = req.env.get('REPO_NAME', '').split('/')
738 inner, tl)
738 if parts[:len(repo_parts)] == repo_parts:
739
739 parts = parts[len(repo_parts):]
740 root = normurl(urllib.unquote(req.env.get('REQUEST_URI', '').split('?', 1)[0]))
740 query = '/'.join(parts)
741 pi = normurl(req.env.get('PATH_INFO', ''))
741 else:
742 if pi:
742 query = req.env['QUERY_STRING'].split('&', 1)[0]
743 # strip leading /
743 query = query.split(';', 1)[0]
744 pi = pi[1:]
745 if pi:
746 root = root[:root.rfind(pi)]
747 if req.env.has_key('REPO_NAME'):
748 rn = req.env['REPO_NAME'] + '/'
749 root += rn
750 query = pi[len(rn):]
751 else:
752 query = pi
753 else:
754 root += '?'
755 query = firstitem(req.env['QUERY_STRING'])
756
757 return (root, query)
758
759 req.url, query = spliturl(req)
760
744
761 if req.form.has_key('cmd'):
745 if req.form.has_key('cmd'):
762 # old style
746 # old style
@@ -91,15 +91,11 b' class hgwebdir(object):'
91 def config(section, name, default=None, untrusted=True):
91 def config(section, name, default=None, untrusted=True):
92 return parentui.config(section, name, default, untrusted)
92 return parentui.config(section, name, default, untrusted)
93
93
94 url = req.env['REQUEST_URI'].split('?')[0]
94 url = req.env.get('SCRIPT_NAME', '')
95 if not url.endswith('/'):
95 if not url.endswith('/'):
96 url += '/'
96 url += '/'
97 pathinfo = req.env.get('PATH_INFO', '').strip('/') + '/'
98 base = url[:len(url) - len(pathinfo)]
99 if not base.endswith('/'):
100 base += '/'
101
97
102 staticurl = config('web', 'staticurl') or base + 'static/'
98 staticurl = config('web', 'staticurl') or url + 'static/'
103 if not staticurl.endswith('/'):
99 if not staticurl.endswith('/'):
104 staticurl += '/'
100 staticurl += '/'
105
101
@@ -158,8 +154,10 b' class hgwebdir(object):'
158 if u.configbool("web", "hidden", untrusted=True):
154 if u.configbool("web", "hidden", untrusted=True):
159 continue
155 continue
160
156
161 url = ('/'.join([req.env["REQUEST_URI"].split('?')[0], name])
157 parts = [req.env['PATH_INFO'], name]
162 .replace("//", "/")) + '/'
158 if req.env['SCRIPT_NAME']:
159 parts.insert(0, req.env['SCRIPT_NAME'])
160 url = ('/'.join(parts).replace("//", "/")) + '/'
163
161
164 # update time with local timezone
162 # update time with local timezone
165 try:
163 try:
@@ -84,6 +84,7 b' class _hgwebhandler(object, BaseHTTPServ'
84 env['SERVER_NAME'] = self.server.server_name
84 env['SERVER_NAME'] = self.server.server_name
85 env['SERVER_PORT'] = str(self.server.server_port)
85 env['SERVER_PORT'] = str(self.server.server_port)
86 env['REQUEST_URI'] = self.path
86 env['REQUEST_URI'] = self.path
87 env['SCRIPT_NAME'] = ''
87 env['PATH_INFO'] = path_info
88 env['PATH_INFO'] = path_info
88 env['REMOTE_HOST'] = self.client_address[0]
89 env['REMOTE_HOST'] = self.client_address[0]
89 env['REMOTE_ADDR'] = self.client_address[0]
90 env['REMOTE_ADDR'] = self.client_address[0]
@@ -16,6 +16,9 b' def launch(application):'
16 util.set_binary(sys.stdout)
16 util.set_binary(sys.stdout)
17
17
18 environ = dict(os.environ.items())
18 environ = dict(os.environ.items())
19 if 'PATH_INFO' not in environ:
20 environ['PATH_INFO'] = ''
21
19 environ['wsgi.input'] = sys.stdin
22 environ['wsgi.input'] = sys.stdin
20 environ['wsgi.errors'] = sys.stderr
23 environ['wsgi.errors'] = sys.stderr
21 environ['wsgi.version'] = (1, 0)
24 environ['wsgi.version'] = (1, 0)
General Comments 0
You need to be logged in to leave comments. Login now