def _parse_headers(self, lines):
     lastheader = ''
     lastvalue = []
     for (lineno, line) in enumerate(lines):
         if line[0] in ' \t':
             if not lastheader:
                 defect = errors.FirstHeaderLineIsContinuationDefect(line)
                 self.policy.handle_defect(self._cur, defect)
             lastvalue.append(line)
         if lastheader:
             self._cur.set_raw(*self.policy.header_source_parse(lastvalue))
             (lastheader, lastvalue) = ('', [])
         if line.startswith('From '):
             if lineno == 0:
                 mo = NLCRE_eol.search(line)
                 if mo:
                     line = line[:-len(mo.group(0))]
                 self._cur.set_unixfrom(line)
             else:
                 if lineno == len(lines) - 1:
                     self._input.unreadline(line)
                     return
                 defect = errors.MisplacedEnvelopeHeaderDefect(line)
                 self._cur.defects.append(defect)
         i = line.find(':')
         lastheader = line[:i]
         lastvalue = [line]
     if lastheader:
         self._cur.set_raw(*self.policy.header_source_parse(lastvalue))
示例#2
0
    def _parse_headers(self, lines):
        # Passed a list of lines that make up the headers for the current msg
        lastheader = ''
        lastvalue = []
        for lineno, line in enumerate(lines):
            # Check for continuation
            if line[0] in ' \t':
                if not lastheader:
                    # The first line of the headers was a continuation.  This
                    # is illegal, so let's note the defect, store the illegal
                    # line, and ignore it for purposes of headers.
                    defect = errors.FirstHeaderLineIsContinuationDefect(line)
                    self.policy.handle_defect(self._cur, defect)
                    continue
                lastvalue.append(line)
                continue
            if lastheader:
                self._cur.set_raw(*self.policy.header_source_parse(lastvalue))
                lastheader, lastvalue = '', []
            # Check for envelope header, i.e. unix-from
            if line.startswith('From '):
                if lineno == 0:
                    # Strip off the trailing newline
                    mo = NLCRE_eol.search(line)
                    if mo:
                        line = line[:-len(mo.group(0))]
                    self._cur.set_unixfrom(line)
                    continue
                elif lineno == len(lines) - 1:
                    # Something looking like a unix-from at the end - it's
                    # probably the first line of the body, so push back the
                    # line and stop.
                    self._input.unreadline(line)
                    return
                else:
                    # Weirdly placed unix-from line.  Note this as a defect
                    # and ignore it.
                    defect = errors.MisplacedEnvelopeHeaderDefect(line)
                    self._cur.defects.append(defect)
                    continue
            # Split the line on the colon separating field name from value.
            # There will always be a colon, because if there wasn't the part of
            # the parser that calls us would have started parsing the body.
            i = line.find(':')

            # If the colon is on the start of the line the header is clearly
            # malformed, but we might be able to salvage the rest of the
            # message. Track the error but keep going.
            if i == 0:
                defect = errors.InvalidHeaderDefect("Missing header name.")
                self._cur.defects.append(defect)
                continue

            assert i > 0, "_parse_headers fed line with no : and no leading WS"
            lastheader = line[:i]
            lastvalue = [line]
        # Done with all the lines, so handle the last header.
        if lastheader:
            self._cur.set_raw(*self.policy.header_source_parse(lastvalue))
