| Index: third_party/google-endpoints/requests/packages/idna/codec.py
|
| diff --git a/third_party/google-endpoints/requests/packages/idna/codec.py b/third_party/google-endpoints/requests/packages/idna/codec.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..98c65ead146e42b359a11703d719bafe916b1ad7
|
| --- /dev/null
|
| +++ b/third_party/google-endpoints/requests/packages/idna/codec.py
|
| @@ -0,0 +1,118 @@
|
| +from .core import encode, decode, alabel, ulabel, IDNAError
|
| +import codecs
|
| +import re
|
| +
|
| +_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]')
|
| +
|
| +class Codec(codecs.Codec):
|
| +
|
| + def encode(self, data, errors='strict'):
|
| +
|
| + if errors != 'strict':
|
| + raise IDNAError("Unsupported error handling \"{0}\"".format(errors))
|
| +
|
| + if not data:
|
| + return "", 0
|
| +
|
| + return encode(data), len(data)
|
| +
|
| + def decode(self, data, errors='strict'):
|
| +
|
| + if errors != 'strict':
|
| + raise IDNAError("Unsupported error handling \"{0}\"".format(errors))
|
| +
|
| + if not data:
|
| + return u"", 0
|
| +
|
| + return decode(data), len(data)
|
| +
|
| +class IncrementalEncoder(codecs.BufferedIncrementalEncoder):
|
| + def _buffer_encode(self, data, errors, final):
|
| + if errors != 'strict':
|
| + raise IDNAError("Unsupported error handling \"{0}\"".format(errors))
|
| +
|
| + if not data:
|
| + return ("", 0)
|
| +
|
| + labels = _unicode_dots_re.split(data)
|
| + trailing_dot = u''
|
| + if labels:
|
| + if not labels[-1]:
|
| + trailing_dot = '.'
|
| + del labels[-1]
|
| + elif not final:
|
| + # Keep potentially unfinished label until the next call
|
| + del labels[-1]
|
| + if labels:
|
| + trailing_dot = '.'
|
| +
|
| + result = []
|
| + size = 0
|
| + for label in labels:
|
| + result.append(alabel(label))
|
| + if size:
|
| + size += 1
|
| + size += len(label)
|
| +
|
| + # Join with U+002E
|
| + result = ".".join(result) + trailing_dot
|
| + size += len(trailing_dot)
|
| + return (result, size)
|
| +
|
| +class IncrementalDecoder(codecs.BufferedIncrementalDecoder):
|
| + def _buffer_decode(self, data, errors, final):
|
| + if errors != 'strict':
|
| + raise IDNAError("Unsupported error handling \"{0}\"".format(errors))
|
| +
|
| + if not data:
|
| + return (u"", 0)
|
| +
|
| + # IDNA allows decoding to operate on Unicode strings, too.
|
| + if isinstance(data, unicode):
|
| + labels = _unicode_dots_re.split(data)
|
| + else:
|
| + # Must be ASCII string
|
| + data = str(data)
|
| + unicode(data, "ascii")
|
| + labels = data.split(".")
|
| +
|
| + trailing_dot = u''
|
| + if labels:
|
| + if not labels[-1]:
|
| + trailing_dot = u'.'
|
| + del labels[-1]
|
| + elif not final:
|
| + # Keep potentially unfinished label until the next call
|
| + del labels[-1]
|
| + if labels:
|
| + trailing_dot = u'.'
|
| +
|
| + result = []
|
| + size = 0
|
| + for label in labels:
|
| + result.append(ulabel(label))
|
| + if size:
|
| + size += 1
|
| + size += len(label)
|
| +
|
| + result = u".".join(result) + trailing_dot
|
| + size += len(trailing_dot)
|
| + return (result, size)
|
| +
|
| +
|
| +class StreamWriter(Codec, codecs.StreamWriter):
|
| + pass
|
| +
|
| +class StreamReader(Codec, codecs.StreamReader):
|
| + pass
|
| +
|
| +def getregentry():
|
| + return codecs.CodecInfo(
|
| + name='idna',
|
| + encode=Codec().encode,
|
| + decode=Codec().decode,
|
| + incrementalencoder=IncrementalEncoder,
|
| + incrementaldecoder=IncrementalDecoder,
|
| + streamwriter=StreamWriter,
|
| + streamreader=StreamReader,
|
| + )
|
|
|