@duyquangnvx/webnovel-downloader 0.4.1 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -551,7 +551,10 @@ var EventBus = class {
551
551
  // src/http/client.ts
552
552
  var import_undici = require("undici");
553
553
  init_errors();
554
+ init_primitives();
554
555
  var DEFAULT_TIMEOUT_MS = 3e4;
556
+ var MAX_REDIRECTS = 5;
557
+ var REDIRECT_STATUSES = /* @__PURE__ */ new Set([301, 302, 303, 307, 308]);
555
558
  var UndiciHttpClient = class {
556
559
  #logger;
557
560
  #dispatcher;
@@ -566,23 +569,28 @@ var UndiciHttpClient = class {
566
569
  const half = Math.max(1, Math.floor(timeoutMs / 2));
567
570
  let res;
568
571
  try {
569
- res = await (0, import_undici.request)(url, {
570
- method: "GET",
571
- dispatcher: this.#dispatcher,
572
- ...opts?.headers !== void 0 ? { headers: opts.headers } : {},
573
- ...opts?.signal !== void 0 ? { signal: opts.signal } : {},
574
- headersTimeout: half,
575
- bodyTimeout: half,
576
- maxRedirections: 5
577
- });
572
+ let currentUrl = url;
573
+ for (let hop = 0; ; hop++) {
574
+ res = await (0, import_undici.request)(currentUrl, {
575
+ method: "GET",
576
+ dispatcher: this.#dispatcher,
577
+ ...opts?.headers !== void 0 ? { headers: opts.headers } : {},
578
+ ...opts?.signal !== void 0 ? { signal: opts.signal } : {},
579
+ headersTimeout: half,
580
+ bodyTimeout: half
581
+ });
582
+ const next = hop < MAX_REDIRECTS ? redirectTarget(res.statusCode, res.headers, currentUrl) : void 0;
583
+ if (next === void 0) break;
584
+ await res.body.dump();
585
+ currentUrl = next;
586
+ }
578
587
  const body = await res.body.text();
579
588
  const headers = normalizeHeaders(res.headers);
580
- const finalUrl = url;
581
589
  return {
582
590
  status: res.statusCode,
583
591
  headers,
584
592
  body,
585
- url: finalUrl
593
+ url: currentUrl
586
594
  };
587
595
  } catch (cause) {
588
596
  if (res !== void 0) await res.body.dump().catch(() => {
@@ -603,6 +611,17 @@ var UndiciHttpClient = class {
603
611
  if (this.#ownsDispatcher) await this.#dispatcher.close();
604
612
  }
605
613
  };
614
+ function redirectTarget(status, headers, currentUrl) {
615
+ if (!REDIRECT_STATUSES.has(status)) return void 0;
616
+ const raw = headers["location"];
617
+ const location = Array.isArray(raw) ? raw[0] : raw;
618
+ if (location === void 0 || location === "") return void 0;
619
+ try {
620
+ return unsafeBrandUrl(new URL(location, currentUrl).href);
621
+ } catch {
622
+ return void 0;
623
+ }
624
+ }
606
625
  function normalizeHeaders(h) {
607
626
  const out = {};
608
627
  for (const [k, v] of Object.entries(h)) {