版博士V2.0程序
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

83 строки
3.5 KiB

  1. "use strict";
  2. var __importDefault = (this && this.__importDefault) || function (mod) {
  3. return (mod && mod.__esModule) ? mod : { "default": mod };
  4. };
  5. Object.defineProperty(exports, "__esModule", { value: true });
  6. const RelativeURL_1 = __importDefault(require("../location/RelativeURL"));
  7. const Response_1 = __importDefault(require("./Response"));
  8. const node_fetch_1 = __importDefault(require("node-fetch"));
  9. const Request_1 = __importDefault(require("./Request"));
  10. const url_1 = require("url");
  11. /**
  12. * Helper class for performing fetch.
  13. */
  14. class FetchHandler {
  15. /**
  16. * Returns resource data asynchronously.
  17. *
  18. * @param document Document.
  19. * @param url URL to resource.
  20. * @param [init] Init.
  21. * @returns Response.
  22. */
  23. static fetch(document, url, init) {
  24. const taskManager = document.defaultView.happyDOM.asyncTaskManager;
  25. const requestInit = { ...init, headers: { ...init?.headers } };
  26. const cookie = document.defaultView.document.cookie;
  27. const referer = document.defaultView.location.origin;
  28. requestInit.headers['user-agent'] = document.defaultView.navigator.userAgent;
  29. // We need set referer to solve anti-hotlinking.
  30. // And the browser will set the referer to the origin of the page.
  31. // Referer is "null" when the URL is set to "about:blank".
  32. // This is also how the browser behaves.
  33. if (referer !== 'null') {
  34. requestInit.headers['referer'] = referer;
  35. }
  36. if (cookie) {
  37. requestInit.headers['set-cookie'] = cookie;
  38. }
  39. let request;
  40. if (typeof url === 'string') {
  41. request = new Request_1.default(RelativeURL_1.default.getAbsoluteURL(document.defaultView.location, url));
  42. }
  43. else if (url instanceof url_1.URL) {
  44. // URLs are always absolute, no need for getAbsoluteURL.
  45. request = new Request_1.default(url);
  46. }
  47. else {
  48. request = new Request_1.default(RelativeURL_1.default.getAbsoluteURL(document.defaultView.location, url.url), {
  49. ...url
  50. });
  51. }
  52. return new Promise((resolve, reject) => {
  53. const taskID = taskManager.startTask();
  54. (0, node_fetch_1.default)(request, requestInit)
  55. .then((response) => {
  56. if (taskManager.getTaskCount() === 0) {
  57. reject(new Error('Failed to complete fetch request. Task was canceled.'));
  58. }
  59. else {
  60. response.constructor['_ownerDocument'] = document;
  61. for (const key of Object.keys(Response_1.default.prototype)) {
  62. if (Response_1.default.prototype.hasOwnProperty(key) && key !== 'constructor') {
  63. if (typeof Response_1.default.prototype[key] === 'function') {
  64. response[key] = Response_1.default.prototype[key].bind(response);
  65. }
  66. else {
  67. response[key] = Response_1.default.prototype[key];
  68. }
  69. }
  70. }
  71. taskManager.endTask(taskID);
  72. resolve(response);
  73. }
  74. })
  75. .catch((error) => {
  76. reject(error);
  77. taskManager.cancelAll(error);
  78. });
  79. });
  80. }
  81. }
  82. exports.default = FetchHandler;
  83. //# sourceMappingURL=FetchHandler.js.map