@@ -2456,6 +2456,115 @@ def test_invalid_content_transfer_encoding(self):
24562456 ";foo" , ";foo" , ";foo" , [errors .InvalidHeaderDefect ]* 3
24572457 )
24582458
2459+
2460+ @parameterize
2461+ class Test_parse_mime_parameters (TestParserMixin , TestEmailBase ):
2462+
2463+ def mime_parameters_as_value (self ,
2464+ value ,
2465+ tl_str ,
2466+ tl_value ,
2467+ params ,
2468+ defects ):
2469+ mime_parameters = self ._test_parse_x (parser .parse_mime_parameters ,
2470+ value , tl_str , tl_value , defects )
2471+ self .assertEqual (mime_parameters .token_type , 'mime-parameters' )
2472+ self .assertEqual (list (mime_parameters .params ), params )
2473+
2474+
2475+ mime_parameters_params = {
2476+
2477+ 'simple' : (
2478+ 'filename="abc.py"' ,
2479+ ' filename="abc.py"' ,
2480+ 'filename=abc.py' ,
2481+ [('filename' , 'abc.py' )],
2482+ []),
2483+
2484+ 'multiple_keys' : (
2485+ 'filename="abc.py"; xyz=abc' ,
2486+ ' filename="abc.py"; xyz="abc"' ,
2487+ 'filename=abc.py; xyz=abc' ,
2488+ [('filename' , 'abc.py' ), ('xyz' , 'abc' )],
2489+ []),
2490+
2491+ 'split_value' : (
2492+ "filename*0*=iso-8859-1''%32%30%31%2E; filename*1*=%74%69%66" ,
2493+ ' filename="201.tif"' ,
2494+ "filename*0*=iso-8859-1''%32%30%31%2E; filename*1*=%74%69%66" ,
2495+ [('filename' , '201.tif' )],
2496+ []),
2497+
2498+ # Note that it is undefined what we should do for error recovery when
2499+ # there are duplicate parameter names or duplicate parts in a split
2500+ # part. We choose to ignore all duplicate parameters after the first
2501+ # and to take duplicate or missing rfc 2231 parts in apperance order.
2502+ # This is backward compatible with get_param's behavior, but the
2503+ # decisions are arbitrary.
2504+
2505+ 'duplicate_key' : (
2506+ 'filename=abc.gif; filename=def.tiff' ,
2507+ ' filename="abc.gif"' ,
2508+ "filename=abc.gif; filename=def.tiff" ,
2509+ [('filename' , 'abc.gif' )],
2510+ [errors .InvalidHeaderDefect ]),
2511+
2512+ 'duplicate_key_with_split_value' : (
2513+ "filename*0*=iso-8859-1''%32%30%31%2E; filename*1*=%74%69%66;"
2514+ " filename=abc.gif" ,
2515+ ' filename="201.tif"' ,
2516+ "filename*0*=iso-8859-1''%32%30%31%2E; filename*1*=%74%69%66;"
2517+ " filename=abc.gif" ,
2518+ [('filename' , '201.tif' )],
2519+ [errors .InvalidHeaderDefect ]),
2520+
2521+ 'duplicate_key_with_split_value_other_order' : (
2522+ "filename=abc.gif; "
2523+ " filename*0*=iso-8859-1''%32%30%31%2E; filename*1*=%74%69%66" ,
2524+ ' filename="abc.gif"' ,
2525+ "filename=abc.gif;"
2526+ " filename*0*=iso-8859-1''%32%30%31%2E; filename*1*=%74%69%66" ,
2527+ [('filename' , 'abc.gif' )],
2528+ [errors .InvalidHeaderDefect ]),
2529+
2530+ 'duplicate_in_split_value' : (
2531+ "filename*0*=iso-8859-1''%32%30%31%2E; filename*1*=%74%69%66;"
2532+ " filename*1*=abc.gif" ,
2533+ ' filename="201.tifabc.gif"' ,
2534+ "filename*0*=iso-8859-1''%32%30%31%2E; filename*1*=%74%69%66;"
2535+ " filename*1*=abc.gif" ,
2536+ [('filename' , '201.tifabc.gif' )],
2537+ [errors .InvalidHeaderDefect ]),
2538+
2539+ 'missing_split_value' : (
2540+ "filename*0*=iso-8859-1''%32%30%31%2E; filename*3*=%74%69%66;" ,
2541+ ' filename="201.tif"' ,
2542+ "filename*0*=iso-8859-1''%32%30%31%2E; filename*3*=%74%69%66;" ,
2543+ [('filename' , '201.tif' )],
2544+ [errors .InvalidHeaderDefect ]),
2545+
2546+ 'duplicate_and_missing_split_value' : (
2547+ "filename*0*=iso-8859-1''%32%30%31%2E; filename*3*=%74%69%66;"
2548+ " filename*3*=abc.gif" ,
2549+ ' filename="201.tifabc.gif"' ,
2550+ "filename*0*=iso-8859-1''%32%30%31%2E; filename*3*=%74%69%66;"
2551+ " filename*3*=abc.gif" ,
2552+ [('filename' , '201.tifabc.gif' )],
2553+ [errors .InvalidHeaderDefect ]* 2 ),
2554+
2555+ # Here we depart from get_param and assume the *0* was missing.
2556+ 'duplicate_with_broken_split_value' : (
2557+ "filename=abc.gif; "
2558+ " filename*2*=iso-8859-1''%32%30%31%2E; filename*3*=%74%69%66" ,
2559+ ' filename="abc.gif201.tif"' ,
2560+ "filename=abc.gif;"
2561+ " filename*2*=iso-8859-1''%32%30%31%2E; filename*3*=%74%69%66" ,
2562+ [('filename' , 'abc.gif201.tif' )],
2563+ # Defects are apparent missing *0*, and two 'out of sequence'.
2564+ [errors .InvalidHeaderDefect ]* 3 ),
2565+
2566+ }
2567+
24592568@parameterize
24602569class Test_parse_mime_version (TestParserMixin , TestEmailBase ):
24612570
0 commit comments