示例#3
0
 def _parse_headers(self, lines):
     # Passed a list of lines that make up the headers for the current msg
     lastheader = ''
     lastvalue = []
     for lineno, line in enumerate(lines):
         # Check for continuation
         if line[0] in ' \t':
             if not lastheader:
                 # The first line of the headers was a continuation.  This
                 # is illegal, so let's note the defect, store the illegal
                 # line, and ignore it for purposes of headers.
                 defect = errors.FirstHeaderLineIsContinuationDefect(line)
                 self._cur.defects.append(defect)
                 continue
             lastvalue.append(line)
             continue
         if lastheader:
             # XXX reconsider the joining of folded lines
             lhdr = EMPTYSTRING.join(lastvalue)[:-1].rstrip('\r\n')
             self._cur[lastheader] = lhdr
             lastheader, lastvalue = '', []
         # Check for envelope header, i.e. unix-from
         if line.startswith('From '):
             if lineno == 0:
                 # Strip off the trailing newline
                 mo = NLCRE_eol.search(line)
                 if mo:
                     line = line[:-len(mo.group(0))]
                 self._cur.set_unixfrom(line)
                 continue
             elif lineno == len(lines) - 1:
                 # Something looking like a unix-from at the end - it's
                 # probably the first line of the body, so push back the
                 # line and stop.
                 self._input.unreadline(line)
                 return
             else:
                 # Weirdly placed unix-from line.  Note this as a defect
                 # and ignore it.
                 defect = errors.MisplacedEnvelopeHeaderDefect(line)
                 self._cur.defects.append(defect)
                 continue
         # Split the line on the colon separating field name from value.
         i = line.find(':')
         if i < 0:
             defect = errors.MalformedHeaderDefect(line)
             self._cur.defects.append(defect)
             continue
         lastheader = line[:i]
         lastvalue = [line[i + 1:].lstrip()]
     # Done with all the lines, so handle the last header.
     if lastheader:
         # XXX reconsider the joining of folded lines
         self._cur[lastheader] = EMPTYSTRING.join(lastvalue).rstrip('\r\n')
示例#4
0
    def _parse_headers(self, lines):
        lastheader = ''
        lastvalue = []
        for lineno, line in enumerate(lines):
            if line[0] in ' \t':
                if not lastheader:
                    defect = errors.FirstHeaderLineIsContinuationDefect(line)
                    self.policy.handle_defect(self._cur, defect)
            else:
                lastvalue.append(line)
                continue
                if lastheader:
                    (self._cur.set_raw)(
                        *self.policy.header_source_parse(lastvalue))
                    lastheader, lastvalue = '', []
                if line.startswith('From '):
                    if lineno == 0:
                        mo = NLCRE_eol.search(line)
                        if mo:
                            line = line[:-len(mo.group(0))]
                        self._cur.set_unixfrom(line)
                        continue
                    elif lineno == len(lines) - 1:
                        self._input.unreadline(line)
                        return
                    else:
                        defect = errors.MisplacedEnvelopeHeaderDefect(line)
                        self._cur.defects.append(defect)
                        continue

                    i = line.find(':')
                    if i == 0:
                        defect = errors.InvalidHeaderDefect(
                            'Missing header name.')
                        self._cur.defects.append(defect)
                    continue
                    assert i > 0, '_parse_headers fed line with no : and no leading WS'
                    lastheader = line[:i]
                    lastvalue = [line]

        if lastheader:
            (self._cur.set_raw)(*self.policy.header_source_parse(lastvalue))
示例#5
0
    def _parse_headers(self, lines):
        lastheader = ''
        lastvalue = []
        for lineno, line in enumerate(lines):
            if line[0] in ' \t':
                if not lastheader:
                    defect = errors.FirstHeaderLineIsContinuationDefect(line)
                    self._cur.defects.append(defect)
                    continue
                lastvalue.append(line)
                continue
            if lastheader:
                lhdr = EMPTYSTRING.join(lastvalue)[:-1].rstrip('\r\n')
                self._cur[lastheader] = lhdr
                lastheader, lastvalue = '', []
            if line.startswith('From '):
                if lineno == 0:
                    mo = NLCRE_eol.search(line)
                    if mo:
                        line = line[:-len(mo.group(0))]
                    self._cur.set_unixfrom(line)
                    continue
                else:
                    if lineno == len(lines) - 1:
                        self._input.unreadline(line)
                        return
                    defect = errors.MisplacedEnvelopeHeaderDefect(line)
                    self._cur.defects.append(defect)
                    continue
            i = line.find(':')
            if i < 0:
                defect = errors.MalformedHeaderDefect(line)
                self._cur.defects.append(defect)
                continue
            lastheader = line[:i]
            lastvalue = [line[i + 1:].lstrip()]

        if lastheader:
            self._cur[lastheader] = EMPTYSTRING.join(lastvalue).rstrip('\r\n')