mirror of
https://github.com/PR0M3TH3AN/bitvid.git
synced 2026-10-27 07:52:24 +00:00
Fix magnet query parsing for values containing '='
This commit is contained in:
1 parent
b2d1cd1383
commit
d10d65634d
2 files changed
+50
-1
No files matched your search
+3
-1
@@ -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;
|
||||||
|
|||||||
@@ -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"
|
||||||
|
);
|
||||||
|
});
|
||||||
Reference in new issue
Block a user