diff --git a/Lib/encodings/punycode.py b/Lib/encodings/punycode.py --- a/Lib/encodings/punycode.py +++ b/Lib/encodings/punycode.py @@ -180,17 +180,19 @@ def insertion_sort(base, extended, error return base def punycode_decode(text, errors): + if errors not in ('strict', 'ignore'): + raise UnicodeError("Unsupported error handling %s" % errors) if isinstance(text, str): - text = text.encode("ascii") + text = text.encode("ascii", errors) if isinstance(text, memoryview): text = bytes(text) pos = text.rfind(b"-") if pos == -1: base = "" - extended = str(text, "ascii").upper() + extended = str(text, "ascii", errors).upper() else: base = str(text[:pos], "ascii", errors) - extended = str(text[pos+1:], "ascii").upper() + extended = str(text[pos+1:], "ascii", errors).upper() return insertion_sort(base, extended, errors) ### Codec APIs @@ -202,8 +204,6 @@ class Codec(codecs.Codec): return res, len(input) def decode(self, input, errors='strict'): - if errors not in ('strict', 'replace', 'ignore'): - raise UnicodeError("Unsupported error handling "+errors) res = punycode_decode(input, errors) return res, len(input) @@ -213,8 +213,6 @@ class IncrementalEncoder(codecs.Incremen class IncrementalDecoder(codecs.IncrementalDecoder): def decode(self, input, final=False): - if self.errors not in ('strict', 'replace', 'ignore'): - raise UnicodeError("Unsupported error handling "+self.errors) return punycode_decode(input, self.errors) class StreamWriter(Codec,codecs.StreamWriter): diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -882,6 +882,10 @@ class PunycodeTest(unittest.TestCase): puny = puny.decode("ascii").encode("ascii") self.assertEqual(uni, puny.decode("punycode")) + def test_decode_errors(self): + self.assertEqual(b'a\xff-\xffb\xffga\xff'.decode("punycode", "ignore"), "a\xe9") + self.assertRaises(UnicodeError, b'abc-'.decode, "punycode", "replace") + class UnicodeInternalTest(unittest.TestCase): def test_bug1251300(self): # Decoding with unicode_internal used to not correctly handle "code