You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.7 KiB
55 lines
1.7 KiB
var denodeify = require('es6-denodeify')(Promise)
|
|
var tough = require('tough-cookie')
|
|
|
|
module.exports = function fetchCookieDecorator (fetch, jar) {
|
|
fetch = fetch || window.fetch
|
|
jar = jar || new tough.CookieJar()
|
|
|
|
var getCookieString = denodeify(jar.getCookieString.bind(jar))
|
|
var setCookie = denodeify(jar.setCookie.bind(jar))
|
|
|
|
async function fetchCookie (url, opts) {
|
|
opts = opts || {}
|
|
|
|
// Prepare request
|
|
const cookie = await getCookieString(url)
|
|
|
|
if (url.headers && typeof url.headers.append === 'function') {
|
|
url.headers.append('cookie', cookie)
|
|
} else if (opts.headers && typeof opts.headers.append === 'function') {
|
|
opts.headers.append('cookie', cookie)
|
|
} else {
|
|
opts.headers = Object.assign(
|
|
opts.headers || {},
|
|
cookie ? { cookie: cookie } : {}
|
|
)
|
|
}
|
|
|
|
// Actual request
|
|
const res = await fetch(url, opts)
|
|
|
|
// Get cookie header
|
|
var cookies = []
|
|
if (res.headers.getAll) {
|
|
// node-fetch v1
|
|
cookies = res.headers.getAll('set-cookie')
|
|
// console.warn("You are using a fetch version that supports 'Headers.getAll' which is deprecated!")
|
|
// console.warn("In the future 'fetch-cookie-v2' may discontinue supporting that fetch implementation.")
|
|
// console.warn('Details: https://developer.mozilla.org/en-US/docs/Web/API/Headers/getAll')
|
|
} else {
|
|
// node-fetch v2
|
|
const headers = res.headers.raw()
|
|
if (headers['set-cookie'] !== undefined) {
|
|
cookies = headers['set-cookie']
|
|
}
|
|
}
|
|
|
|
// Store all present cookies
|
|
await Promise.all(cookies.map((cookie) => setCookie(cookie, res.url)))
|
|
|
|
return res
|
|
}
|
|
|
|
return fetchCookie
|
|
}
|