working version, use corsUrl in weather providers

This commit is contained in:
Karsten Hassel 2022-01-25 22:30:16 +01:00
parent 7cfc7b9d74
commit c622db918b
10 changed files with 42 additions and 25 deletions

View File

@ -78,23 +78,31 @@ function Server(config, callback) {
app.use(directory, express.static(path.resolve(global.root_path + directory)));
}
app.get("/cors", function (req, res) {
// http://localhost:8080/cors?url=https://google.de
console.dir(req.query.url);
app.get("/cors", async function (req, res) {
// example: http://localhost:8080/cors?url=https://google.de
fetch(req.query.url, { headers: { "User-Agent": "Mozilla/5.0 MagicMirror/" + global.version } })
.then((response) => {
global.mmCorsHeader = response.headers.get("Content-Type");
if (! global.mmCorsHeader) {global.mmCorsHeader = "application/text"}
return response.text();
})
.then((responseData) => {
res.set("Content-Type", global.mmCorsHeader);
res.send(responseData);
})
.catch((error) => {
Log.error(error);
});
try {
const reg = "^/cors.+url=(.*)";
let url = "";
let match = new RegExp(reg, "g").exec(req.url);
if (!match) {
url = "invalid url: " + req.url;
Log.error(url);
res.send(url);
} else {
url = match[1];
Log.log("cors url: " + url);
const response = await fetch(url, { headers: { "User-Agent": "Mozilla/5.0 MagicMirror/" + global.version } });
const header = response.headers.get("Content-Type");
const data = await response.text();
if (header) res.set("Content-Type", header);
res.send(data);
}
} catch (error) {
Log.error(error);
res.send(error);
}
});
app.get("/version", function (req, res) {

View File

@ -18,7 +18,7 @@ WeatherProvider.register("darksky", {
// Set the default config properties that is specific to this provider
defaults: {
apiBase: "https://cors-anywhere.herokuapp.com/https://api.darksky.net",
apiBase: "https://api.darksky.net",
weatherEndpoint: "/forecast",
apiKey: "",
lat: 0,
@ -67,7 +67,7 @@ WeatherProvider.register("darksky", {
// Create a URL from the config and base URL.
getUrl() {
const units = this.units[this.config.units] || "auto";
return `${this.config.apiBase}${this.config.weatherEndpoint}/${this.config.apiKey}/${this.config.lat},${this.config.lon}?units=${units}&lang=${this.config.lang}`;
return this.getCorsUrl() + `${this.config.apiBase}${this.config.weatherEndpoint}/${this.config.apiKey}/${this.config.lat},${this.config.lon}?units=${units}&lang=${this.config.lang}`;
},
// Implement WeatherDay generator.

View File

@ -164,7 +164,7 @@ WeatherProvider.register("envcanada", {
// CORS errors when accessing EC
//
getUrl() {
return "http://localhost:8080/cors?url=https://dd.weather.gc.ca/citypage_weather/xml/" + this.config.provCode + "/" + this.config.siteCode + "_e.xml";
return this.getCorsUrl() + "https://dd.weather.gc.ca/citypage_weather/xml/" + this.config.provCode + "/" + this.config.siteCode + "_e.xml";
},
//

View File

@ -116,7 +116,7 @@ WeatherProvider.register("openweathermap", {
* Gets the complete url for the request
*/
getUrl() {
return this.config.apiBase + this.config.apiVersion + this.config.weatherEndpoint + this.getParams();
return this.getCorsUrl() + this.config.apiBase + this.config.apiVersion + this.config.weatherEndpoint + this.getParams();
},
/*

View File

@ -91,7 +91,7 @@ WeatherProvider.register("smhi", {
getURL() {
let lon = this.config.lon;
let lat = this.config.lat;
return `https://opendata-download-metfcst.smhi.se/api/category/pmp3g/version/2/geotype/point/lon/${lon}/lat/${lat}/data.json`;
return this.getCorsUrl() + `https://opendata-download-metfcst.smhi.se/api/category/pmp3g/version/2/geotype/point/lon/${lon}/lat/${lat}/data.json`;
},
/**

View File

@ -73,7 +73,7 @@ WeatherProvider.register("ukmetoffice", {
* Gets the complete url for the request
*/
getUrl(forecastType) {
return this.config.apiBase + this.config.locationID + this.getParams(forecastType);
return this.getCorsUrl() + this.config.apiBase + this.config.locationID + this.getParams(forecastType);
},
/*

View File

@ -63,7 +63,7 @@ WeatherProvider.register("ukmetofficedatahub", {
queryStrings += "&includeLocationName=" + true;
// Return URL, making sure there is a trailing "/" in the base URL.
return this.config.apiBase + (this.config.apiBase.endsWith("/") ? "" : "/") + forecastType + queryStrings;
return this.getCorsUrl() + this.config.apiBase + (this.config.apiBase.endsWith("/") ? "" : "/") + forecastType + queryStrings;
},
// Build the list of headers for the request

View File

@ -72,7 +72,7 @@ WeatherProvider.register("weatherbit", {
// Create a URL from the config and base URL.
getUrl() {
const units = this.units[this.config.units] || "auto";
return `${this.config.apiBase}${this.config.weatherEndpoint}?lat=${this.config.lat}&lon=${this.config.lon}&units=${units}&key=${this.config.apiKey}`;
return this.getCorsUrl() + `${this.config.apiBase}${this.config.weatherEndpoint}?lat=${this.config.lat}&lon=${this.config.lon}&units=${units}&key=${this.config.apiKey}`;
},
// Implement WeatherDay generator.

View File

@ -40,7 +40,7 @@ WeatherProvider.register("weathergov", {
// Called to set the config, this config is the same as the weather module's config.
setConfig: function (config) {
this.config = config;
(this.config.apiBase = "https://api.weather.gov"), this.fetchWxGovURLs(this.config);
(this.config.apiBase = this.getCorsUrl() + "https://api.weather.gov"), this.fetchWxGovURLs(this.config);
},
// Called when the weather provider is about to start.

View File

@ -111,6 +111,15 @@ const WeatherProvider = Class.extend({
this.delegate.updateAvailable(this);
},
getCorsUrl: function () {
const url = window.config.address + ":" + window.config.port + "/cors?url=";
if (window.config.useHttps) {
return "https://" + url;
} else {
return "http://" + url;
}
},
// A convenience function to make requests. It returns a promise.
fetchData: function (url, method = "GET", data = null) {
const getData = function (mockData) {