Commit 24befa87 authored by Giampaolo Rodola's avatar Giampaolo Rodola

merge with 3.1

parents 4c1aebd8 0b5c21f9
...@@ -241,12 +241,13 @@ class FTP: ...@@ -241,12 +241,13 @@ class FTP:
This does not follow the procedure from the RFC to send Telnet This does not follow the procedure from the RFC to send Telnet
IP and Synch; that doesn't seem to work with the servers I've IP and Synch; that doesn't seem to work with the servers I've
tried. Instead, just send the ABOR command as OOB data.''' tried. Instead, just send the ABOR command as OOB data.'''
line = 'ABOR' + CRLF line = b'ABOR' + B_CRLF
if self.debugging > 1: print('*put urgent*', self.sanitize(line)) if self.debugging > 1: print('*put urgent*', self.sanitize(line))
self.sock.sendall(line, MSG_OOB) self.sock.sendall(line, MSG_OOB)
resp = self.getmultiline() resp = self.getmultiline()
if resp[:3] not in {'426', '225', '226'}: if resp[:3] not in {'426', '225', '226'}:
raise error_proto(resp) raise error_proto(resp)
return resp
def sendcmd(self, cmd): def sendcmd(self, cmd):
'''Send a command and return the response.''' '''Send a command and return the response.'''
...@@ -781,6 +782,15 @@ else: ...@@ -781,6 +782,15 @@ else:
conn.close() conn.close()
return self.voidresp() return self.voidresp()
def abort(self):
# overridden as we can't pass MSG_OOB flag to sendall()
line = b'ABOR' + B_CRLF
self.sock.sendall(line)
resp = self.getmultiline()
if resp[:3] not in {'426', '225', '226'}:
raise error_proto(resp)
return resp
__all__.append('FTP_TLS') __all__.append('FTP_TLS')
all_errors = (Error, IOError, EOFError, ssl.SSLError) all_errors = (Error, IOError, EOFError, ssl.SSLError)
......
...@@ -61,6 +61,8 @@ class DummyFTPHandler(asynchat.async_chat): ...@@ -61,6 +61,8 @@ class DummyFTPHandler(asynchat.async_chat):
def __init__(self, conn): def __init__(self, conn):
asynchat.async_chat.__init__(self, conn) asynchat.async_chat.__init__(self, conn)
# tells the socket to handle urgent data inline (ABOR command)
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_OOBINLINE, 1)
self.set_terminator(b"\r\n") self.set_terminator(b"\r\n")
self.in_buffer = [] self.in_buffer = []
self.dtp = None self.dtp = None
...@@ -181,6 +183,9 @@ class DummyFTPHandler(asynchat.async_chat): ...@@ -181,6 +183,9 @@ class DummyFTPHandler(asynchat.async_chat):
self.push('221 quit ok') self.push('221 quit ok')
self.close() self.close()
def cmd_abor(self, arg):
self.push('226 abor ok')
def cmd_stor(self, arg): def cmd_stor(self, arg):
self.push('125 stor ok') self.push('125 stor ok')
...@@ -491,6 +496,9 @@ class TestFTPClass(TestCase): ...@@ -491,6 +496,9 @@ class TestFTPClass(TestCase):
# Ensure the connection gets closed; sock attribute should be None # Ensure the connection gets closed; sock attribute should be None
self.assertEqual(self.client.sock, None) self.assertEqual(self.client.sock, None)
def test_abort(self):
self.client.abort()
def test_retrbinary(self): def test_retrbinary(self):
def callback(data): def callback(data):
received.append(data.decode('ascii')) received.append(data.decode('ascii'))
......
...@@ -83,6 +83,8 @@ Core and Builtins ...@@ -83,6 +83,8 @@ Core and Builtins
Library Library
------- -------
- Issue #12002: ftplib's abort() method raises TypeError.
- Issue 11999: fixed sporadic sync failure mailbox.Maildir due to its trying to - Issue 11999: fixed sporadic sync failure mailbox.Maildir due to its trying to
detect mtime changes by comparing to the system clock instead of to the detect mtime changes by comparing to the system clock instead of to the
previous value of the mtime. previous value of the mtime.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment