Forward port r70643 (#5542) + part of r83120 (just remove the comment)
Remove special logic that closes HTTPConnection socket on EPIPE.
If the socket is closed, the client has no chance to read the response
from the server. EPIPE means that it isn't possible to write more
data from the socket, but not that it is impossible to read.
diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py
index 2d0b8e7..1fb810e 100644
--- a/Lib/test/test_httplib.py
+++ b/Lib/test/test_httplib.py
@@ -2,6 +2,7 @@
import httplib
import StringIO
import socket
+import errno
import unittest
TestCase = unittest.TestCase
@@ -24,6 +25,21 @@
raise httplib.UnimplementedFileMode()
return self.fileclass(self.text)
+class EPipeSocket(FakeSocket):
+
+ def __init__(self, text, pipe_trigger):
+ # When sendall() is called with pipe_trigger, raise EPIPE.
+ FakeSocket.__init__(self, text)
+ self.pipe_trigger = pipe_trigger
+
+ def sendall(self, data):
+ if self.pipe_trigger in data:
+ raise socket.error(errno.EPIPE, "gotcha")
+ self.data += data
+
+ def close(self):
+ pass
+
class NoEOFStringIO(StringIO.StringIO):
"""Like StringIO, but raises AssertionError on EOF.
@@ -254,6 +270,21 @@
finally:
resp.close()
+ def test_epipe(self):
+ sock = EPipeSocket(
+ "HTTP/1.0 401 Authorization Required\r\n"
+ "Content-type: text/html\r\n"
+ "WWW-Authenticate: Basic realm=\"example\"\r\n",
+ b"Content-Length")
+ conn = httplib.HTTPConnection("example.com")
+ conn.sock = sock
+ self.assertRaises(socket.error,
+ lambda: conn.request("PUT", "/url", "body"))
+ resp = conn.getresponse()
+ self.assertEqual(401, resp.status)
+ self.assertEqual("Basic realm=\"example\"",
+ resp.getheader("www-authenticate"))
+
class OfflineTest(TestCase):
def test_responses(self):