Ticket #5763: getbodystructuremultipart.patch

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

    diff --git a/twisted/mail/imap4.py b/twisted/mail/imap4.py
    a b  
    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') 
     
    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  
    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'