]> granicus.if.org Git - python/commitdiff
Fix IMAP4_SSL read and send methods to take account of short data
authorPiers Lauder <piers@cs.su.oz.au>
Sun, 23 Jun 2002 10:47:13 +0000 (10:47 +0000)
committerPiers Lauder <piers@cs.su.oz.au>
Sun, 23 Jun 2002 10:47:13 +0000 (10:47 +0000)
Lib/imaplib.py

index 2a7630b24d0b0b2e735ada6fac9cfb4d56052757..7afd66535af503b98b0ba8b3da7711e89701c258 100644 (file)
@@ -18,7 +18,7 @@ Public functions:       Internaldate2tuple
 # IMAP4_SSL contributed by Tino Lange <Tino.Lange@isg.de> March 2002.
 # GET/SETQUOTA contributed by Andreas Zeidler <az@kreativkombinat.de> June 2002.
 
-__version__ = "2.52"
+__version__ = "2.53"
 
 import binascii, re, socket, time, random, sys
 
@@ -1056,11 +1056,17 @@ class IMAP4_SSL(IMAP4):
 
     def read(self, size):
         """Read 'size' bytes from remote."""
-        return self.sslobj.read(size)
+        # sslobj.read() sometimes returns < size bytes
+        data = self.sslobj.read(size)
+        while len(data) < size:
+                data += self.sslobj.read(len(data)-size)
+
+        return data
 
 
     def readline(self):
         """Read line from remote."""
+        # NB: socket.ssl needs a "readline" method, or perhaps a "makefile" method.
         line = ""
         while 1:
             char = self.sslobj.read(1)
@@ -1070,7 +1076,14 @@ class IMAP4_SSL(IMAP4):
 
     def send(self, data):
         """Send data to remote."""
-        self.sslobj.write(data)
+        # NB: socket.ssl needs a "sendall" method to match socket objects.
+        bytes = len(data)
+        while bytes > 0:
+            sent = self.sslobj.write(data)
+            if sent == bytes:
+                break    # avoid copy
+            data = data[sent:]
+            bytes = bytes - sent
 
 
     def shutdown(self):