Skip to content

Commit

Permalink
pythongh-122909: Pass ftp error strings to URLError constructor (pyth…
Browse files Browse the repository at this point in the history
…on#122913)

* pass the original string error message from the ftplib error to URLError()

* Update request.py

Change error string for ftp error to be consistent with other errors reported for ftp

* Add NEWS entry for change to urllib.request for ftp errors.

* Track the change in the ftp error message in the test.
  • Loading branch information
jeremyhylton authored Aug 20, 2024
1 parent 0480052 commit 77133f5
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 2 deletions.
23 changes: 22 additions & 1 deletion Lib/test/test_urllib2.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

import os
import io
import ftplib
import socket
import array
import sys
Expand Down Expand Up @@ -754,7 +755,6 @@ def connect_ftp(self, user, passwd, host, port, dirs,
self.ftpwrapper = MockFTPWrapper(self.data)
return self.ftpwrapper

import ftplib
data = "rheum rhaponicum"
h = NullFTPHandler(data)
h.parent = MockOpener()
Expand Down Expand Up @@ -794,6 +794,27 @@ def connect_ftp(self, user, passwd, host, port, dirs,
self.assertEqual(headers.get("Content-type"), mimetype)
self.assertEqual(int(headers["Content-length"]), len(data))

def test_ftp_error(self):
class ErrorFTPHandler(urllib.request.FTPHandler):
def __init__(self, exception):
self._exception = exception

def connect_ftp(self, user, passwd, host, port, dirs,
timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
raise self._exception

exception = ftplib.error_perm(
"500 OOPS: cannot change directory:/nonexistent")
h = ErrorFTPHandler(exception)
urlopen = urllib.request.build_opener(h).open
try:
urlopen("ftp://www.pythontest.net/")
except urllib.error.URLError as raised:
self.assertEqual(raised.reason,
f"ftp error: {exception.args[0]}")
else:
self.fail("Did not raise ftplib exception")

def test_file(self):
import email.utils
h = urllib.request.FileHandler()
Expand Down
2 changes: 1 addition & 1 deletion Lib/urllib/request.py
Original file line number Diff line number Diff line change
Expand Up @@ -1555,7 +1555,7 @@ def ftp_open(self, req):
headers = email.message_from_string(headers)
return addinfourl(fp, headers, req.full_url)
except ftplib.all_errors as exp:
raise URLError(exp) from exp
raise URLError(f"ftp error: {exp}") from exp

def connect_ftp(self, user, passwd, host, port, dirs, timeout):
return ftpwrapper(user, passwd, host, port, dirs, timeout,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
In urllib.request when URLError is raised opening an ftp URL, the exception
argument is now consistently a string. Earlier versions passed either a
string or an ftplib exception instance as the argument to URLError.

0 comments on commit 77133f5

Please sign in to comment.