Skip to content

Commit

Permalink
Merge pull request #3591 from WoodyLetsCode/caching
Browse files Browse the repository at this point in the history
Fix ETag caching
  • Loading branch information
blazoncek authored Dec 16, 2023
2 parents 264480b + 5bc2282 commit 8522760
Showing 1 changed file with 20 additions and 20 deletions.
40 changes: 20 additions & 20 deletions wled00/wled_server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -146,19 +146,17 @@ void initServer()
request->send(response);
});

server.on("/favicon.ico", HTTP_GET, [](AsyncWebServerRequest *request) {
if (handleFileRead(request, "/favicon.ico")) return;
request->send_P(200, "image/x-icon", favicon, 156);
});

server.on("/skin.css", HTTP_GET, [](AsyncWebServerRequest *request) {
if (handleFileRead(request, "/skin.css")) return;
AsyncWebServerResponse *response = request->beginResponse(200, "text/css");
request->send(response);
});

server.on("/favicon.ico", HTTP_GET, [](AsyncWebServerRequest *request){
if(!handleFileRead(request, "/favicon.ico"))
{
request->send_P(200, "image/x-icon", favicon, 156);
}
});

server.on("/welcome", HTTP_GET, [](AsyncWebServerRequest *request){
serveSettings(request);
});
Expand Down Expand Up @@ -257,13 +255,15 @@ void initServer()
);

server.on("/iro.js", HTTP_GET, [](AsyncWebServerRequest *request){
if (handleIfNoneMatchCacheHeader(request)) return;
AsyncWebServerResponse *response = request->beginResponse_P(200, "application/javascript", iroJs, iroJs_length);
response->addHeader(FPSTR(s_content_enc),"gzip");
setStaticContentCacheHeaders(response);
request->send(response);
});

server.on("/rangetouch.js", HTTP_GET, [](AsyncWebServerRequest *request){
if (handleIfNoneMatchCacheHeader(request)) return;
AsyncWebServerResponse *response = request->beginResponse_P(200, "application/javascript", rangetouchJs, rangetouchJs_length);
response->addHeader(FPSTR(s_content_enc),"gzip");
setStaticContentCacheHeaders(response);
Expand Down Expand Up @@ -412,29 +412,29 @@ void initServer()
});
}

bool handleIfNoneMatchCacheHeader(AsyncWebServerRequest* request)
{
AsyncWebHeader* header = request->getHeader("If-None-Match");
if (header && header->value() == String(VERSION)) {
bool handleIfNoneMatchCacheHeader(AsyncWebServerRequest *request) {
AsyncWebHeader *header = request->getHeader("If-None-Match");
char etag[11];
sprintf_P(etag, PSTR("%7d-%02x"), VERSION, cacheInvalidate);
if (header && header->value() == etag) {
request->send(304);
return true;
}
return false;
}

void setStaticContentCacheHeaders(AsyncWebServerResponse *response)
{
char tmp[12];
void setStaticContentCacheHeaders(AsyncWebServerResponse *response) {
// https://medium.com/@codebyamir/a-web-developers-guide-to-browser-caching-cc41f3b73e7c
#ifndef WLED_DEBUG
//this header name is misleading, "no-cache" will not disable cache,
//it just revalidates on every load using the "If-None-Match" header with the last ETag value
response->addHeader(F("Cache-Control"),"no-cache");
// this header name is misleading, "no-cache" will not disable cache,
// it just revalidates on every load using the "If-None-Match" header with the last ETag value
response->addHeader(F("Cache-Control"), "no-cache");
#else
response->addHeader(F("Cache-Control"),"no-store,max-age=0"); // prevent caching if debug build
response->addHeader(F("Cache-Control"), "no-store,max-age=0"); // prevent caching if debug build
#endif
sprintf_P(tmp, PSTR("%8d-%02x"), VERSION, cacheInvalidate);
response->addHeader(F("ETag"), tmp);
char etag[11];
sprintf_P(etag, PSTR("%7d-%02x"), VERSION, cacheInvalidate);
response->addHeader(F("ETag"), etag);
}

void serveIndex(AsyncWebServerRequest* request)
Expand Down

0 comments on commit 8522760

Please sign in to comment.