Ticket #5763: getbodystructuremultipart.patch

File getbodystructuremultipart.patch, 5.6 KB (added by antoine, 4 years ago)
  • twisted/mail/imap4.py

    diff --git a/twisted/mail/imap4.py b/twisted/mail/imap4.py
    a b def getBodyStructure(msg, extended=False 
    48434843    else:
    48444844        major = minor = None
    48454845
    4846 
    48474846    size = str(msg.getSize())
    48484847    unquotedAttrs = [(k, unquote(v)) for (k, v) in attrs.iteritems()]
    4849     result = [
    4850         major, minor,                       # Main and Sub MIME types
    4851         unquotedAttrs,                      # content-type parameter list
    4852         headers.get('content-id'),
    4853         headers.get('content-description'),
    4854         headers.get('content-transfer-encoding'),
    4855         size,                               # Number of octets total
    4856     ]
    4857 
    4858     if major is not None:
    4859         if major.lower() == 'text':
    4860             result.append(str(getLineCount(msg)))
    4861         elif (major.lower(), minor.lower()) == ('message', 'rfc822'):
    4862             contained = msg.getSubPart(0)
    4863             result.append(getEnvelope(contained))
    4864             result.append(getBodyStructure(contained, False))
    4865             result.append(str(getLineCount(contained)))
    4866 
    4867     if not extended or major is None:
    4868         return result
    4869 
    4870     if major.lower() != 'multipart':
    4871         headers = 'content-md5', 'content-disposition', 'content-language'
    4872         headers = msg.getHeaders(False, *headers)
    4873         disp = headers.get('content-disposition')
    4874 
    4875         # XXX - I dunno if this is really right
    4876         if disp:
    4877             disp = disp.split('; ')
    4878             if len(disp) == 1:
    4879                 disp = (disp[0].lower(), None)
    4880             elif len(disp) > 1:
    4881                 disp = (disp[0].lower(), [x.split('=') for x in disp[1:]])
    4882 
    4883         result.append(headers.get('content-md5'))
    4884         result.append(disp)
    4885         result.append(headers.get('content-language'))
    4886     else:
    4887         result = [result]
     4848
     4849    if major is not None and major.lower() == 'multipart':
     4850        result = []
    48884851        try:
    48894852            i = 0
    48904853            while True:
    48914854                submsg = msg.getSubPart(i)
    4892                 result.append(getBodyStructure(submsg))
     4855                result.append(getBodyStructure(submsg, extended=True))
    48934856                i += 1
    48944857        except IndexError:
    48954858            result.append(minor)
    4896             result.append(attrs.items())
     4859            result.append(unquotedAttrs)
    48974860
    48984861            # XXX - I dunno if this is really right
    48994862            headers = msg.getHeaders(False, 'content-disposition', 'content-language')
    def getBodyStructure(msg, extended=False 
    49074870
    49084871            result.append(disp)
    49094872            result.append(headers.get('content-language'))
     4873        return result
     4874
     4875    result = [
     4876        major, minor,                       # Main and Sub MIME types
     4877        unquotedAttrs,                      # content-type parameter list
     4878        headers.get('content-id'),
     4879        headers.get('content-description'),
     4880        headers.get('content-transfer-encoding'),
     4881        size,                               # Number of octets total
     4882    ]
     4883
     4884    if major is not None:
     4885        if major.lower() == 'text':
     4886            result.append(str(getLineCount(msg)))
     4887        elif (major.lower(), minor.lower()) == ('message', 'rfc822'):
     4888            contained = msg.getSubPart(0)
     4889            result.append(getEnvelope(contained))
     4890            result.append(getBodyStructure(contained, False))
     4891            result.append(str(getLineCount(contained)))
     4892
     4893    if not extended or major is None:
     4894        return result
     4895
     4896    headers = 'content-md5', 'content-disposition', 'content-language'
     4897    headers = msg.getHeaders(False, *headers)
     4898    disp = headers.get('content-disposition')
     4899
     4900    # XXX - I dunno if this is really right
     4901    if disp:
     4902        disp = disp.split('; ')
     4903        if len(disp) == 1:
     4904            disp = (disp[0].lower(), None)
     4905        elif len(disp) > 1:
     4906            disp = (disp[0].lower(), [x.split('=') for x in disp[1:]])
     4907
     4908    result.append(headers.get('content-md5'))
     4909    result.append(disp)
     4910    result.append(headers.get('content-language'))
    49104911
    49114912    return result
    49124913
  • twisted/mail/test/test_imap.py

    diff --git a/twisted/mail/test/test_imap.py b/twisted/mail/test/test_imap.py
    a b class NewFetchTestCase(unittest.TestCase 
    35313531    def testFetchBodyStructureUID(self):
    35323532        return self.testFetchBodyStructure(1)
    35333533
     3534    def testFetchBodyStructureMultipart(self, uid=0):
     3535        self.function = self.client.fetchBodyStructure
     3536        self.messages = '3:9,10:*'
     3537        innerMessage = FakeyMessage({
     3538                'content-type': 'text/plain; name=thing; key="value"',
     3539                'content-id': 'this-is-the-content-id',
     3540                'content-description': 'describing-the-content-goes-here!',
     3541                'content-transfer-encoding': '8BIT',
     3542                'content-language': 'fr',
     3543            }, (), '', 'Body\nText\nGoes\nHere\n', 919293, None)
     3544        self.msgObjs = [FakeyMessage({
     3545                'content-type': 'multipart/mixed; boundary="xyz"',
     3546                'content-language': 'en',
     3547            }, (), '', '', 919293, [innerMessage])]
     3548        self.expected = {0: {'BODYSTRUCTURE': [
     3549            ['text', 'plain', [['name', 'thing'], ['key', 'value']],
     3550             'this-is-the-content-id', 'describing-the-content-goes-here!',
     3551             '8BIT', '20', '4', None, None, 'fr'],
     3552            'mixed', [['boundary', 'xyz']], None, 'en'
     3553            ]}}
     3554        return self._fetchWork(uid)
     3555
     3556    def testFetchBodyStructureMultipartUID(self):
     3557        return self.testFetchBodyStructureMultipart(1)
     3558
    35343559    def testFetchSimplifiedBody(self, uid=0):
    35353560        self.function = self.client.fetchSimplifiedBody
    35363561        self.messages = '21'