requests.js 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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 */
  24. import {
  25. REQUEST_ID_HEADER_NAME,
  26. referrers
  27. } from "../../lib/single-file/fetch/bg/fetch.js";
  28. let referrerOnErrorEnabled = false;
  29. export {
  30. onMessage,
  31. enableReferrerOnError
  32. };
  33. function onMessage(message) {
  34. if (message.method.endsWith(".enableReferrerOnError")) {
  35. enableReferrerOnError();
  36. return {};
  37. }
  38. if (message.method.endsWith(".disableReferrerOnError")) {
  39. disableReferrerOnError();
  40. return {};
  41. }
  42. }
  43. function injectRefererHeader(details) {
  44. if (referrerOnErrorEnabled) {
  45. let requestIdHeader = details.requestHeaders.find(header => header.name === REQUEST_ID_HEADER_NAME);
  46. if (requestIdHeader) {
  47. details.requestHeaders = details.requestHeaders.filter(header => header.name !== REQUEST_ID_HEADER_NAME);
  48. const referrer = referrers.get(requestIdHeader.value);
  49. if (referrer) {
  50. referrers.delete(requestIdHeader.value);
  51. const header = details.requestHeaders.find(header => header.name.toLowerCase() === "referer");
  52. if (!header) {
  53. details.requestHeaders.push({ name: "Referer", value: referrer });
  54. return { requestHeaders: details.requestHeaders };
  55. }
  56. }
  57. }
  58. }
  59. }
  60. function enableReferrerOnError() {
  61. if (!referrerOnErrorEnabled) {
  62. try {
  63. browser.webRequest.onBeforeSendHeaders.addListener(injectRefererHeader, { urls: ["<all_urls>"] }, ["blocking", "requestHeaders", "extraHeaders"]);
  64. } catch (error) {
  65. browser.webRequest.onBeforeSendHeaders.addListener(injectRefererHeader, { urls: ["<all_urls>"] }, ["blocking", "requestHeaders"]);
  66. }
  67. referrerOnErrorEnabled = true;
  68. }
  69. }
  70. function disableReferrerOnError() {
  71. try {
  72. browser.webRequest.onBeforeSendHeaders.removeListener(injectRefererHeader);
  73. } catch (error) {
  74. // ignored
  75. }
  76. referrerOnErrorEnabled = false;
  77. }