From e2c8b33e767580502dfa426e3063bc79bad49e3e Mon Sep 17 00:00:00 2001 From: artrixdotdev Date: Sat, 25 Oct 2025 19:50:05 -0700 Subject: [PATCH 1/2] refactor: Improve `MagnetUri` field types for spec compliance --- crates/libtortillas/src/metainfo/magnet.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/crates/libtortillas/src/metainfo/magnet.rs b/crates/libtortillas/src/metainfo/magnet.rs index 2bd8d33..9e3c901 100644 --- a/crates/libtortillas/src/metainfo/magnet.rs +++ b/crates/libtortillas/src/metainfo/magnet.rs @@ -19,7 +19,7 @@ pub struct MagnetUri { pub name: String, #[serde(rename = "xl")] - pub length: Option, + pub length: Option, #[serde(rename = "tr")] pub announce_list: Option>, @@ -27,11 +27,11 @@ pub struct MagnetUri { #[serde(rename = "ws", default)] pub web_seed: Vec, - #[serde(rename = "as")] - pub source: Option, + #[serde(rename = "as", default)] + pub source: Vec, - #[serde(rename = "xs")] - pub exact_source: Option, + #[serde(rename = "xs", default)] + pub exact_source: Vec, #[serde(rename = "kt")] pub keywords: Option>, @@ -42,8 +42,8 @@ pub struct MagnetUri { #[serde(rename = "so")] pub select_only: Option>, - #[serde(rename = "x.pe")] - pub peer: Option, + #[serde(rename = "x.pe", default)] + pub peer: Vec, #[serde(skip)] uri: String, From 89453f8656e6b75796f9eb1612b2c2119f30f6ad Mon Sep 17 00:00:00 2001 From: artrixdotdev Date: Sat, 25 Oct 2025 20:42:27 -0700 Subject: [PATCH 2/2] test: Add test coverage for multi-valued magnet parameters --- crates/libtortillas/src/metainfo/magnet.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/crates/libtortillas/src/metainfo/magnet.rs b/crates/libtortillas/src/metainfo/magnet.rs index 9e3c901..3cac1f0 100644 --- a/crates/libtortillas/src/metainfo/magnet.rs +++ b/crates/libtortillas/src/metainfo/magnet.rs @@ -127,4 +127,15 @@ mod tests { _ => panic!("Expected Torrent"), } } + + #[tokio::test] + #[traced_test] + async fn test_parse_magnet_uri_multi_valued_params() { + let uri = "magnet:?xt=urn:btih:xyz&as=seed1&as=seed2&xs=exact1&xs=exact2&x.pe=peer1&x.pe=peer2&dn=name"; + let magnet = MagnetUri::try_from(uri.to_string()).unwrap(); + + assert_eq!(magnet.source.len(), 2); + assert_eq!(magnet.exact_source.len(), 2); + assert_eq!(magnet.peer.len(), 2); + } }