Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 43 additions & 1 deletion lib/interceptor/cache.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,23 @@ const CacheRevalidationHandler = require('../handler/cache-revalidation-handler'
const { assertCacheStore, assertCacheMethods, makeCacheKey, normalizeHeaders, parseCacheControlHeader } = require('../util/cache.js')
const { AbortError } = require('../core/errors.js')

/**
* @param {(string | RegExp)[] | undefined} origins
* @param {string} name
*/
function assertCacheOrigins (origins, name) {
if (origins === undefined) return
if (!Array.isArray(origins)) {
throw new TypeError(`expected ${name} to be an array or undefined, got ${typeof origins}`)
}
for (let i = 0; i < origins.length; i++) {
const origin = origins[i]
if (typeof origin !== 'string' && !(origin instanceof RegExp)) {
throw new TypeError(`expected ${name}[${i}] to be a string or RegExp, got ${typeof origin}`)
}
}
}

const nop = () => {}

/**
Expand Down Expand Up @@ -372,7 +389,8 @@ module.exports = (opts = {}) => {
store = new MemoryCacheStore(),
methods = ['GET'],
cacheByDefault = undefined,
type = 'shared'
type = 'shared',
origins = undefined
} = opts

if (typeof opts !== 'object' || opts === null) {
Expand All @@ -381,6 +399,7 @@ module.exports = (opts = {}) => {

assertCacheStore(store, 'opts.store')
assertCacheMethods(methods, 'opts.methods')
assertCacheOrigins(origins, 'opts.origins')

if (typeof cacheByDefault !== 'undefined' && typeof cacheByDefault !== 'number') {
throw new TypeError(`expected opts.cacheByDefault to be number or undefined, got ${typeof cacheByDefault}`)
Expand All @@ -406,6 +425,29 @@ module.exports = (opts = {}) => {
return dispatch(opts, handler)
}

// Check if origin is in whitelist
if (origins !== undefined) {
const requestOrigin = opts.origin.toString().toLowerCase()
let isAllowed = false

for (let i = 0; i < origins.length; i++) {
const allowed = origins[i]
if (typeof allowed === 'string') {
if (allowed.toLowerCase() === requestOrigin) {
isAllowed = true
break
}
} else if (allowed.test(requestOrigin)) {
isAllowed = true
break
}
}

if (!isAllowed) {
return dispatch(opts, handler)
}
}

opts = {
...opts,
headers: normalizeHeaders(opts)
Expand Down
Loading
Loading