Fix magnet query parsing for values containing '='

This commit is contained in:
thePR0M3TH3AN committed 2026-02-09 23:22:49 -05:00
1 parent b2d1cd1383
commit d10d65634d
2 files changed
+50 -1

No files matched your search

+3 -1
View File
@@ -223,7 +223,9 @@ export function normalizeMagnetInput(rawValue) {
const params = []; const params = [];
for (const rawParam of rawParams) { for (const rawParam of rawParams) {
const [rawKey, rawVal = ""] = rawParam.split("=", 2); const separatorIndex = rawParam.indexOf("=");
const rawKey = separatorIndex === -1 ? rawParam : rawParam.slice(0, separatorIndex);
const rawVal = separatorIndex === -1 ? "" : rawParam.slice(separatorIndex + 1);
const key = rawKey.trim(); const key = rawKey.trim();
if (!key) { if (!key) {
continue; continue;
+47
View File
@@ -254,3 +254,50 @@ test("normalizeAndAugmentMagnet keeps unchanged xt/tr/ws/xs params singular", ()
"Inbound xs hint should remain singular" "Inbound xs hint should remain singular"
); );
}); });
test("normalizeMagnetInput preserves parameter values containing additional equals signs", () => {
const infoHash = "0123456789abcdef0123456789abcdef01234567";
const rawMagnet =
`magnet:?xt=urn:btih:${infoHash}` +
"&ws=https://cdn.example.com/video.mp4%3FX-Amz-Signature=abc123==%26X-Amz-Credential=test%3Dvalue" +
"&xs=https://cdn.example.com/video.torrent%3Ftoken=ZXlKaGJHY2lPaUpJVXpJMU5pSjkuZXlKcFpDST0=%26policy=a%3Db" +
"&dn=Episode=01=Directors=Cut" +
"&foo=bar=baz==";
const normalized = normalizeMagnetInput(rawMagnet);
const valuesByKey = Object.fromEntries(
normalized.params.map((param) => [param.lowerKey, param.value])
);
assert.equal(
valuesByKey.ws,
"https://cdn.example.com/video.mp4%3FX-Amz-Signature=abc123==%26X-Amz-Credential=test%3Dvalue",
"ws should keep the full signed URL token"
);
assert.equal(
valuesByKey.xs,
"https://cdn.example.com/video.torrent%3Ftoken=ZXlKaGJHY2lPaUpJVXpJMU5pSjkuZXlKcFpDST0=%26policy=a%3Db",
"xs should keep base64-like payloads and nested query params intact"
);
assert.equal(
valuesByKey.dn,
"Episode=01=Directors=Cut",
"dn should preserve all '=' characters"
);
assert.equal(
valuesByKey.foo,
"bar=baz==",
"Unknown params should preserve all '=' characters"
);
const rebuilt = buildMagnetUri(
normalized.normalizedScheme,
normalized.params,
normalized.fragment
);
assert.equal(
rebuilt,
rawMagnet,
"buildMagnetUri should reproduce multi-equals values verbatim"
);
});