diff --git a/Cargo.toml b/Cargo.toml index bcafc66..4cfa7d2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ repository = "https://github.com/scm-rs/packageurl.rs" readme = "README.md" keywords = ["purl", "package-url"] categories = ["parser-implementations", "encoding", "development-tools"] -rust-version = "1.82.0" +rust-version = "1.83.0" [dependencies] percent-encoding = "2" diff --git a/src/purl.rs b/src/purl.rs index cc38d6e..cec2ff5 100644 --- a/src/purl.rs +++ b/src/purl.rs @@ -26,8 +26,6 @@ const ENCODE_SET: &AsciiSet = &percent_encoding::CONTROLS .add(b'?') .add(b'{') .add(b'}') - // .add(b'/') - // .add(b':') .add(b';') .add(b'=') .add(b'+') @@ -38,6 +36,8 @@ const ENCODE_SET: &AsciiSet = &percent_encoding::CONTROLS .add(b'^') .add(b'|'); +const NAME_ENCODE_SET: &AsciiSet = &ENCODE_SET.add(b'/'); + /// A Package URL. #[derive(Debug, Clone, PartialEq, Eq)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] @@ -301,13 +301,13 @@ impl Display for PackageUrl<'_> { // Namespace: percent-encode each component if let Some(ref ns) = self.namespace { - for component in ns.split('/').map(|s| s.encode(ENCODE_SET)) { + for component in ns.split('/').map(|s| s.encode(NAME_ENCODE_SET)) { component.fmt(f).and(f.write_str("/"))?; } } // Name: percent-encode the name - self.name.encode(ENCODE_SET).fmt(f)?; + self.name.encode(NAME_ENCODE_SET).fmt(f)?; // Version: percent-encode the version if let Some(ref v) = self.version { @@ -393,11 +393,20 @@ mod tests { #[test] fn test_percent_encoding_idempotent() { - let orig = "pkg:brew/openssl%25401.1@1.1.1w"; + let orig = "pkg:brew/open%2Fssl%25401.1@1.1.1w"; let round_trip = orig.parse::().unwrap().to_string(); assert_eq!(orig, round_trip); } + #[test] + fn test_percent_encoded_name() { + let raw_purl = "pkg:type/name/space/first%2Fname"; + let purl = PackageUrl::from_str(raw_purl).unwrap(); + assert_eq!(purl.ty(), "type"); + assert_eq!(purl.namespace(), Some("name/space")); + assert_eq!(purl.name(), "first/name"); + } + #[test] fn test_percent_encoding_qualifier() { let mut purl = "pkg:deb/ubuntu/gnome-calculator@1:41.1-2ubuntu2"