'Read header lines.
Read header lines up to the entirely blank line that terminates them.
The (normally blank) line that ends the headers is skipped, but not
included in the returned list.  If a non-header line ends the headers,
(which is an error), an attempt is made to backspace over it; it is
never included in the returned list.
The variable self.status is set to the empty string if all went well,
otherwise it is an error message.  The variable self.headers is a
completely uninterpreted list of lines contained in the header (so
printing them will reproduce the header exactly as it appears in the
file).
If multiple header fields with the same name occur, they are combined
according to the rules in RFC 2616 sec 4.2:
Appending each subsequent field-value to the first, each separated
by a comma. The order in which header fields with the same field-name
are received is significant to the interpretation of the combined
field value.'

def readheaders(self):

    self.dict = {}
    self.unixfrom = ''
    self.headers = hlist = []
    self.status = ''
    headerseen = ''
    firstline = 1
    startofline = unread = tell = None
    if hasattr(self.fp, 'unread'):
        unread = self.fp.unread
    elif self.seekable:
        tell = self.fp.tell
    while True:
        if tell:
            try:
                startofline = tell()
            except IOError:
                startofline = tell = None
                self.seekable = 0
        line = self.fp.readline((_MAXLINE + 1))
        if (len(line) > _MAXLINE):
            raise LineTooLong('header    line')
        if (not line):
            self.status = 'EOF    in    headers'
            break
        if (firstline and line.startswith('From    ')):
            self.unixfrom = (self.unixfrom + line)
            continue
        firstline = 0
        if (headerseen and (line[0] in '     DCTB ')):
            hlist.append(line)
            self.addcontinue(headerseen, line.strip())
            continue
        elif self.iscomment(line):
            continue
        elif self.islast(line):
            break
        headerseen = self.isheader(line)
        if headerseen:
            hlist.append(line)
            self.addheader(headerseen, line[(len(headerseen) + 1):].strip())
            continue
        else:
            if (not self.dict):
                self.status = 'No    headers'
            else:
                self.status = 'Non-header    line    where    header    expected'
            if unread:
                unread(line)
            elif tell:
                self.fp.seek(startofline)
            else:
                self.status = (self.status + ';    bad    seek')
            break
