Path: blob/master/venv/Lib/site-packages/idna/codec.py
811 views
from .core import encode, decode, alabel, ulabel, IDNAError1import codecs2import re34_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]')56class Codec(codecs.Codec):78def encode(self, data, errors='strict'):910if errors != 'strict':11raise IDNAError("Unsupported error handling \"{0}\"".format(errors))1213if not data:14return "", 01516return encode(data), len(data)1718def decode(self, data, errors='strict'):1920if errors != 'strict':21raise IDNAError("Unsupported error handling \"{0}\"".format(errors))2223if not data:24return u"", 02526return decode(data), len(data)2728class IncrementalEncoder(codecs.BufferedIncrementalEncoder):29def _buffer_encode(self, data, errors, final):30if errors != 'strict':31raise IDNAError("Unsupported error handling \"{0}\"".format(errors))3233if not data:34return ("", 0)3536labels = _unicode_dots_re.split(data)37trailing_dot = u''38if labels:39if not labels[-1]:40trailing_dot = '.'41del labels[-1]42elif not final:43# Keep potentially unfinished label until the next call44del labels[-1]45if labels:46trailing_dot = '.'4748result = []49size = 050for label in labels:51result.append(alabel(label))52if size:53size += 154size += len(label)5556# Join with U+002E57result = ".".join(result) + trailing_dot58size += len(trailing_dot)59return (result, size)6061class IncrementalDecoder(codecs.BufferedIncrementalDecoder):62def _buffer_decode(self, data, errors, final):63if errors != 'strict':64raise IDNAError("Unsupported error handling \"{0}\"".format(errors))6566if not data:67return (u"", 0)6869# IDNA allows decoding to operate on Unicode strings, too.70if isinstance(data, unicode):71labels = _unicode_dots_re.split(data)72else:73# Must be ASCII string74data = str(data)75unicode(data, "ascii")76labels = data.split(".")7778trailing_dot = u''79if labels:80if not labels[-1]:81trailing_dot = u'.'82del labels[-1]83elif not final:84# Keep potentially unfinished label until the next call85del labels[-1]86if labels:87trailing_dot = u'.'8889result = []90size = 091for label in labels:92result.append(ulabel(label))93if size:94size += 195size += len(label)9697result = u".".join(result) + trailing_dot98size += len(trailing_dot)99return (result, size)100101102class StreamWriter(Codec, codecs.StreamWriter):103pass104105class StreamReader(Codec, codecs.StreamReader):106pass107108def getregentry():109return codecs.CodecInfo(110name='idna',111encode=Codec().encode,112decode=Codec().decode,113incrementalencoder=IncrementalEncoder,114incrementaldecoder=IncrementalDecoder,115streamwriter=StreamWriter,116streamreader=StreamReader,117)118119120