From 9571f24b68cf6e2e57317ead6fe279b53358d83e Mon Sep 17 00:00:00 2001 From: Dan Hemberger <846186+hemberger@users.noreply.github.com> Date: Sat, 22 Apr 2023 21:41:23 -0700 Subject: [PATCH 1/2] gh-81403: Fix for CacheFTPHandler in urllib (GH-13951) bpo-37222: Fix for CacheFTPHandler in urllib A call to FTP.ntransfercmd must be followed by FTP.voidresp to clear the "end transfer" message. Without this, the client and server get out of sync, which will result in an error if the FTP instance is reused to open a second URL. This scenario occurs for even the most basic usage of CacheFTPHandler. Reverts the patch merged as a resolution to bpo-16270 and adds a test case for the CacheFTPHandler in test_urllib2net.py. (cherry picked from commit e38bebb9ee805df6848f42845e71c8da8a821ad3) Co-authored-by: Dan Hemberger <846186+hemberger@users.noreply.github.com> Co-authored-by: Senthil Kumaran --- Lib/test/test_urllib2net.py | 2 ++ Lib/urllib/request.py | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/Lib/test/test_urllib2net.py b/Lib/test/test_urllib2net.py index 5da41c37bbfb8e..d8d882b2d33589 100644 --- a/Lib/test/test_urllib2net.py +++ b/Lib/test/test_urllib2net.py @@ -134,7 +134,9 @@ def setUp(self): # They do sometimes catch some major disasters, though. def test_ftp(self): + # Testing the same URL twice exercises the caching in CacheFTPHandler urls = [ + 'ftp://www.pythontest.net/README', 'ftp://www.pythontest.net/README', ('ftp://www.pythontest.net/non-existent-file', None, urllib.error.URLError), diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index 73ad0127ecc969..24911bb0190b8e 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -2469,7 +2469,13 @@ def retrfile(self, file, type): return (ftpobj, retrlen) def endtransfer(self): + if not self.busy: + return self.busy = 0 + try: + self.ftp.voidresp() + except ftperrors(): + pass def close(self): self.keepalive = False From e740e4aba008b9f910920a303e9ac768cdd44083 Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Sat, 22 Apr 2023 22:14:43 -0700 Subject: [PATCH 2/2] Added NEWS entry. --- .../next/Library/2023-04-22-22-14-09.gh-issue-81403.zVz9Td.rst | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2023-04-22-22-14-09.gh-issue-81403.zVz9Td.rst diff --git a/Misc/NEWS.d/next/Library/2023-04-22-22-14-09.gh-issue-81403.zVz9Td.rst b/Misc/NEWS.d/next/Library/2023-04-22-22-14-09.gh-issue-81403.zVz9Td.rst new file mode 100644 index 00000000000000..6adb71f7677229 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-04-22-22-14-09.gh-issue-81403.zVz9Td.rst @@ -0,0 +1,3 @@ +:class:`urllib.request.CacheFTPHandler` no longer raises :class:`URLError` +if a cached FTP instance is reused. ftplib's endtransfer method calls +voidresp to drain the connection to handle FTP instance reuse properly.