mirror of
https://github.com/python/cpython.git
synced 2025-08-10 03:49:18 +00:00
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.
This commit is contained in:
parent
4c16d122c4
commit
2c6aee9096
3 changed files with 45 additions and 30 deletions
|
@ -2,6 +2,7 @@ import array
|
|||
import httplib
|
||||
import StringIO
|
||||
import socket
|
||||
import errno
|
||||
|
||||
import unittest
|
||||
TestCase = unittest.TestCase
|
||||
|
@ -24,6 +25,21 @@ class FakeSocket:
|
|||
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 @@ class BasicTest(TestCase):
|
|||
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):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue