Index: Lib/email/utils.py =================================================================== --- Lib/email/utils.py (revision 64003) +++ Lib/email/utils.py (working copy) @@ -25,7 +25,6 @@ import base64 import random import socket -import urllib import warnings from io import StringIO @@ -235,6 +234,7 @@ params is a sequence of 2-tuples containing (param name, string value). """ + import urllib # Copy params so we don't mess with the original params = params[:] new_params = [] Index: Lib/http/client.py =================================================================== --- Lib/http/client.py (revision 64003) +++ Lib/http/client.py (working copy) @@ -67,8 +67,9 @@ """ import io -import mimetools import socket +import email.parser +import email.message from urlparse import urlsplit import warnings @@ -201,21 +202,21 @@ # maximal amount of data to read at one time in _safe_read MAXAMOUNT = 1048576 -class HTTPMessage(mimetools.Message): +class HTTPMessage(email.message.Message): def addheader(self, key, value): """Add header for field key handling repeats.""" - prev = self.dict.get(key) + prev = self.get(key) if prev is None: - self.dict[key] = value + self[key] = value else: combined = ", ".join((prev, value)) - self.dict[key] = combined + self[key] = combined def addcontinue(self, key, more): """Add more field data from a continuation line.""" - prev = self.dict[key] - self.dict[key] = prev + "\n " + more + prev = self[key] + self[key] = prev + "\n " + more def readheaders(self): """Read header lines. @@ -414,23 +415,25 @@ else: raise UnknownProtocol(version) + parser = email.parser.HeaderParser(_class=HTTPMessage) if self.version == 9: self.length = None self.chunked = 0 self.will_close = 1 - self.msg = HTTPMessage(io.BytesIO()) + self.msg = parser.parsestr('') return - self.msg = HTTPMessage(self.fp, 0) + fp = io.TextIOWrapper(io.BufferedReader(self.fp), 'latin1') + self.msg = parser.parse(fp) if self.debuglevel > 0: - for hdr in self.msg.headers: + for hdr in self.msg: print("header:", hdr, end=" ") # don't let the msg keep an fp self.msg.fp = None # are we using the chunked-style of transfer encoding? - tr_enc = self.msg.getheader("transfer-encoding") + tr_enc = self.msg.get("transfer-encoding") if tr_enc and tr_enc.lower() == "chunked": self.chunked = 1 self.chunk_left = None @@ -443,7 +446,7 @@ # do we have a Content-Length? # NOTE: RFC 2616, S4.4, #3 says we ignore this if tr_enc is "chunked" self.length = None - length = self.msg.getheader("content-length") + length = self.msg.get("content-length") if length and not self.chunked: try: self.length = int(length) @@ -470,11 +473,11 @@ self.will_close = 1 def _check_close(self): - conn = self.msg.getheader("connection") + conn = self.msg.get("connection") if self.version == 11: # An HTTP/1.1 proxy is assumed to stay open unless # explicitly closed. - conn = self.msg.getheader("connection") + conn = self.msg.get("connection") if conn and "close" in conn.lower(): return True return False @@ -483,7 +486,7 @@ # connections, using rules different than HTTP/1.1. # For older HTTP, Keep-Alive indicates persistent connection. - if self.msg.getheader("keep-alive"): + if self.msg.get("keep-alive"): return False # At least Akamai returns a "Connection: Keep-Alive" header, @@ -492,7 +495,7 @@ return False # Proxy-Connection is a netscape hack. - pconn = self.msg.getheader("proxy-connection") + pconn = self.msg.get("proxy-connection") if pconn and "keep-alive" in pconn.lower(): return False @@ -644,7 +647,7 @@ def getheader(self, name, default=None): if self.msg is None: raise ResponseNotReady() - return self.msg.getheader(name, default) + return self.msg.get(name, default) def getheaders(self): """Return list of (header, value) tuples."""