diff --git a/Lib/httplib.py b/Lib/httplib.py
index 088e3f3..789d80c 100644
--- a/Lib/httplib.py
+++ b/Lib/httplib.py
@@ -139,7 +139,7 @@
 
         self.dict = {}
         self.unixfrom = ''
-        self.headers = list = []
+        self.headers = hlist = []
         self.status = ''
         headerseen = ""
         firstline = 1
@@ -148,7 +148,7 @@
             unread = self.fp.unread
         elif self.seekable:
             tell = self.fp.tell
-        while 1:
+        while True:
             if tell:
                 try:
                     startofline = tell()
@@ -168,7 +168,7 @@
                 # XXX Not sure if continuation lines are handled properly
                 # for http and/or for repeating headers
                 # It's a continuation line.
-                list.append(line)
+                hlist.append(line)
                 self.addcontinue(headerseen, line.strip())
                 continue
             elif self.iscomment(line):
@@ -180,7 +180,7 @@
             headerseen = self.isheader(line)
             if headerseen:
                 # It's a legal header line, save it.
-                list.append(line)
+                hlist.append(line)
                 self.addheader(headerseen, line[len(headerseen)+1:].strip())
                 continue
             else:
@@ -264,12 +264,12 @@
             return
 
         # read until we get a non-100 response
-        while 1:
+        while True:
             version, status, reason = self._read_status()
             if status != 100:
                 break
             # skip the header from the 100 response
-            while 1:
+            while True:
                 skip = self.fp.readline().strip()
                 if not skip:
                     break
@@ -411,7 +411,7 @@
 
         # XXX This accumulates chunks by repeated string concatenation,
         # which is not efficient as the number or size of chunks gets big.
-        while 1:
+        while True:
             if chunk_left is None:
                 line = self.fp.readline()
                 i = line.find(';')
@@ -441,7 +441,7 @@
 
         # read and discard trailer up to the CRLF terminator
         ### note: we shouldn't have any trailers!
-        while 1:
+        while True:
             line = self.fp.readline()
             if line == '\r\n':
                 break
@@ -471,8 +471,8 @@
             chunk = self.fp.read(amt)
             if not chunk:
                 raise IncompleteRead(s)
-            s = s + chunk
-            amt = amt - len(chunk)
+            s += chunk
+            amt -= len(chunk)
         return s
 
     def getheader(self, name, default=None):
@@ -728,7 +728,7 @@
 
         if body:
             self.putheader('Content-Length', str(len(body)))
-        for hdr, value in headers.items():
+        for hdr, value in headers.iteritems():
             self.putheader(hdr, value)
         self.endheaders()
 
@@ -840,7 +840,7 @@
     def _read(self):
         buf = ''
         # put in a loop so that we retry on transient errors
-        while 1:
+        while True:
             try:
                 buf = self._ssl.read(self._bufsize)
             except socket.sslerror, err:
@@ -864,42 +864,32 @@
 
     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 = ''
-            return all
+            for s in iter(self._read, ""):
+                L.append(s)
+            return "".join(L)
         else:
-            self._buf = all[size:]
-            return all[:size]
+            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]
 
     def readline(self):
         L = [self._buf]
         self._buf = ''
-        while 1:
-            i = L[-1].find("\n")
-            if i >= 0:
-                break
-            s = self._read()
-            if s == '':
-                break
+        for s in iter(self._read, ""):
             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
+            if "\n" in s:
+                i = s.find("\n") + 1
+                self._buf = s[i:]
+                L[-1] = s[:i]
+                break
+        return "".join(L)
 
 class FakeSocket(SharedSocketClient):
 
