##// END OF EJS Templates
hgweb: encode WSGI environment like OS environment...
Manuel Jacob -
r45541:2632c1ed stable
parent child Browse files
Show More
@@ -12,6 +12,7 b' from __future__ import absolute_import'
12
12
13 from ..thirdparty import attr
13 from ..thirdparty import attr
14 from .. import (
14 from .. import (
15 encoding,
15 error,
16 error,
16 pycompat,
17 pycompat,
17 util,
18 util,
@@ -162,10 +163,18 b' def parserequestfromenv(env, reponame=No'
162 # strings on Python 3 must be between \00000-\000FF. We deal with bytes
163 # strings on Python 3 must be between \00000-\000FF. We deal with bytes
163 # in Mercurial, so mass convert string keys and values to bytes.
164 # in Mercurial, so mass convert string keys and values to bytes.
164 if pycompat.ispy3:
165 if pycompat.ispy3:
166
165 def tobytes(s):
167 def tobytes(s):
166 if not isinstance(s, str):
168 if not isinstance(s, str):
167 return s
169 return s
168 return s.encode('latin-1')
170 if pycompat.iswindows:
171 # This is what mercurial.encoding does for os.environ on
172 # Windows.
173 return encoding.strtolocal(s)
174 else:
175 # This is what is documented to be used for os.environ on Unix.
176 return pycompat.fsencode(s)
177
169 env = {tobytes(k): tobytes(v) for k, v in pycompat.iteritems(env)}
178 env = {tobytes(k): tobytes(v) for k, v in pycompat.iteritems(env)}
170
179
171 # Some hosting solutions are emulating hgwebdir, and dispatching directly
180 # Some hosting solutions are emulating hgwebdir, and dispatching directly
@@ -3,7 +3,7 b' from __future__ import absolute_import, '
3 import unittest
3 import unittest
4
4
5 from mercurial.hgweb import request as requestmod
5 from mercurial.hgweb import request as requestmod
6 from mercurial import error
6 from mercurial import error, pycompat
7
7
8 DEFAULT_ENV = {
8 DEFAULT_ENV = {
9 'REQUEST_METHOD': 'GET',
9 'REQUEST_METHOD': 'GET',
@@ -432,6 +432,18 b' class ParseRequestTests(unittest.TestCas'
432 self.assertEqual(r.dispatchpath, b'path1/path2')
432 self.assertEqual(r.dispatchpath, b'path1/path2')
433 self.assertEqual(r.reponame, b'repo')
433 self.assertEqual(r.reponame, b'repo')
434
434
435 def testenvencoding(self):
436 if pycompat.iswindows:
437 # On Windows, we can't generally know which non-ASCII characters
438 # are supported.
439 r = parse(DEFAULT_ENV, extra={'foo': 'bar'})
440 self.assertEqual(r.rawenv[b'foo'], b'bar')
441 else:
442 # Unix is byte-based. Therefore we test all possible bytes.
443 b = b''.join(pycompat.bytechr(i) for i in range(256))
444 r = parse(DEFAULT_ENV, extra={'foo': pycompat.fsdecode(b)})
445 self.assertEqual(r.rawenv[b'foo'], b)
446
435
447
436 if __name__ == '__main__':
448 if __name__ == '__main__':
437 import silenttestrunner
449 import silenttestrunner
General Comments 0
You need to be logged in to leave comments. Login now