encoding: improve handling of buggy getpreferredencoding() on Mac OS X
Prior to version 2.7, calling locale.getpreferredencoding() would
always return 'mac-roman' on Mac OS X. Previously, this was handled by
a call to locale.setlocale(). Unfortunately, Python 2.6.5 and older
have a bug where isspace() would incorrectly report True for 0x85 and
0xa0 after such a call.
In order to fix this, we replace the previous _encodingfixup mapping
to an _encodingfixers mapping. Rather than mapping encodings to their
replacement, it maps them to a function returning the
replacement. This allows us to provide an simplified implementation of
getpreferredencoding() which extracts the expected encoding and
restores the locale.
This fix is based on a patch originally submitted by Martijn Pieters
as well as feedback from Brodie Rao.
#!/bin/sh
# Tests if hgweb can run without touching sys.stdin, as is required
# by the WSGI standard and strictly implemented by mod_wsgi.
mkdir repo
cd repo
hg init
echo foo > bar
hg add bar
hg commit -m "test"
hg tip
cat > request.py <<EOF
from mercurial import dispatch
from mercurial.hgweb.hgweb_mod import hgweb
from mercurial.ui import ui
from mercurial import hg
from StringIO import StringIO
import os, sys
class FileLike(object):
def __init__(self, real):
self.real = real
def fileno(self):
print >> sys.__stdout__, 'FILENO'
return self.real.fileno()
def read(self):
print >> sys.__stdout__, 'READ'
return self.real.read()
def readline(self):
print >> sys.__stdout__, 'READLINE'
return self.real.readline()
sys.stdin = FileLike(sys.stdin)
errors = StringIO()
input = StringIO()
output = StringIO()
def startrsp(headers, data):
print '---- HEADERS'
print headers
print '---- DATA'
print data
return output.write
env = {
'wsgi.version': (1, 0),
'wsgi.url_scheme': 'http',
'wsgi.errors': errors,
'wsgi.input': input,
'wsgi.multithread': False,
'wsgi.multiprocess': False,
'wsgi.run_once': False,
'REQUEST_METHOD': 'GET',
'SCRIPT_NAME': '',
'PATH_INFO': '',
'QUERY_STRING': '',
'SERVER_NAME': '127.0.0.1',
'SERVER_PORT': os.environ['HGPORT'],
'SERVER_PROTOCOL': 'HTTP/1.0'
}
i = hgweb('.')
i(env, startrsp)
print '---- ERRORS'
print errors.getvalue()
print '---- OS.ENVIRON wsgi variables'
print sorted([x for x in os.environ if x.startswith('wsgi')])
print '---- request.ENVIRON wsgi variables'
print sorted([x for x in i.repo.ui.environ if x.startswith('wsgi')])
EOF
python request.py