Merge updated a01e449 from al-tonio

This commit is contained in:
Jeff Forcier 2014-04-24 10:25:37 -07:00
parent 74c612e328
commit 6f4c159b05
2 changed files with 35 additions and 4 deletions

View File

@ -124,9 +124,11 @@ class BufferedFile (object):
file first). If the ``size`` argument is negative or omitted, read all file first). If the ``size`` argument is negative or omitted, read all
the remaining data in the file. the remaining data in the file.
``'b'`` mode flag is ignored (``self.FLAG_BINARY`` in ``self._flags``), .. note::
because SSH treats all files as binary, since we have no idea what ``'b'`` mode flag is ignored (``self.FLAG_BINARY`` in
encoding the file is in, or even if the file is text data. ``self._flags``), because SSH treats all files as binary, since we
have no idea what encoding the file is in, or even if the file is
text data.
:param int size: maximum number of bytes to read :param int size: maximum number of bytes to read
:return: :return:

View File

@ -67,6 +67,18 @@ liver insulin receptors. Their sensitivity to insulin is, however, similarly
decreased compared with chicken. decreased compared with chicken.
''' '''
# Here is how unicode characters are encoded over 1 to 6 bytes in utf-8
# U-00000000 - U-0000007F: 0xxxxxxx
# U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
# U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
# U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
# U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
# U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
# Note that: hex(int('11000011',2)) == '0xc3'
# Thus, the following 2-bytes sequence is not valid utf8: "invalid continuation byte"
NON_UTF8_DATA = b'\xC3\xC3'
FOLDER = os.environ.get('TEST_FOLDER', 'temp-testing000') FOLDER = os.environ.get('TEST_FOLDER', 'temp-testing000')
sftp = None sftp = None
@ -466,7 +478,7 @@ class SFTPTest (unittest.TestCase):
f.write('?\n') f.write('?\n')
with sftp.open(FOLDER + '/happy.txt', 'r') as f: with sftp.open(FOLDER + '/happy.txt', 'r') as f:
self.assertEqual(f.readline(), u'full line?\n') self.assertEqual(f.readline(), u('full line?\n'))
self.assertEqual(f.read(7), b'partial') self.assertEqual(f.read(7), b'partial')
finally: finally:
try: try:
@ -747,6 +759,23 @@ class SFTPTest (unittest.TestCase):
sftp.remove(FOLDER + '/test%file') sftp.remove(FOLDER + '/test%file')
def test_O_non_utf8_data(self):
"""Test write() and read() of non utf8 data"""
try:
with sftp.open('%s/nonutf8data' % FOLDER, 'w') as f:
f.write(NON_UTF8_DATA)
with sftp.open('%s/nonutf8data' % FOLDER, 'r') as f:
data = f.read()
self.assertEqual(data, NON_UTF8_DATA)
with sftp.open('%s/nonutf8data' % FOLDER, 'wb') as f:
f.write(NON_UTF8_DATA)
with sftp.open('%s/nonutf8data' % FOLDER, 'rb') as f:
data = f.read()
self.assertEqual(data, NON_UTF8_DATA)
finally:
sftp.remove('%s/nonutf8data' % FOLDER)
if __name__ == '__main__': if __name__ == '__main__':
SFTPTest.init_loopback() SFTPTest.init_loopback()
# logging is required by test_N_file_with_percent # logging is required by test_N_file_with_percent