Ticket #5799: 5799-BODYSTRUCTURE_Content-Dispositiong-20120801.patch

File 5799-BODYSTRUCTURE_Content-Dispositiong-20120801.patch, 5.0 KB (added by argonemyth, 2 years ago)

Second try!

  • twisted/mail/test/test_imap.py

     
    885885                self.assertEqual(L, expected, 
    886886                                  "len(%r) = %r != %r" % (input, L, expected)) 
    887887 
     888 
     889    def test_IfQuotedString(self): 
     890        """ 
     891        The strings passed to L{imap4._ifQuotedString} are not tokens, so 
     892        C{True} should be returned. 
     893        """ 
     894        inputs = [ 
     895            'some ramdom stuff', 
     896            '(twisted)', 
     897            '<twisted>', 
     898            'twisted@', 
     899            'twisted,', 
     900            'twisted;', 
     901            'twisted:', 
     902            'twisted\\', 
     903            'twisted"', 
     904            'twisted/', 
     905            '[twisted]', 
     906            'twisted?', 
     907            'twisted=', 
     908        ] 
     909 
     910        # Add all the control characters 
     911        for i in range(33): 
     912            inputs.append('twiste'+ chr(i) + 'd') 
     913 
     914        for i in inputs: 
     915            self.assertEqual(imap4._ifQuotedString(i), True) 
     916 
     917 
     918    def test_IfTokens(self): 
     919        """ 
     920        The strings passed to L{imap4._ifQuotedString} are tokens, so 
     921        C{False} should be returned. 
     922        """ 
     923        result = imap4._ifQuotedString("I'm.a.token!") 
     924        self.assertEqual(result, False) 
     925 
     926 
     927 
    888928class SimpleMailbox: 
    889929    implements(imap4.IMailboxInfo, imap4.IMailbox, imap4.ICloseableMailbox) 
    890930 
     
    34573497            structure) 
    34583498 
    34593499 
     3500    def test_singlePartDisposition(self): 
     3501        """ 
     3502        For some content-disposition parameter values, 
     3503        L{imap4.getBodyStructure} returns quoted-string. 
     3504        """ 
     3505        body = 'hello, world' 
     3506        major = 'image' 
     3507        minor = 'jpeg' 
     3508        charset = 'us-ascii' 
     3509        msg = FakeyMessage({ 
     3510                'content-type': '%s/%s; charset=%s; x=y' % ( 
     3511                    major, minor, charset), 
     3512                'content-disposition': 'attachment; filename=foo (doc).pdf; ' \ 
     3513                    'size=bar; creation-date=somedate; ' \ 
     3514                    'modification-date=somedate; read-date=somedate', 
     3515                }, (), '', body, 123, None) 
     3516        structure = imap4.getBodyStructure(msg, extended=True) 
     3517        self.assertEqual( 
     3518            [major, minor, ["charset", charset, 'x', 'y'], None, 
     3519             None, None, len(body), None, 
     3520             ['attachment', ['filename', '"foo (doc).pdf"', 'size', 'bar', 
     3521              'creation-date', '"somedate"', 
     3522              'modification-date', '"somedate"', 
     3523              'read-date', '"somedate"']], None, None], 
     3524            structure) 
     3525 
     3526 
    34603527    def test_textPart(self): 
    34613528        """ 
    34623529        For a I{text/*} message, the number of lines in the message body are 
  • twisted/mail/imap4.py

     
    43274327            return 1 
    43284328    return 0 
    43294329 
     4330# tspecial in RFC 2045 
     4331_TSPECIALS = r'()<>@,;:\"/[]?=' 
     4332def _ifQuotedString(s): 
     4333    """ 
     4334    It determines if a string is a token or quoted-string. 
     4335    @see: U{http://www.ietf.org/rfc/rfc2045.txt} 
     4336 
     4337    @type s: C{str} 
     4338    @param s: The string needs to be checked 
     4339 
     4340    @return: True if the string needs quotation marks, False if the 
     4341        string is a token. 
     4342    """ 
     4343    if s == '': 
     4344        return True 
     4345    for c in s: 
     4346        # ASCII characters without control characters 
     4347        if c <= '\x20' or c > '\x7f': 
     4348            return True 
     4349        if c in _TSPECIALS: 
     4350            return True 
     4351    return False 
     4352 
    43304353def _prepareMailboxName(name): 
    43314354    name = name.encode('imap4-utf-7') 
    43324355    if _needsQuote(name): 
     
    48954918        Parse a I{Content-Disposition} header into a two-sequence of the 
    48964919        disposition and a flattened list of its parameters. 
    48974920 
     4921        According to RFC2183, the following parameter values will be quoted: 
     4922            1. Values of date parameters 
     4923            2. Values contain only ASCII characters, but including 
     4924               tspecials characters. 
     4925 
    48984926        @return: C{None} if there is no disposition header value, a C{list} with 
    48994927            two elements otherwise. 
    49004928        """ 
     
    49044932                disp = (disp[0].lower(), None) 
    49054933            elif len(disp) > 1: 
    49064934                # XXX Poorly tested parser 
    4907                 params = [x for param in disp[1:] for x in param.split('=', 1)] 
     4935                date_params = ['creation-date', 'modification-date', 
     4936                               'read-date'] 
     4937                params = [] 
     4938                for param in disp[1:]: 
     4939                    key, value = param.split('=') 
     4940                    params.append(key) 
     4941                    if key in date_params or _ifQuotedString(value): 
     4942                        params.append(_quote(value)) 
     4943                    else: 
     4944                        params.append(value) 
    49084945                disp = [disp[0].lower(), params] 
    49094946            return disp 
    49104947        else: