requests.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /*
  2. * Copyright 2010-2020 Gildas Lormeau
  3. * contact : gildas.lormeau <at> gmail.com
  4. *
  5. * This file is part of SingleFile.
  6. *
  7. * The code in this file is free software: you can redistribute it and/or
  8. * modify it under the terms of the GNU Affero General Public License
  9. * (GNU AGPL) as published by the Free Software Foundation, either version 3
  10. * of the License, or (at your option) any later version.
  11. *
  12. * The code in this file is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero
  15. * General Public License for more details.
  16. *
  17. * As additional permission under GNU AGPL version 3 section 7, you may
  18. * distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU
  19. * AGPL normally required by section 4, provided you include this license
  20. * notice and a URL through which recipients can access the Corresponding
  21. * Source.
  22. */
  23. /* global browser, singlefile, */
  24. singlefile.extension.core.bg.requests = (() => {
  25. const REQUEST_ID_HEADER_NAME = "x-single-file-request-id";
  26. const referrers = new Map();
  27. let referrerOnErrorEnabled = false;
  28. return {
  29. REQUEST_ID_HEADER_NAME,
  30. onMessage(message) {
  31. if (message.method.endsWith(".enableReferrerOnError")) {
  32. enableReferrerOnError();
  33. return {};
  34. }
  35. if (message.method.endsWith(".disableReferrerOnError")) {
  36. disableReferrerOnError();
  37. return {};
  38. }
  39. },
  40. setReferrer(requestId, referrer) {
  41. referrers.set(requestId, referrer);
  42. },
  43. enableReferrerOnError
  44. };
  45. function injectRefererHeader(details) {
  46. if (referrerOnErrorEnabled) {
  47. let requestIdHeader = details.requestHeaders.find(header => header.name === REQUEST_ID_HEADER_NAME);
  48. if (requestIdHeader) {
  49. details.requestHeaders = details.requestHeaders.filter(header => header.name !== REQUEST_ID_HEADER_NAME);
  50. const referrer = referrers.get(requestIdHeader.value);
  51. if (referrer) {
  52. referrers.delete(requestIdHeader.value);
  53. let header = details.requestHeaders.find(header => header.name.toLowerCase() === "referer");
  54. if (!header) {
  55. header = { name: "Referer" };
  56. details.requestHeaders.push(header);
  57. header.value = referrer;
  58. }
  59. return { requestHeaders: details.requestHeaders };
  60. }
  61. }
  62. }
  63. }
  64. function enableReferrerOnError() {
  65. if (!referrerOnErrorEnabled) {
  66. try {
  67. browser.webRequest.onBeforeSendHeaders.addListener(injectRefererHeader, { urls: ["<all_urls>"] }, ["blocking", "requestHeaders", "extraHeaders"]);
  68. } catch (error) {
  69. browser.webRequest.onBeforeSendHeaders.addListener(injectRefererHeader, { urls: ["<all_urls>"] }, ["blocking", "requestHeaders"]);
  70. }
  71. referrerOnErrorEnabled = true;
  72. }
  73. }
  74. function disableReferrerOnError() {
  75. try {
  76. browser.webRequest.onBeforeSendHeaders.removeListener(injectRefererHeader);
  77. } catch (error) {
  78. // ignored
  79. }
  80. referrerOnErrorEnabled = false;
  81. }
  82. })();