]> granicus.if.org Git - python/commitdiff
Reverted the previous change to read() and readline().
authorRaymond Hettinger <python@rcn.com>
Thu, 6 Mar 2003 16:31:48 +0000 (16:31 +0000)
committerRaymond Hettinger <python@rcn.com>
Thu, 6 Mar 2003 16:31:48 +0000 (16:31 +0000)
Kevin Jacobs found that the code simplification did not
exactly match the semantics of the original.  Regression
test cases were requested.

Lib/httplib.py

index 789d80c4e11090c494e7839e2385cd13a1507c55..ca215a4f7acbbebd55e20359685ba262136e0aee 100644 (file)
@@ -864,32 +864,42 @@ class SSLFile(SharedSocketClient):
 
     def read(self, size=None):
         L = [self._buf]
+        avail = len(self._buf)
+        while size is None or avail < size:
+            s = self._read()
+            if s == '':
+                break
+            L.append(s)
+            avail += len(s)
+        all = "".join(L)
         if size is None:
             self._buf = ''
-            for s in iter(self._read, ""):
-                L.append(s)
-            return "".join(L)
+            return all
         else:
-            avail = len(self._buf)
-            for s in iter(self._read, ""):
-                L.append(s)
-                avail += len(s)
-                if avail >= size:
-                    all = "".join(L)
-                    self._buf = all[size:]
-                    return all[:size]
+            self._buf = all[size:]
+            return all[:size]
 
     def readline(self):
         L = [self._buf]
         self._buf = ''
-        for s in iter(self._read, ""):
-            L.append(s)
-            if "\n" in s:
-                i = s.find("\n") + 1
-                self._buf = s[i:]
-                L[-1] = s[:i]
+        while 1:
+            i = L[-1].find("\n")
+            if i >= 0:
                 break
-        return "".join(L)
+            s = self._read()
+            if s == '':
+                break
+            L.append(s)
+        if i == -1:
+            # loop exited because there is no more data
+            return "".join(L)
+        else:
+            all = "".join(L)
+            # XXX could do enough bookkeeping not to do a 2nd search
+            i = all.find("\n") + 1
+            line = all[:i]
+            self._buf = all[i:]
+            return line
 
 class FakeSocket(SharedSocketClient):