Issue #21069: Move test_fileno() from test_urllibnet and rewrite it
* No longer attempts to close already freed socket file descriptor * Use socket object to be compatible with Windows * Do not use a timeout to avoid complication with non-blocking mode * Use internal localhost server rather than depending on a third party * Avoid trouble with buffered HTTP data by testing tunnelled CONNECT data
This commit is contained in:
parent
fc475a9fa6
commit
d979b2cfcf
@ -915,6 +915,47 @@ class BasicTest(TestCase):
|
|||||||
self.assertEqual(sock.file.read(), extradata) #we read to the end
|
self.assertEqual(sock.file.read(), extradata) #we read to the end
|
||||||
resp.close()
|
resp.close()
|
||||||
|
|
||||||
|
def test_response_fileno(self):
|
||||||
|
# Make sure fd returned by fileno is valid.
|
||||||
|
threading = support.import_module("threading")
|
||||||
|
|
||||||
|
serv = socket.socket(
|
||||||
|
socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP)
|
||||||
|
self.addCleanup(serv.close)
|
||||||
|
serv.bind((HOST, 0))
|
||||||
|
serv.listen()
|
||||||
|
|
||||||
|
result = None
|
||||||
|
def run_server():
|
||||||
|
[conn, address] = serv.accept()
|
||||||
|
with conn, conn.makefile("rb") as reader:
|
||||||
|
# Read the request header until a blank line
|
||||||
|
while True:
|
||||||
|
line = reader.readline()
|
||||||
|
if not line.rstrip(b"\r\n"):
|
||||||
|
break
|
||||||
|
conn.sendall(b"HTTP/1.1 200 Connection established\r\n\r\n")
|
||||||
|
nonlocal result
|
||||||
|
result = reader.read()
|
||||||
|
|
||||||
|
thread = threading.Thread(target=run_server)
|
||||||
|
thread.start()
|
||||||
|
conn = client.HTTPConnection(*serv.getsockname())
|
||||||
|
conn.request("CONNECT", "dummy:1234")
|
||||||
|
response = conn.getresponse()
|
||||||
|
try:
|
||||||
|
self.assertEqual(response.status, client.OK)
|
||||||
|
s = socket.socket(fileno=response.fileno())
|
||||||
|
try:
|
||||||
|
s.sendall(b"proxied data\n")
|
||||||
|
finally:
|
||||||
|
s.detach()
|
||||||
|
finally:
|
||||||
|
response.close()
|
||||||
|
conn.close()
|
||||||
|
thread.join()
|
||||||
|
self.assertEqual(result, b"proxied data\n")
|
||||||
|
|
||||||
class ExtendedReadTest(TestCase):
|
class ExtendedReadTest(TestCase):
|
||||||
"""
|
"""
|
||||||
Test peek(), read1(), readline()
|
Test peek(), read1(), readline()
|
||||||
|
@ -99,17 +99,6 @@ class urlopenNetworkTests(unittest.TestCase):
|
|||||||
open_url.close()
|
open_url.close()
|
||||||
self.assertEqual(code, 404)
|
self.assertEqual(code, 404)
|
||||||
|
|
||||||
# On Windows, socket handles are not file descriptors; this
|
|
||||||
# test can't pass on Windows.
|
|
||||||
@unittest.skipIf(sys.platform in ('win32',), 'not appropriate for Windows')
|
|
||||||
def test_fileno(self):
|
|
||||||
# Make sure fd returned by fileno is valid.
|
|
||||||
with self.urlopen("http://www.google.com/") as open_url:
|
|
||||||
fd = open_url.fileno()
|
|
||||||
with os.fdopen(fd, 'rb') as f:
|
|
||||||
self.assertTrue(f.read(), "reading from file created using fd "
|
|
||||||
"returned by fileno failed")
|
|
||||||
|
|
||||||
def test_bad_address(self):
|
def test_bad_address(self):
|
||||||
# Make sure proper exception is raised when connecting to a bogus
|
# Make sure proper exception is raised when connecting to a bogus
|
||||||
# address.
|
# address.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user