Il y a 10 heures
Bonjour,
Actuellement le code du routeur ne défini pas systématiquement une politique pour le cache. C'est fait pour certaines requêtes via la fonction cacheEtClose mais celle ci définie un max-age très court (1 ou 5 minutes).
Pour toutes les autres requêtes c'est le navigateur qui décide de les cacher comme bon lui semble et cela est probablement la cause des bugs temporaires que l'on a à chaque changement de version et que l'on corrige via des Ctrl + F5.
Afin d’améliorer cette situation je propose de déclarer explicitement la politique pour le cache pour chaque requête. Pour toutes les requêtes en rapport avec un update ou qui ont un contenu dynamique il faut que le cache soit désactivé. Pour les requêtes renvoyant un contenu statique il faut que le cache soit actif et que celui ci ne soit pas mis à jour tant que la version du routeur n'a pas changé.
Pour effectuer cela, je propose d'utiliser le header HTTP ETag (https://www.geeksforgeeks.org/computer-n...http-etag/). En utilisant le numéro de version comme ETag cela permet d'indiquer au navigateur que la ressource peut être lue depuis le cache tant que la version du routeur n'a pas changé.
Cela devrait améliorer globalement les performances de l'interface web car plus de ressources seraient cachées et pour plus longtemps. Un autre avantage est que cela limitera fortement, voir supprimera, le besoin de faire des Ctrl+F5 à chaque changement de version.
J'ai effectué ces changements en local et cela semble bien fonctionner.
Concrètement, j'ai supprimé la fonction cacheEtClose et j'en ai rajouté 2 autres :
Pour toutes les requêtes que l'on ne veut pas cacher, j'appelle explicitement disableCache() et pour les autres checkCache en lui passant le ETag à comparer (la plupart du temps simplement la version du routeur).
Par exemple:
J'ai attaché à ce message le fichier Server.ino (renommé en Server.ino.txt afin de passer la validation) de la 17.04 qui contient toutes les modifications.
Le diff des modifications peut être également consulté en ligne ici : https://editor.mergely.com/CjtsuaPo
Qu'en pensez vous ?
Actuellement le code du routeur ne défini pas systématiquement une politique pour le cache. C'est fait pour certaines requêtes via la fonction cacheEtClose mais celle ci définie un max-age très court (1 ou 5 minutes).
Pour toutes les autres requêtes c'est le navigateur qui décide de les cacher comme bon lui semble et cela est probablement la cause des bugs temporaires que l'on a à chaque changement de version et que l'on corrige via des Ctrl + F5.
Afin d’améliorer cette situation je propose de déclarer explicitement la politique pour le cache pour chaque requête. Pour toutes les requêtes en rapport avec un update ou qui ont un contenu dynamique il faut que le cache soit désactivé. Pour les requêtes renvoyant un contenu statique il faut que le cache soit actif et que celui ci ne soit pas mis à jour tant que la version du routeur n'a pas changé.
Pour effectuer cela, je propose d'utiliser le header HTTP ETag (https://www.geeksforgeeks.org/computer-n...http-etag/). En utilisant le numéro de version comme ETag cela permet d'indiquer au navigateur que la ressource peut être lue depuis le cache tant que la version du routeur n'a pas changé.
Cela devrait améliorer globalement les performances de l'interface web car plus de ressources seraient cachées et pour plus longtemps. Un autre avantage est que cela limitera fortement, voir supprimera, le besoin de faire des Ctrl+F5 à chaque changement de version.
J'ai effectué ces changements en local et cela semble bien fonctionner.
Concrètement, j'ai supprimé la fonction cacheEtClose et j'en ai rajouté 2 autres :
Code :
void disableCache() {
server.sendHeader("Cache-Control", "no-store, no-cache, must-revalidate");
}
bool checkCache(const char* etag) {
String h = server.header("If-None-Match");
h.replace("\"", ""); // Remove double quotes if any
if (h.compareTo(etag) == 0) {
server.send(304, "Not Modified");
return true;
}
server.sendHeader("ETag", String("\"") + etag + "\"");
server.sendHeader("Cache-Control", "no-cache"); // Force la validation depuis le server en comparant le ETag
return false;
}Pour toutes les requêtes que l'on ne veut pas cacher, j'appelle explicitement disableCache() et pour les autres checkCache en lui passant le ETag à comparer (la plupart du temps simplement la version du routeur).
Par exemple:
Code :
void handleRoot() { // Pages principales
if (checkCache(Version)) return;
server.send(200, "text/html", MainHtml);
}
void handleAjaxHisto1an() { // Envoi Historique Energie quotiiienne sur 1 an 370 points
disableCache();
server.send(200, "application/json", HistoriqueEnergie1An());
}J'ai attaché à ce message le fichier Server.ino (renommé en Server.ino.txt afin de passer la validation) de la 17.04 qui contient toutes les modifications.
Le diff des modifications peut être également consulté en ligne ici : https://editor.mergely.com/CjtsuaPo
Qu'en pensez vous ?
