Skip to content

Commit 49c8353

Browse files
committed
make User-Agent configurable (#3253)
1 parent 296df06 commit 49c8353

File tree

5 files changed

+46
-7
lines changed

5 files changed

+46
-7
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ _This release is scheduled to be released on 2024-01-01._
1313

1414
- Added node 21 to the test matrix
1515
- Added transform object to calendar:customEvents
16+
- Added configuration option for `User-Agent`, used by calendar & news module
1617

1718
### Removed
1819

js/server_functions.js

+23-2
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ async function cors(req, res) {
6868
* @returns {object} An object specifying name and value of the headers.
6969
*/
7070
function getHeadersToSend(url) {
71-
const headersToSend = { "User-Agent": `Mozilla/5.0 MagicMirror/${global.version}` };
71+
const headersToSend = { "User-Agent": getUserAgent() };
7272
const headersToSendMatch = new RegExp("sendheaders=(.+?)(&|$)", "g").exec(url);
7373
if (headersToSendMatch) {
7474
const headers = headersToSendMatch[1].split(",");
@@ -127,4 +127,25 @@ function getVersion(req, res) {
127127
res.send(global.version);
128128
}
129129

130-
module.exports = { cors, getConfig, getHtml, getVersion, getStartup };
130+
/**
131+
* Gets the preferred `User-Agent`
132+
* @returns {string} `User-Agent` to be used
133+
*/
134+
function getUserAgent() {
135+
const defaultUserAgent = `Mozilla/5.0 (Node.js ${Number(process.version.match(/^v(\d+\.\d+)/)[1])}) MagicMirror/${global.version}`;
136+
137+
if (typeof config === "undefined") {
138+
return defaultUserAgent;
139+
}
140+
141+
switch (typeof config.userAgent) {
142+
case "function":
143+
return config.userAgent();
144+
case "string":
145+
return config.userAgent;
146+
default:
147+
return defaultUserAgent;
148+
}
149+
}
150+
151+
module.exports = { cors, getConfig, getHtml, getVersion, getStartup, getUserAgent };

modules/default/calendar/calendarfetcher.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ const https = require("https");
99
const ical = require("node-ical");
1010
const Log = require("logger");
1111
const NodeHelper = require("node_helper");
12+
const { getUserAgent } = require("../../../js/server_functions");
1213
const CalendarFetcherUtils = require("./calendarfetcherutils");
1314

1415
/**
@@ -36,10 +37,9 @@ const CalendarFetcher = function (url, reloadInterval, excludedEvents, maximumEn
3637
const fetchCalendar = () => {
3738
clearTimeout(reloadTimer);
3839
reloadTimer = null;
39-
const nodeVersion = Number(process.version.match(/^v(\d+\.\d+)/)[1]);
4040
let httpsAgent = null;
4141
let headers = {
42-
"User-Agent": `Mozilla/5.0 (Node.js ${nodeVersion}) MagicMirror/${global.version}`
42+
"User-Agent": getUserAgent()
4343
};
4444

4545
if (selfSignedCert) {

modules/default/newsfeed/newsfeedfetcher.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const iconv = require("iconv-lite");
1111
const { htmlToText } = require("html-to-text");
1212
const Log = require("logger");
1313
const NodeHelper = require("node_helper");
14+
const { getUserAgent } = require("../../../js/server_functions");
1415

1516
/**
1617
* Responsible for requesting an update on the set interval and broadcasting the data.
@@ -100,9 +101,8 @@ const NewsfeedFetcher = function (url, reloadInterval, encoding, logFeedWarnings
100101
}
101102
});
102103

103-
const nodeVersion = Number(process.version.match(/^v(\d+\.\d+)/)[1]);
104104
const headers = {
105-
"User-Agent": `Mozilla/5.0 (Node.js ${nodeVersion}) MagicMirror/${global.version}`,
105+
"User-Agent": getUserAgent(),
106106
"Cache-Control": "max-age=0, no-cache, no-store, must-revalidate",
107107
Pragma: "no-cache"
108108
};

tests/unit/functions/server_functions_spec.js

+18-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
const { cors } = require("../../../js/server_functions");
1+
const { expect } = require("playwright/test");
2+
const { cors, getUserAgent } = require("../../../js/server_functions");
23

34
describe("server_functions tests", () => {
45
describe("The cors method", () => {
@@ -142,5 +143,21 @@ describe("server_functions tests", () => {
142143
expect(corsResponse.set.mock.calls[2][0]).toBe("header2");
143144
expect(corsResponse.set.mock.calls[2][1]).toBe("value2");
144145
});
146+
147+
test("Gets User-Agent from configuration", async () => {
148+
config = {};
149+
let userAgent;
150+
151+
userAgent = getUserAgent();
152+
expect(userAgent).toContain("Mozilla/5.0 (Node.js ");
153+
154+
config.userAgent = "Mozilla/5.0 (Foo)";
155+
userAgent = getUserAgent();
156+
expect(userAgent).toBe("Mozilla/5.0 (Foo)");
157+
158+
config.userAgent = () => "Mozilla/5.0 (Bar)";
159+
userAgent = getUserAgent();
160+
expect(userAgent).toBe("Mozilla/5.0 (Bar)");
161+
});
145162
});
146163
});

0 commit comments

Comments
 (0)