index.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. var __defProp = Object.defineProperty;
  2. var __defProps = Object.defineProperties;
  3. var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
  4. var __getOwnPropSymbols = Object.getOwnPropertySymbols;
  5. var __hasOwnProp = Object.prototype.hasOwnProperty;
  6. var __propIsEnum = Object.prototype.propertyIsEnumerable;
  7. var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  8. var __spreadValues = (a, b) => {
  9. for (var prop in b || (b = {}))
  10. if (__hasOwnProp.call(b, prop))
  11. __defNormalProp(a, prop, b[prop]);
  12. if (__getOwnPropSymbols)
  13. for (var prop of __getOwnPropSymbols(b)) {
  14. if (__propIsEnum.call(b, prop))
  15. __defNormalProp(a, prop, b[prop]);
  16. }
  17. return a;
  18. };
  19. var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
  20. var __async = (__this, __arguments, generator) => {
  21. return new Promise((resolve, reject) => {
  22. var fulfilled = (value) => {
  23. try {
  24. step(generator.next(value));
  25. } catch (e) {
  26. reject(e);
  27. }
  28. };
  29. var rejected = (value) => {
  30. try {
  31. step(generator.throw(value));
  32. } catch (e) {
  33. reject(e);
  34. }
  35. };
  36. var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
  37. step((generator = generator.apply(__this, __arguments)).next());
  38. });
  39. };
  40. import * as tough from "tough-cookie";
  41. import { splitCookiesString } from "set-cookie-parser";
  42. function isDomainOrSubdomain(destination, original) {
  43. const orig = new URL(original).hostname;
  44. const dest = new URL(destination).hostname;
  45. return orig === dest || orig.endsWith(`.${dest}`);
  46. }
  47. const referrerPolicy = /* @__PURE__ */ new Set([
  48. "",
  49. "no-referrer",
  50. "no-referrer-when-downgrade",
  51. "same-origin",
  52. "origin",
  53. "strict-origin",
  54. "origin-when-cross-origin",
  55. "strict-origin-when-cross-origin",
  56. "unsafe-url"
  57. ]);
  58. function parseReferrerPolicy(policyHeader) {
  59. const policyTokens = policyHeader.split(/[,\s]+/);
  60. let policy = "";
  61. for (const token of policyTokens) {
  62. if (token !== "" && referrerPolicy.has(token)) {
  63. policy = token;
  64. }
  65. }
  66. return policy;
  67. }
  68. function doNothing(init, name) {
  69. }
  70. function callDeleteMethod(init, name) {
  71. init.headers.delete(name);
  72. }
  73. function deleteFromObject(init, name) {
  74. const headers = init.headers;
  75. for (const key of Object.keys(headers)) {
  76. if (key.toLowerCase() === name) {
  77. delete headers[key];
  78. }
  79. }
  80. }
  81. function identifyDeleteHeader(init) {
  82. if (init.headers == null) {
  83. return doNothing;
  84. }
  85. if (typeof init.headers.delete === "function") {
  86. return callDeleteMethod;
  87. }
  88. return deleteFromObject;
  89. }
  90. const redirectStatus = /* @__PURE__ */ new Set([301, 302, 303, 307, 308]);
  91. function isRedirect(status) {
  92. return redirectStatus.has(status);
  93. }
  94. function handleRedirect(fetchImpl, init, response) {
  95. return __async(this, null, function* () {
  96. var _a, _b, _c;
  97. switch ((_a = init.redirect) != null ? _a : "follow") {
  98. case "error":
  99. throw new TypeError(`URI requested responded with a redirect and redirect mode is set to error: ${response.url}`);
  100. case "manual":
  101. return response;
  102. case "follow":
  103. break;
  104. default:
  105. throw new TypeError(`Invalid redirect option: ${init.redirect}`);
  106. }
  107. const locationUrl = response.headers.get("location");
  108. if (locationUrl === null) {
  109. return response;
  110. }
  111. const requestUrl = response.url;
  112. const redirectUrl = new URL(locationUrl, requestUrl).toString();
  113. const redirectCount = (_b = init.redirectCount) != null ? _b : 0;
  114. const maxRedirect = (_c = init.maxRedirect) != null ? _c : 20;
  115. if (redirectCount >= maxRedirect) {
  116. throw new TypeError(`Reached maximum redirect of ${maxRedirect} for URL: ${requestUrl}`);
  117. }
  118. init = __spreadProps(__spreadValues({}, init), {
  119. redirectCount: redirectCount + 1
  120. });
  121. const deleteHeader = identifyDeleteHeader(init);
  122. if (!isDomainOrSubdomain(requestUrl, redirectUrl)) {
  123. for (const name of ["authorization", "www-authenticate", "cookie", "cookie2"]) {
  124. deleteHeader(init, name);
  125. }
  126. }
  127. const maybeNodeStreamBody = init.body;
  128. const maybeStreamBody = init.body;
  129. if (response.status !== 303 && init.body != null && (typeof maybeNodeStreamBody.pipe === "function" || typeof maybeStreamBody.pipeTo === "function")) {
  130. throw new TypeError("Cannot follow redirect with body being a readable stream");
  131. }
  132. if (response.status === 303 || (response.status === 301 || response.status === 302) && init.method === "POST") {
  133. init.method = "GET";
  134. init.body = void 0;
  135. deleteHeader(init, "content-length");
  136. }
  137. if (response.headers.has("referrer-policy")) {
  138. init.referrerPolicy = parseReferrerPolicy(response.headers.get("referrer-policy"));
  139. }
  140. return yield fetchImpl(redirectUrl, init);
  141. });
  142. }
  143. function addCookiesToRequest(input, init, cookie) {
  144. if (cookie === "") {
  145. return init;
  146. }
  147. const maybeRequest = input;
  148. const maybeHeaders = init.headers;
  149. if (maybeRequest.headers && typeof maybeRequest.headers.append === "function") {
  150. maybeRequest.headers.append("cookie", cookie);
  151. } else if (maybeHeaders && typeof maybeHeaders.append === "function") {
  152. maybeHeaders.append("cookie", cookie);
  153. } else {
  154. init = __spreadProps(__spreadValues({}, init), { headers: __spreadProps(__spreadValues({}, init.headers), { cookie }) });
  155. }
  156. return init;
  157. }
  158. function getCookiesFromResponse(response) {
  159. const maybeNodeFetchHeaders = response.headers;
  160. if (typeof maybeNodeFetchHeaders.getAll === "function") {
  161. return maybeNodeFetchHeaders.getAll("set-cookie");
  162. }
  163. if (typeof maybeNodeFetchHeaders.raw === "function") {
  164. const headers = maybeNodeFetchHeaders.raw();
  165. if (Array.isArray(headers["set-cookie"])) {
  166. return headers["set-cookie"];
  167. }
  168. return [];
  169. }
  170. const cookieString = response.headers.get("set-cookie");
  171. if (cookieString !== null) {
  172. return splitCookiesString(cookieString);
  173. }
  174. return [];
  175. }
  176. function fetchCookie(fetch, jar, ignoreError = true) {
  177. const actualFetch = fetch;
  178. const actualJar = jar != null ? jar : new tough.CookieJar();
  179. function fetchCookieWrapper(input, init) {
  180. return __async(this, null, function* () {
  181. var _a, _b;
  182. const originalInit = init != null ? init : {};
  183. init = __spreadProps(__spreadValues({}, init), { redirect: "manual" });
  184. const requestUrl = typeof input === "string" ? input : (_a = input.url) != null ? _a : input.href;
  185. const cookie = yield actualJar.getCookieString(requestUrl);
  186. init = addCookiesToRequest(input, init, cookie);
  187. const response = yield actualFetch(input, init);
  188. const cookies = getCookiesFromResponse(response);
  189. yield Promise.all(cookies.map((cookie2) => __async(this, null, function* () {
  190. return yield actualJar.setCookie(cookie2, response.url, { ignoreError });
  191. })));
  192. if (((_b = init.redirectCount) != null ? _b : 0) > 0) {
  193. Object.defineProperty(response, "redirected", { value: true });
  194. }
  195. if (!isRedirect(response.status)) {
  196. return response;
  197. }
  198. return yield handleRedirect(fetchCookieWrapper, originalInit, response);
  199. });
  200. }
  201. fetchCookieWrapper.toughCookie = tough;
  202. return fetchCookieWrapper;
  203. }
  204. fetchCookie.toughCookie = tough;
  205. export {
  206. fetchCookie as default
  207. };