Добрый день! Делаю прокси для Яндекс браузера. Сам рабочий прокси сделать получилось, но никак не могу настроить вайтлист для доменов так, чтобы домены вне вайтлиста не рестриктились и проходили через сеть клиента.
В JS и работой в серверах я не силен от слова совсем, после часового диалога с gpt, подозреваю, что я неверно настроил pac-файл или сам vps. Буду дико благодарен за помощь. Если нужна дополнительная информация - пишите, сразу отправлю.
proxy.pac
function FindProxyForURL(url, host) {
const whitelist = [
"whoer.net",
"google.com"
];
for (let i = 0; i < whitelist.length; i++) {
if (dnsDomainIs(host, whitelist[i])) {
return "HTTPS proxyhost:0000"; // Прокси-сервер и порт
}
}
return "DIRECT";
}
background.js:
chrome.runtime.onInstalled.addListener(() => {
console.log("Proxy extension installed.");
});
function setProxyWithPac(pacUrl) {
chrome.proxy.settings.set(
{
value: {
mode: "pac_script",
pacScript: {
url: pacUrl
}
},
scope: "regular"
},
() => {
console.log(`PAC script set to ${pacUrl}`);
}
);
}
const pacUrl = chrome.runtime.getURL("proxy.pac");
setProxyWithPac(pacUrl);
function clearProxy() {
chrome.proxy.settings.clear({ scope: "regular" }, () => {
console.log("Proxy settings cleared.");
});
}
popup.js
const proxyHost = "proxyhost";
const proxyPort = 0000;
const proxyButton = document.getElementById("proxyButton");
function updateButtonState(isConnected) {
if (isConnected) {
proxyButton.textContent = "Disconnect";
proxyButton.dataset.state = "connected";
} else {
proxyButton.textContent = "Connect";
proxyButton.dataset.state = "disconnected";
}
}
function getProxyStatus(callback) {
chrome.proxy.settings.get({ incognito: false }, (details) => {
const isConnected =
details.value &&
details.value.rules &&
details.value.rules.singleProxy &&
details.value.rules.singleProxy.host === proxyHost &&
details.value.rules.singleProxy.port === proxyPort;
callback(isConnected);
});
}
function setProxy() {
chrome.proxy.settings.set(
{
value: {
mode: "fixed_servers",
rules: {
singleProxy: {
scheme: "https",
host: proxyHost,
port: proxyPort
}
}
},
scope: "regular"
},
() => {
updateButtonState(true);
}
);
}
function clearProxy() {
chrome.proxy.settings.clear({ scope: "regular" }, () => {
updateButtonState(false);
});
}
proxyButton.addEventListener("click", () => {
if (proxyButton.dataset.state === "disconnected") {
setProxy();
} else if (proxyButton.dataset.state === "connected") {
clearProxy();
}
});
document.addEventListener("DOMContentLoaded", () => {
proxyButton.textContent = "Загрузка...";
proxyButton.disabled = true;
getProxyStatus((isConnected) => {
updateButtonState(isConnected);
proxyButton.disabled = false;
});
});