Feature http headers (#276)

Implement feature flag to pass headers to Puppeteer via "headers" option.

Also, add feature flag to set headless mode via "headless" option.

Update headless behavior to sync with puppeteer API change. See: https://developer.chrome.com/articles/new-headless/#new-headless-in-puppeteer
This commit is contained in:
David DeMoss 2023-05-22 11:40:03 -05:00 committed by GitHub
parent 382b7e4f14
commit 21a8d2687b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -102,6 +102,16 @@ parser.script('decktape').options({
transform : parseRange,
help : 'Range of slides to be exported, a combination of slide indexes and ranges (e.g. \'1-3,5,8\')',
},
headless : {
default : 'new', // false to enable headed mode and true to enable old puppeteer headless. See: https://developer.chrome.com/articles/new-headless/#new-headless-in-puppeteer
help : 'Control headless mode puppeteer.',
},
headers : {
type : 'string',
callback : parseHeaders,
transform : parseHeaders,
help : 'Add headers to puppetter page instance. Comma deliminated list of strings. <header>,<value>. E.g. -headers "Authorization,\'Bearer ASDJASLKJALKSJDL\'"',
},
// Chrome options
chromePath : {
full : 'chrome-path',
@ -137,6 +147,18 @@ parser.script('decktape').options({
},
});
function parseHeaders(headerString) {
const h = headerString.split(",")
if ((h.length % 2) != 0) {
return 'header flag must be a comma delimited key value pairing and should always have an even number of kv pairs'
}
let headers = {}
for (let i = 0; i < h.length; i += 2) {
headers[h[i]] = h[i+1]
}
return headers
}
function parseSize(size) {
// we may want to support height and width labeled with units
// /^(\d+(?:px)?|\d+(?:\.\d+)?(?:in|cm|mm)?)\s?x\s?(\d+(?:px)?|\d+(?:\.\d+)?(?:in|cm|mm)?)$/
@ -230,13 +252,15 @@ process.on('unhandledRejection', error => {
const options = parser.parse(process.argv.slice(2));
const browser = await puppeteer.launch({
headless : 'new',
headless : options.headless,
// TODO: add a verbose option
// dumpio : true,
executablePath : options.chromePath,
args : options.chromeArgs,
});
const page = await browser.newPage();
if (options.headers)
page.setExtraHTTPHeaders(options.headers)
await page.emulateMediaType('screen');
const pdf = await PDFDocument.create();
pdf.setCreator('Decktape');