55 lines
1.5 KiB
Python
55 lines
1.5 KiB
Python
|
# Copyright (c) 2014, Menno Smits
|
||
|
# Released subject to the New BSD License
|
||
|
# Please see http://en.wikipedia.org/wiki/BSD_licenses
|
||
|
|
||
|
"""
|
||
|
Work-around for Python Issue 5943 (http://bugs.python.org/issue5949).
|
||
|
|
||
|
This will patch imaplib's IMAP4_SSL.readline method with the fixed
|
||
|
verion in Python versions that are known to have the problem.
|
||
|
|
||
|
The problem definitely exists in Python 2.5 and 2.6 up until but not
|
||
|
including 2.6.5. It was also fixed in Python 2.7 alpha 2 so no attempt
|
||
|
is made to patch 2.7 versions.
|
||
|
|
||
|
Please let me know if there's more Python versions that should be
|
||
|
patched.
|
||
|
|
||
|
Efforts are made to only perform the patch once.
|
||
|
"""
|
||
|
|
||
|
from __future__ import unicode_literals
|
||
|
|
||
|
import sys
|
||
|
import imaplib
|
||
|
|
||
|
|
||
|
def _is_affected_version(sys_version):
|
||
|
sys_version = sys_version[:3]
|
||
|
if sys_version < (2, 5, 0):
|
||
|
# Not sure whether these old versions are affected so being
|
||
|
# conservative and not patching.
|
||
|
return False
|
||
|
elif sys_version < (2, 6, 5):
|
||
|
return True
|
||
|
return False
|
||
|
|
||
|
|
||
|
def _fixed_readline(self):
|
||
|
"""Read line from remote."""
|
||
|
line = []
|
||
|
while True:
|
||
|
char = self.sslobj.read(1)
|
||
|
line.append(char)
|
||
|
if char in ("\n", ""):
|
||
|
return ''.join(line)
|
||
|
|
||
|
_fixed_readline.patched = True # Marker to indicate patched version
|
||
|
|
||
|
ssl_class = imaplib.IMAP4_SSL
|
||
|
|
||
|
|
||
|
def apply_patch():
|
||
|
if _is_affected_version(sys.version_info) and not hasattr(ssl_class.readline, 'patched'):
|
||
|
ssl_class.readline = _fixed_readline
|