opentelemetry.io/scripts/get-url-status.mjs

92 lines
2.0 KiB
JavaScript
Executable File

#!/usr/bin/env node
import puppeteer from 'puppeteer';
let verbose = false;
function log(...args) {
if (verbose) console.log(...args);
}
async function getUrlHeadless(url) {
let browser;
log(`Trying headless fetch of ${url}`);
try {
browser = await puppeteer.launch();
const page = await browser.newPage();
const response = await page.goto(url, {
waitUntil: 'networkidle2',
timeout: 9000,
});
if (!response) throw new Error('No response from server.');
const status = response.status();
log(` Headless fetch returned HTTP status code: ${status}`);
return status;
} catch (error) {
console.error(`Error: ${error.message}`);
return null;
} finally {
if (browser) await browser.close();
}
}
async function getUrlInBrowser(url) {
let browser;
try {
browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
const response = await page.goto(url, {
waitUntil: 'networkidle2',
timeout: 30000,
});
if (!response) throw new Error('No response from server.');
const status = response.status();
log(`HTTP status code: ${status}`);
return status;
} catch (error) {
console.error(`Error fetching ${url}:`, error.message);
return null;
} finally {
if (browser) await browser.close();
}
}
export function isHttp2XX(status) {
return status && status >= 200 && status < 300;
}
export async function getUrlStatus(url) {
let status = 0; // await getUrlHeadless(url);
if (!isHttp2XX(status)) {
status = await getUrlInBrowser(url);
}
return status;
}
async function mainCLI() {
const url = process.argv[2];
verbose = true; // process.argv.includes('--verbose');
if (!url) {
console.error(`Usage: ${process.argv[1]} URL`);
process.exit(1);
}
const status = await getUrlStatus(url);
process.exit(isHttp2XX(status) ? 0 : 1);
}
// Only run if script is executed directly (CLI)
if (import.meta.url === `file://${process.argv[1]}`) await mainCLI();