merge with 3.1

This commit is contained in:
Giampaolo Rodola' 2011-05-07 19:09:34 +02:00
commit 24befa87dc
3 changed files with 21 additions and 1 deletions

View file

@ -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:
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)

View file

@ -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):
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):
# 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'))

View file

@ -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.