[1.6.x] Fixed #21996 -- Used proper encoding for GeoIP content

Thanks Florent Messa for the report.
Backport of fb1e3435a4 from master.
This commit is contained in:
Claude Paroz 2014-02-10 15:55:57 +01:00
parent e9ffe7e3c8
commit 76700c5437
3 changed files with 8 additions and 3 deletions

View File

@ -22,6 +22,7 @@ class GeoIPRecord(Structure):
('continent_code', c_char_p), ('continent_code', c_char_p),
] ]
geoip_char_fields = [name for name, ctype in GeoIPRecord._fields_ if ctype is c_char_p] geoip_char_fields = [name for name, ctype in GeoIPRecord._fields_ if ctype is c_char_p]
GEOIP_DEFAULT_ENCODING = 'iso-8859-1'
geoip_encodings = { 0: 'iso-8859-1', geoip_encodings = { 0: 'iso-8859-1',
1: 'utf8', 1: 'utf8',
} }
@ -92,7 +93,7 @@ def check_string(result, func, cargs):
free(result) free(result)
else: else:
s = '' s = ''
return s.decode() return s.decode(GEOIP_DEFAULT_ENCODING)
GeoIP_database_info = lgeoip.GeoIP_database_info GeoIP_database_info = lgeoip.GeoIP_database_info
GeoIP_database_info.restype = geoip_char_p GeoIP_database_info.restype = geoip_char_p
@ -102,7 +103,7 @@ GeoIP_database_info.errcheck = check_string
def string_output(func): def string_output(func):
def _err_check(result, func, cargs): def _err_check(result, func, cargs):
if result: if result:
return result.decode() return result.decode(GEOIP_DEFAULT_ENCODING)
return result return result
func.restype = c_char_p func.restype = c_char_p
func.errcheck = _err_check func.errcheck = _err_check

View File

@ -118,3 +118,5 @@ class GeoIPTest(unittest.TestCase):
g = GeoIP() g = GeoIP()
d = g.city("www.osnabrueck.de") d = g.city("www.osnabrueck.de")
self.assertEqual('Osnabrück', d['city']) self.assertEqual('Osnabrück', d['city'])
d = g.country('200.7.49.81')
self.assertEqual('Curaçao', d['country_name'])

View File

@ -7,4 +7,6 @@ Django 1.6.3 release notes
This is Django 1.6.3, a bugfix release for Django 1.6. Django 1.6.3 fixes This is Django 1.6.3, a bugfix release for Django 1.6. Django 1.6.3 fixes
several bugs in 1.6.2: several bugs in 1.6.2:
* ... * Content retrieved from the GeoIP library is now properly decoded from its
default ``iso-8859-1`` encoding
(`#21996 <http://code.djangoproject.com/ticket/21996>`_).