diff -r a14c2a560417 Lib/socket.py --- a/Lib/socket.py Fri Oct 08 02:47:45 2010 +0200 +++ b/Lib/socket.py Tue Oct 12 00:46:04 2010 -0400 @@ -133,7 +133,7 @@ return socket(self.family, self.type, self.proto, fileno=fd), addr def makefile(self, mode="r", buffering=None, *, - encoding=None, newline=None): + encoding=None, errors=None, newline=None): """makefile(...) -> an I/O stream connected to the socket The arguments are as for io.open() after the filename, @@ -171,7 +171,7 @@ buffer = io.BufferedWriter(raw, buffering) if binary: return buffer - text = io.TextIOWrapper(buffer, encoding, newline) + text = io.TextIOWrapper(buffer, encoding, errors, newline) text.mode = mode return text diff -r a14c2a560417 Lib/test/test_socket.py --- a/Lib/test/test_socket.py Fri Oct 08 02:47:45 2010 +0200 +++ b/Lib/test/test_socket.py Tue Oct 12 00:46:04 2010 -0400 @@ -31,7 +31,7 @@ return True HOST = support.HOST -MSG = b'Michael Gilfix was here\n' +MSG = b'Michael Gilfix was here\r\n' SUPPORTS_IPV6 = socket.has_ipv6 and try_address('::1', family=socket.AF_INET6) try: @@ -964,7 +964,13 @@ to the client. """ + readmode = 'rb' + writemode = 'wb' bufsize = -1 # Use default buffer size + encoding = None + errors = None + newline = None + orig_msg = MSG def __init__(self, methodName='runTest'): SocketConnectedTest.__init__(self, methodName=methodName) @@ -973,7 +979,11 @@ self.evt1, self.evt2, self.serv_finished, self.cli_finished = [ threading.Event() for i in range(4)] SocketConnectedTest.setUp(self) - self.serv_file = self.cli_conn.makefile('rb', self.bufsize) + self.serv_file = self.cli_conn.makefile( + self.readmode, self.bufsize, + encoding = self.encoding, + errors = self.errors, + newline = self.newline) def tearDown(self): self.serv_finished.set() @@ -984,7 +994,11 @@ def clientSetUp(self): SocketConnectedTest.clientSetUp(self) - self.cli_file = self.serv_conn.makefile('wb', self.bufsize) + self.cli_file = self.serv_conn.makefile( + self.writemode, self.bufsize, + encoding = self.encoding, + errors = self.errors, + newline = self.newline) def clientTearDown(self): self.cli_finished.set() @@ -995,45 +1009,45 @@ def testSmallRead(self): # Performing small file read test - first_seg = self.serv_file.read(len(MSG)-3) + first_seg = self.serv_file.read(len(self.orig_msg)-3) second_seg = self.serv_file.read(3) msg = first_seg + second_seg - self.assertEqual(msg, MSG) + self.assertEqual(msg, self.orig_msg) def _testSmallRead(self): - self.cli_file.write(MSG) + self.cli_file.write(self.orig_msg) self.cli_file.flush() def testFullRead(self): # read until EOF msg = self.serv_file.read() - self.assertEqual(msg, MSG) + self.assertEqual(msg, self.orig_msg) def _testFullRead(self): - self.cli_file.write(MSG) + self.cli_file.write(self.orig_msg) self.cli_file.close() def testUnbufferedRead(self): # Performing unbuffered file read test - buf = b'' + buf = type(self.orig_msg)() while 1: char = self.serv_file.read(1) if not char: break buf += char - self.assertEqual(buf, MSG) + self.assertEqual(buf, self.orig_msg) def _testUnbufferedRead(self): - self.cli_file.write(MSG) + self.cli_file.write(self.orig_msg) self.cli_file.flush() def testReadline(self): # Performing file readline test line = self.serv_file.readline() - self.assertEqual(line, MSG) + self.assertEqual(line, self.orig_msg) def _testReadline(self): - self.cli_file.write(MSG) + self.cli_file.write(self.orig_msg) self.cli_file.flush() def testCloseAfterMakefile(self): @@ -1041,19 +1055,21 @@ self.cli_conn.close() # read until EOF msg = self.serv_file.read() - self.assertEqual(msg, MSG) + self.assertEqual(msg, self.orig_msg) def _testCloseAfterMakefile(self): - self.cli_file.write(MSG) + self.cli_file.write(self.orig_msg) self.cli_file.flush() def testMakefileAfterMakefileClose(self): self.serv_file.close() - msg = self.cli_conn.recv(len(MSG)) - self.assertEqual(msg, MSG) + msg = self.cli_conn.recv(len(self.orig_msg)) + if isinstance(self.orig_msg, str): + msg = msg.decode() + self.assertEqual(msg, self.orig_msg) def _testMakefileAfterMakefileClose(self): - self.cli_file.write(MSG) + self.cli_file.write(self.orig_msg) self.cli_file.flush() def testClosedAttr(self): @@ -1063,11 +1079,11 @@ self.assertTrue(not self.cli_file.closed) def testAttributes(self): - self.assertEqual(self.serv_file.mode, 'rb') + self.assertEqual(self.serv_file.mode, self.readmode) self.assertEqual(self.serv_file.name, self.cli_conn.fileno()) def _testAttributes(self): - self.assertEqual(self.cli_file.mode, 'wb') + self.assertEqual(self.cli_file.mode, self.writemode) self.assertEqual(self.cli_file.name, self.serv_conn.fileno()) def testRealClose(self): @@ -1206,27 +1222,27 @@ def testUnbufferedReadline(self): # Read a line, create a new file object, read another line with it line = self.serv_file.readline() # first line - self.assertEqual(line, b"A. " + MSG) # first line + self.assertEqual(line, b"A. " + self.orig_msg) # first line self.serv_file = self.cli_conn.makefile('rb', 0) line = self.serv_file.readline() # second line - self.assertEqual(line, b"B. " + MSG) # second line + self.assertEqual(line, b"B. " + self.orig_msg) # second line def _testUnbufferedReadline(self): - self.cli_file.write(b"A. " + MSG) - self.cli_file.write(b"B. " + MSG) + self.cli_file.write(b"A. " + self.orig_msg) + self.cli_file.write(b"B. " + self.orig_msg) self.cli_file.flush() def testMakefileClose(self): # The file returned by makefile should keep the socket open... self.cli_conn.close() msg = self.cli_conn.recv(1024) - self.assertEqual(msg, MSG) + self.assertEqual(msg, self.orig_msg) # ...until the file is itself closed self.serv_file.close() self.assertRaises(socket.error, self.cli_conn.recv, 1024) def _testMakefileClose(self): - self.cli_file.write(MSG) + self.cli_file.write(self.orig_msg) self.cli_file.flush() def testMakefileCloseSocketDestroy(self): @@ -1245,21 +1261,21 @@ def testSmallReadNonBlocking(self): self.cli_conn.setblocking(False) self.assertEqual(self.serv_file.readinto(bytearray(10)), None) - self.assertEqual(self.serv_file.read(len(MSG) - 3), None) + self.assertEqual(self.serv_file.read(len(self.orig_msg) - 3), None) self.evt1.set() self.evt2.wait(1.0) - first_seg = self.serv_file.read(len(MSG) - 3) + first_seg = self.serv_file.read(len(self.orig_msg) - 3) buf = bytearray(10) n = self.serv_file.readinto(buf) self.assertEqual(n, 3) msg = first_seg + buf[:n] - self.assertEqual(msg, MSG) + self.assertEqual(msg, self.orig_msg) self.assertEqual(self.serv_file.readinto(bytearray(16)), None) self.assertEqual(self.serv_file.read(1), None) def _testSmallReadNonBlocking(self): self.evt1.wait(1.0) - self.cli_file.write(MSG) + self.cli_file.write(self.orig_msg) self.cli_file.flush() self.evt2.set() # Avoid cloding the socket before the server test has finished, @@ -1305,6 +1321,15 @@ bufsize = 2 # Exercise the buffering code +class UnicodeFileObjectClassTestCase(FileObjectClassTestCase): + """Unicode variant for socket.makefile()""" + + orig_msg = MSG.decode() + readmode = 'r' + writemode = 'w' + newline = '' + + class NetworkConnectionTest(object): """Prove network connection.""" @@ -1765,6 +1790,7 @@ UnbufferedFileObjectClassTestCase, LineBufferedFileObjectClassTestCase, SmallBufferedFileObjectClassTestCase, + UnicodeFileObjectClassTestCase, NetworkConnectionNoServer, NetworkConnectionAttributesTest, NetworkConnectionBehaviourTest,