diff --git a/Lib/http/client.py b/Lib/http/client.py index b7092de6c85..fef7185fe2b 100644 --- a/Lib/http/client.py +++ b/Lib/http/client.py @@ -726,10 +726,17 @@ class HTTPConnection: if self.debuglevel > 0: print("sendIng a read()able") encode = False - if "b" not in str.mode: - encode = True - if self.debuglevel > 0: - print("encoding file using iso-8859-1") + try: + mode = str.mode + except AttributeError: + # io.BytesIO and other file-like objects don't have a `mode` + # attribute. + pass + else: + if "b" not in mode: + encode = True + if self.debuglevel > 0: + print("encoding file using iso-8859-1") while 1: data = str.read(blocksize) if not data: diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py index 2d76f7a79f4..37cda5d19be 100644 --- a/Lib/test/test_httplib.py +++ b/Lib/test/test_httplib.py @@ -1,6 +1,7 @@ import errno from http import client import io +import array import socket from unittest import TestCase @@ -174,6 +175,20 @@ class BasicTest(TestCase): self.assertTrue(sock.data.startswith(expected), '%r != %r' % (sock.data[:len(expected)], expected)) + def test_send(self): + expected = b'this is a test this is only a test' + conn = client.HTTPConnection('example.com') + sock = FakeSocket(None) + conn.sock = sock + conn.send(expected) + self.assertEquals(expected, sock.data) + sock.data = b'' + conn.send(array.array('b', expected)) + self.assertEquals(expected, sock.data) + sock.data = b'' + conn.send(io.BytesIO(expected)) + self.assertEquals(expected, sock.data) + def test_chunked(self): chunked_start = ( 'HTTP/1.1 200 OK\r\n' diff --git a/Misc/ACKS b/Misc/ACKS index 2e8818a54b0..3aefa6fb369 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -481,6 +481,7 @@ Nick Mathewson Graham Matthews Dieter Maurer Arnaud Mazin +Kirk McDonald Chris McDonough Greg McFarlane Alan McIntyre