requests.js 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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. const header = details.requestHeaders.find(header => header.name.toLowerCase() === "referer");
  54. if (!header) {
  55. details.requestHeaders.push({ name: "Referer", value: referrer });
  56. return { requestHeaders: details.requestHeaders };
  57. }
  58. }
  59. }
  60. }
  61. }
  62. function enableReferrerOnError() {
  63. if (!referrerOnErrorEnabled) {
  64. try {
  65. browser.webRequest.onBeforeSendHeaders.addListener(injectRefererHeader, { urls: ["<all_urls>"] }, ["blocking", "requestHeaders", "extraHeaders"]);
  66. } catch (error) {
  67. browser.webRequest.onBeforeSendHeaders.addListener(injectRefererHeader, { urls: ["<all_urls>"] }, ["blocking", "requestHeaders"]);
  68. }
  69. referrerOnErrorEnabled = true;
  70. }
  71. }
  72. function disableReferrerOnError() {
  73. try {
  74. browser.webRequest.onBeforeSendHeaders.removeListener(injectRefererHeader);
  75. } catch (error) {
  76. // ignored
  77. }
  78. referrerOnErrorEnabled = false;
  79. }
  80. })();