46 lines
1.3 KiB
JavaScript
46 lines
1.3 KiB
JavaScript
import _fetch from "flumm-fetch";
|
|
import CookieJar from "./cookie-jar.mjs";
|
|
import Cookie from "./cookie.mjs";
|
|
import {CookieParseError} from "./errors.mjs";
|
|
|
|
const redirectStatus = new Set([301, 302, 303, 307, 308]);
|
|
|
|
const cookieJar = new CookieJar();
|
|
|
|
export default async function fetch(url, options) {
|
|
let cookies = [...cookieJar.cookiesValidForRequest(url)]
|
|
.map(c => c.serialize())
|
|
.join("; ");
|
|
|
|
if (cookies) {
|
|
if (!options) options = {};
|
|
if (!options.headers) options.headers = {};
|
|
options.headers.cookie = cookies;
|
|
}
|
|
|
|
const wantFollow =
|
|
!options || !options.redirect || options.redirect === "follow";
|
|
if (wantFollow) {
|
|
if (!options) options = {};
|
|
options.redirect = "manual";
|
|
}
|
|
|
|
const result = await _fetch(url, options);
|
|
|
|
cookies = result.headers["set-cookie"] || [];
|
|
cookies.forEach(c => cookieJar.addCookie(c, url));
|
|
|
|
// delete expired cookies after each request
|
|
cookieJar.deleteExpired(false);
|
|
|
|
if (wantFollow && redirectStatus.has(result.status)) {
|
|
const location = result.headers.get("Location");
|
|
options.redirect = "follow";
|
|
return fetch(location, options);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
export {cookieJar, CookieJar, Cookie, CookieParseError};
|