Skip to content

Commit c9b6e77

Browse files
authored
torrent download: add referer (#416)
1 parent a747c6a commit c9b6e77

File tree

3 files changed

+56
-4
lines changed

3 files changed

+56
-4
lines changed

src/util/cors-tricks.ts

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ export function registerCorsCircumventionForWebUis(allWebUis: TorrentWebUI[]): P
55
const oldRuleIds = (await chrome.declarativeNetRequest.getSessionRules())
66
.map(rule => rule.id);
77
const newRules: chrome.declarativeNetRequest.Rule[] = [];
8-
8+
99
allWebUis.forEach((webUi, index) => {
1010
const webUiBaseUrl = webUi.createBaseUrl();
11-
if(webUiBaseUrl) {
11+
if (webUiBaseUrl) {
1212
const rule: chrome.declarativeNetRequest.Rule = {
1313
id: index + 1,
1414
priority: 100,
@@ -35,4 +35,45 @@ export function registerCorsCircumventionForWebUis(allWebUis: TorrentWebUI[]): P
3535
addRules: newRules
3636
});
3737
});
38-
}
38+
}
39+
40+
export function executeMethodWrappedWithReferer<T>(method: () => Promise<T>, url: string, referer: string): Promise<T> {
41+
return new Promise(async (resolve, reject) => {
42+
const refererSetterRuleId = (await chrome.declarativeNetRequest.getDynamicRules()).length + 1;
43+
chrome.declarativeNetRequest.updateDynamicRules({
44+
addRules: [
45+
{
46+
id: refererSetterRuleId,
47+
priority: 100,
48+
action: {
49+
type: "modifyHeaders",
50+
requestHeaders: [
51+
{
52+
header: "Referer",
53+
operation: "set",
54+
value: referer
55+
}
56+
]
57+
},
58+
condition: {
59+
urlFilter: `|${url}*`,
60+
resourceTypes: ["xmlhttprequest"]
61+
}
62+
}
63+
]
64+
}).then(async () => {
65+
try {
66+
resolve(await method());
67+
} catch (error) {
68+
reject(error);
69+
} finally {
70+
chrome.declarativeNetRequest.updateSessionRules({
71+
removeRuleIds: [refererSetterRuleId],
72+
});
73+
}
74+
}, (error) => {
75+
console.error("Failed to add referer rule", error);
76+
reject(error);
77+
});
78+
});
79+
}

src/util/download.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import { getTorrentNameFromMagnetLink, getTorrentNameFromLink, parseFilesFromDec
33
import { convertBlobToString } from "./converter";
44
import bencode from "bencode";
55
import { Buffer } from "buffer";
6+
import { executeMethodWrappedWithReferer } from "./cors-tricks";
7+
import { getBaseUrl } from "./utils";
68

79
export async function downloadTorrent(url: string): Promise<Torrent> {
810
return new Promise<Torrent>(async (resolve, reject) => {
@@ -11,7 +13,7 @@ export async function downloadTorrent(url: string): Promise<Torrent> {
1113
} else {
1214
let response: Response;
1315
try {
14-
response = await fetch(url);
16+
response = await executeMethodWrappedWithReferer(() => fetch(url), url, getBaseUrl(url));
1517
if (!response.ok) {
1618
reject(new Error(`Status not OK: ${response.status} ${response.statusText}`));
1719
}

src/util/utils.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,15 @@ export function isMatchedByRegexes(url: string, regexes: RegExp[]): boolean {
1515
return regexes.some(regex => regex.test(url));
1616
}
1717

18+
export function getBaseUrl(url: string): string {
19+
try {
20+
const u = new URL(url);
21+
return u.origin;
22+
} catch (e) {
23+
return '';
24+
}
25+
}
26+
1827
export function addTrailingSlash(url: string): string {
1928
if (!url.endsWith("/")) {
2029
return url + "/";

0 commit comments

Comments
 (0)