diff --git a/lib/core.js b/lib/core.js index 888b8e986..365a54c20 100644 --- a/lib/core.js +++ b/lib/core.js @@ -1602,7 +1602,7 @@ /* Convert '?_option=value' to { - options: value + option: value } */ var result = {}; @@ -1745,7 +1745,7 @@ providerOptionsValue = options.getProviderOptions(path, defaultValue); } - // `_.` has top priority. + // `_key` has top priority. var value = options.getProviderOptions(alternatePath, providerOptionsValue); if ( @@ -1771,7 +1771,7 @@ const bits = path.split('.'); - const alternatePath = path.replace(/^[^.]+\./, '_'); // "robot.prerender" -> "_.prerender" + const alternatePath = path.replace(/^[^.]+\./, '_'); // "robot.prerender" -> "_prerender" // p1. var value = options.getProviderOptions(alternatePath); diff --git a/lib/fetch.js b/lib/fetch.js index c19d85349..34f09c979 100644 --- a/lib/fetch.js +++ b/lib/fetch.js @@ -416,26 +416,30 @@ class HostAbortController { } const cookiesOptions = [ - 'Domain', - 'Expires', - 'HttpOnly', - 'Max-Age', - 'Partitioned', - 'Path', - 'Secure', - 'SameSite', + 'domain', + 'expires', + 'httponly', + 'max-age', + 'partitioned', + 'path', + 'secure', + 'samesite', ]; +// Keep cookie values verbatim: default decode/encode (decodeURIComponent/encodeURIComponent) +// corrupts base64 values containing '/', '+', '=' on round-trip. +const identity = v => v; + export function extendCookiesJar(uri, jar, headers) { var cookiesValue = headers && headers['set-cookie']; if (cookiesValue) { var cookiesArray = Array.isArray(cookiesValue) ? cookiesValue : [cookiesValue]; try { var cookies = cookiesArray.reduce((allCookies, cookieStr) => { - return { ...allCookies, ...parseCookie(cookieStr) }; + return { ...allCookies, ...parseCookie(cookieStr, { decode: identity }) }; }, {}); // Filter cookies options. - cookies = Object.fromEntries(Object.entries(cookies).filter(([k,v]) => !cookiesOptions.includes(k))); + cookies = Object.fromEntries(Object.entries(cookies).filter(([k,v]) => !cookiesOptions.includes(k.toLowerCase()))); jar = jar || {}; jar = {...jar, ...cookies}; } catch(ex) { @@ -448,7 +452,7 @@ export function extendCookiesJar(uri, jar, headers) { export function setCookieFromJar(uri, headers, jar) { if (jar) { try{ - var cookies = Object.entries(jar).map(([k,v]) => serializeCookie(k, v)).join('; '); + var cookies = Object.entries(jar).map(([k,v]) => serializeCookie(k, v, { encode: identity })).join('; '); headers['Cookie'] = cookies; } catch(ex) { log('Error serialize cookie', uri, ex.message); diff --git a/views/debug.ejs b/views/debug.ejs index c635a1bb7..d999add2c 100644 --- a/views/debug.ejs +++ b/views/debug.ejs @@ -14,7 +14,7 @@ var baseAppUrl = <%- JSON.stringify(CONFIG.baseAppUrl) %>; var REL_GROUPS = <%- JSON.stringify(CONFIG.REL_GROUPS) %>; var DEBUG = <%= JSON.stringify(DEBUG) %>; - var QUERY = <%- JSON.stringify(QUERY) %>; + var QUERY = <%- JSON.stringify(QUERY).replace(/;