Fixed #19134 -- Allowed closing smtp backend when the server is stopped

Thanks Sebastian Noack for the report and the initial patch.
This commit is contained in:
Claude Paroz 2013-01-03 18:49:00 +01:00
parent 84ea85fb90
commit 1b3f832ab7
2 changed files with 19 additions and 5 deletions

View File

@ -63,9 +63,10 @@ class EmailBackend(BaseEmailBackend):
try:
try:
self.connection.quit()
except socket.sslerror:
except (socket.sslerror, smtplib.SMTPServerDisconnected):
# This happens when calling quit() on a TLS connection
# sometimes.
# sometimes, or when the connection was already disconnected
# by the server.
self.connection.close()
except:
if self.fail_silently:

View File

@ -659,9 +659,9 @@ class FakeSMTPServer(smtpd.SMTPServer, threading.Thread):
asyncore.close_all()
def stop(self):
assert self.active
self.active = False
self.join()
if self.active:
self.active = False
self.join()
class SMTPBackendTests(BaseEmailBackendTests, TestCase):
@ -715,3 +715,16 @@ class SMTPBackendTests(BaseEmailBackendTests, TestCase):
backend = smtp.EmailBackend(username='', password='')
self.assertEqual(backend.username, '')
self.assertEqual(backend.password, '')
def test_server_stopped(self):
"""
Test that closing the backend while the SMTP server is stopped doesn't
raise an exception.
"""
backend = smtp.EmailBackend(username='', password='')
backend.open()
self.server.stop()
try:
backend.close()
except Exception as e:
self.fail("close() unexpectedly raised an exception: %s" % e)