Ticket #5763: getbodystructuremultipart.patch
| File getbodystructuremultipart.patch, 5.6 KB (added by antoine, 11 months ago) |
|---|
-
twisted/mail/imap4.py
diff --git a/twisted/mail/imap4.py b/twisted/mail/imap4.py
a b 4843 4843 else: 4844 4844 major = minor = None 4845 4845 4846 4847 4846 size = str(msg.getSize()) 4848 4847 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 = [] 4888 4851 try: 4889 4852 i = 0 4890 4853 while True: 4891 4854 submsg = msg.getSubPart(i) 4892 result.append(getBodyStructure(submsg ))4855 result.append(getBodyStructure(submsg, extended=True)) 4893 4856 i += 1 4894 4857 except IndexError: 4895 4858 result.append(minor) 4896 result.append( attrs.items())4859 result.append(unquotedAttrs) 4897 4860 4898 4861 # XXX - I dunno if this is really right 4899 4862 headers = msg.getHeaders(False, 'content-disposition', 'content-language') … … 4907 4870 4908 4871 result.append(disp) 4909 4872 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')) 4910 4911 4911 4912 return result 4912 4913 -
twisted/mail/test/test_imap.py
diff --git a/twisted/mail/test/test_imap.py b/twisted/mail/test/test_imap.py
a b 3531 3531 def testFetchBodyStructureUID(self): 3532 3532 return self.testFetchBodyStructure(1) 3533 3533 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 3534 3559 def testFetchSimplifiedBody(self, uid=0): 3535 3560 self.function = self.client.fetchSimplifiedBody 3536 3561 self.messages = '21'
