@@ -2612,3 +2612,68 @@ fn version_encoding() {
26122612 "Incorrect qualifiers for canonicalized PURL"
26132613 ) ;
26142614}
2615+ #[ test]
2616+ /// ampersand in qualifier value
2617+ fn ampersand_in_qualifier_value ( ) {
2618+ let parsed = {
2619+ assert ! (
2620+ matches!(
2621+ Purl :: from_str( "pkg:generic/name?qualifier=v%26lue" ) ,
2622+ Err ( PackageError :: UnsupportedType )
2623+ ) ,
2624+ "Type {} is not supported" ,
2625+ "generic"
2626+ ) ;
2627+ match GenericPurl :: < String > :: from_str ( "pkg:generic/name?qualifier=v%26lue" ) {
2628+ Ok ( purl) => purl,
2629+ Err ( error) => {
2630+ panic ! (
2631+ "Failed to parse valid purl {:?}: {}" ,
2632+ "pkg:generic/name?qualifier=v%26lue" , error
2633+ )
2634+ } ,
2635+ }
2636+ } ;
2637+ assert_eq ! ( "generic" , parsed. package_type( ) , "Incorrect package type" ) ;
2638+ assert_eq ! ( None , parsed. namespace( ) , "Incorrect namespace" ) ;
2639+ assert_eq ! ( "name" , parsed. name( ) , "Incorrect name" ) ;
2640+ assert_eq ! ( None , parsed. version( ) , "Incorrect version" ) ;
2641+ assert_eq ! ( None , parsed. subpath( ) , "Incorrect subpath" ) ;
2642+ assert_eq ! (
2643+ [ ( "qualifier" , "v&lue" ) ] . into_iter( ) . collect:: <HashMap <& str , & str >>( ) ,
2644+ parsed. qualifiers( ) . iter( ) . map( |( k, v) | ( k. as_str( ) , v) ) . collect:: <HashMap <& str , & str >>( ) ,
2645+ "Incorrect qualifiers"
2646+ ) ;
2647+ let canonicalized = parsed. to_string ( ) ;
2648+ assert_eq ! (
2649+ "pkg:generic/name?qualifier=v%26lue" , canonicalized,
2650+ "Incorrect string representation"
2651+ ) ;
2652+ let parsed_canonical = match GenericPurl :: < String > :: from_str ( & canonicalized) {
2653+ Ok ( purl) => purl,
2654+ Err ( error) => {
2655+ panic ! (
2656+ "Failed to parse valid purl {:?}: {}" ,
2657+ "pkg:generic/name?qualifier=v%26lue" , error
2658+ )
2659+ } ,
2660+ } ;
2661+ assert_eq ! (
2662+ "generic" ,
2663+ parsed_canonical. package_type( ) ,
2664+ "Incorrect package type for canonicalized PURL"
2665+ ) ;
2666+ assert_eq ! ( None , parsed_canonical. namespace( ) , "Incorrect namespace for canonicalized PURL" ) ;
2667+ assert_eq ! ( "name" , parsed_canonical. name( ) , "Incorrect name for canonicalized PURL" ) ;
2668+ assert_eq ! ( None , parsed_canonical. version( ) , "Incorrect version for canonicalized PURL" ) ;
2669+ assert_eq ! ( None , parsed_canonical. subpath( ) , "Incorrect subpath for canonicalized PURL" ) ;
2670+ assert_eq ! (
2671+ [ ( "qualifier" , "v&lue" ) ] . into_iter( ) . collect:: <HashMap <& str , & str >>( ) ,
2672+ parsed_canonical
2673+ . qualifiers( )
2674+ . iter( )
2675+ . map( |( k, v) | ( k. as_str( ) , v) )
2676+ . collect:: <HashMap <& str , & str >>( ) ,
2677+ "Incorrect qualifiers for canonicalized PURL"
2678+ ) ;
2679+ }
0 commit comments