This commit is contained in:
Benjamin Peterson 2014-06-07 15:09:36 -07:00
commit edb07d28fb
4 changed files with 35 additions and 2 deletions

View File

@ -7,6 +7,7 @@ import http.client
import email.message import email.message
import io import io
import unittest import unittest
from unittest.mock import patch
from test import support from test import support
import os import os
import sys import sys
@ -89,6 +90,26 @@ class FakeHTTPMixin(object):
http.client.HTTPConnection = self._connection_class http.client.HTTPConnection = self._connection_class
class FakeFTPMixin(object):
def fakeftp(self):
class FakeFtpWrapper(object):
def __init__(self, user, passwd, host, port, dirs, timeout=None,
persistent=True):
pass
def retrfile(self, file, type):
return io.BytesIO(), 0
def close(self):
pass
self._ftpwrapper_class = urllib.request.ftpwrapper
urllib.request.ftpwrapper = FakeFtpWrapper
def unfakeftp(self):
urllib.request.ftpwrapper = self._ftpwrapper_class
class urlopen_FileTests(unittest.TestCase): class urlopen_FileTests(unittest.TestCase):
"""Test urlopen() opening a temporary file. """Test urlopen() opening a temporary file.
@ -195,7 +216,7 @@ class ProxyTests(unittest.TestCase):
self.env.set('NO_PROXY', 'localhost, anotherdomain.com, newdomain.com') self.env.set('NO_PROXY', 'localhost, anotherdomain.com, newdomain.com')
self.assertTrue(urllib.request.proxy_bypass_environment('anotherdomain.com')) self.assertTrue(urllib.request.proxy_bypass_environment('anotherdomain.com'))
class urlopen_HttpTests(unittest.TestCase, FakeHTTPMixin): class urlopen_HttpTests(unittest.TestCase, FakeHTTPMixin, FakeFTPMixin):
"""Test urlopen() opening a fake http connection.""" """Test urlopen() opening a fake http connection."""
def check_read(self, ver): def check_read(self, ver):
@ -309,6 +330,15 @@ Content-Type: text/html; charset=iso-8859-1
self.assertFalse(e.exception.filename) self.assertFalse(e.exception.filename)
self.assertTrue(e.exception.reason) self.assertTrue(e.exception.reason)
@patch.object(urllib.request, 'MAXFTPCACHE', 0)
def test_ftp_cache_pruning(self):
self.fakeftp()
try:
urllib.request.ftpcache['test'] = urllib.request.ftpwrapper('user', 'pass', 'localhost', 21, [])
urlopen('ftp://localhost')
finally:
self.unfakeftp()
def test_userpass_inurl(self): def test_userpass_inurl(self):
self.fakehttp(b"HTTP/1.0 200 OK\r\n\r\nHello!") self.fakehttp(b"HTTP/1.0 200 OK\r\n\r\nHello!")

View File

@ -1911,7 +1911,7 @@ class URLopener:
# XXX thread unsafe! # XXX thread unsafe!
if len(self.ftpcache) > MAXFTPCACHE: if len(self.ftpcache) > MAXFTPCACHE:
# Prune the cache, rather arbitrarily # Prune the cache, rather arbitrarily
for k in self.ftpcache.keys(): for k in list(self.ftpcache):
if k != key: if k != key:
v = self.ftpcache[k] v = self.ftpcache[k]
del self.ftpcache[k] del self.ftpcache[k]

View File

@ -32,6 +32,7 @@ Fred Allen
Ray Allen Ray Allen
Billy G. Allie Billy G. Allie
Kevin Altis Kevin Altis
Skyler Leigh Amador
Joe Amenta Joe Amenta
A. Amoroso A. Amoroso
Mark Anacker Mark Anacker

View File

@ -94,6 +94,8 @@ Library
- Issue #21515: tempfile.TemporaryFile now uses os.O_TMPFILE flag is available. - Issue #21515: tempfile.TemporaryFile now uses os.O_TMPFILE flag is available.
- Issue #21463: In urllib.request, fix pruning of the FTP cache.
- Issue #21618: The subprocess module could fail to close open fds that were - Issue #21618: The subprocess module could fail to close open fds that were
inherited by the calling process and already higher than POSIX resource inherited by the calling process and already higher than POSIX resource
limits would otherwise allow. On systems with a functioning /proc/self/fd limits would otherwise allow. On systems with a functioning /proc/self/fd