fix: route web-probe through YAML proxy
This commit is contained in:
@@ -21,6 +21,7 @@ const sampleIntervalMs = positiveInteger(process.env.UNIDESK_WEB_OBSERVE_SAMPLE_
|
||||
const screenshotIntervalMs = positiveInteger(process.env.UNIDESK_WEB_OBSERVE_SCREENSHOT_INTERVAL_MS, 300000);
|
||||
const maxSamples = positiveInteger(process.env.UNIDESK_WEB_OBSERVE_MAX_SAMPLES, 0);
|
||||
const viewport = parseViewport(process.env.UNIDESK_WEB_OBSERVE_VIEWPORT || "1440x900");
|
||||
const playwrightProxy = proxyConfigFromEnv(baseUrl);
|
||||
const pageId = "page-" + randomBytes(4).toString("hex");
|
||||
const dirs = {
|
||||
commandsPending: path.join(stateDir, "commands", "pending"),
|
||||
@@ -63,7 +64,7 @@ try {
|
||||
const launcher = await import(pathToFileURL(path.resolve("scripts/src/browser-launcher.mjs")).href);
|
||||
const { chromium } = await launcher.importPlaywright();
|
||||
browser = await launcher.launchChromium(chromium);
|
||||
context = await browser.newContext({ viewport });
|
||||
context = await browser.newContext({ viewport, ...(playwrightProxy === null ? {} : { proxy: playwrightProxy }) });
|
||||
auth = await runControlCommand({ id: "startup-login", type: "login", createdAt: startedAt, source: "startup" }, async () => authenticate(context));
|
||||
page = await context.newPage();
|
||||
attachPassiveListeners(page);
|
||||
@@ -109,6 +110,7 @@ async function writeManifest(extra = {}) {
|
||||
stateDir,
|
||||
baseUrl,
|
||||
targetPath,
|
||||
network: publicNetwork(playwrightProxy),
|
||||
pageAuthority: { browser: "chromium", context: "single", pageId, continuityBreaksRecorded: true },
|
||||
pageProvenance: compactPageProvenance(currentPageProvenance),
|
||||
sampling: { mode: "passive", sampleIntervalMs, screenshotIntervalMs, maxSamples, observerInitiatedDefault: false, responseBodyReadDefault: false },
|
||||
@@ -283,6 +285,62 @@ function publicAuth(value) {
|
||||
return { ok: value.ok === true, method: value.method, status: value.status, cookiePresent: value.cookiePresent === true, cookieNames: value.cookieNames || [], valuesRedacted: true };
|
||||
}
|
||||
|
||||
function proxyConfigFromEnv(targetBaseUrl) {
|
||||
let target;
|
||||
try {
|
||||
target = new URL(targetBaseUrl);
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
const noProxy = process.env.NO_PROXY || process.env.no_proxy || "";
|
||||
if (noProxyMatches(target.hostname, noProxy)) return null;
|
||||
const raw = target.protocol === "https:"
|
||||
? process.env.HTTPS_PROXY || process.env.https_proxy || process.env.ALL_PROXY || process.env.all_proxy || process.env.HTTP_PROXY || process.env.http_proxy || ""
|
||||
: process.env.HTTP_PROXY || process.env.http_proxy || process.env.ALL_PROXY || process.env.all_proxy || process.env.HTTPS_PROXY || process.env.https_proxy || "";
|
||||
if (!raw) return null;
|
||||
return { server: raw };
|
||||
}
|
||||
|
||||
function noProxyMatches(hostname, rawList) {
|
||||
const host = String(hostname || "").toLowerCase();
|
||||
if (!host) return false;
|
||||
return String(rawList || "").split(",").some((raw) => {
|
||||
let item = raw.trim().toLowerCase();
|
||||
if (!item) return false;
|
||||
if (item === "*") return true;
|
||||
item = item.replace(/^\*\./u, ".");
|
||||
const portIndex = item.lastIndexOf(":");
|
||||
if (portIndex > -1 && !item.includes("]")) item = item.slice(0, portIndex);
|
||||
if (item.startsWith(".")) return host === item.slice(1) || host.endsWith(item);
|
||||
return host === item;
|
||||
});
|
||||
}
|
||||
|
||||
function publicNetwork(proxy) {
|
||||
return {
|
||||
proxy: proxy === null ? { enabled: false, source: "env", valuesRedacted: true } : {
|
||||
enabled: true,
|
||||
source: "env",
|
||||
server: publicProxyServer(proxy.server),
|
||||
valuesRedacted: true,
|
||||
},
|
||||
valuesRedacted: true,
|
||||
};
|
||||
}
|
||||
|
||||
function publicProxyServer(raw) {
|
||||
try {
|
||||
const parsed = new URL(String(raw || ""));
|
||||
parsed.username = "";
|
||||
parsed.password = "";
|
||||
const value = parsed.toString();
|
||||
if (parsed.pathname === "/" && parsed.search === "" && parsed.hash === "") return value.replace(/\/$/u, "");
|
||||
return value;
|
||||
} catch {
|
||||
return String(raw || "").replace(/\/\/[^/@]+@/u, "//[redacted]@");
|
||||
}
|
||||
}
|
||||
|
||||
async function gotoTarget(rawTarget) {
|
||||
const target = new URL(String(rawTarget || targetPath), baseUrl).toString();
|
||||
const beforeUrl = currentPageUrl();
|
||||
|
||||
Reference in New Issue
Block a user