From c1f0b9ea6f579ee91ee2376eef3eed5466d1bff9 Mon Sep 17 00:00:00 2001 From: Stefan Oberhumer Date: Sat, 23 Dec 2023 18:23:03 +0100 Subject: [PATCH] http response header tag 'ETag' needs quotes. As per RFC7232 ( https://www.rfc-editor.org/rfc/rfc7232#section-2.3 ) and MDN docs ( https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag#directives ) the value of the ETag in the http header response has to be between quotes. --- src/WebApi_webapp.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/WebApi_webapp.cpp b/src/WebApi_webapp.cpp index 260566fa..ea185b2d 100644 --- a/src/WebApi_webapp.cpp +++ b/src/WebApi_webapp.cpp @@ -18,6 +18,10 @@ extern const uint8_t file_zones_json_end[] asm("_binary_webapp_dist_zones_json_g extern const uint8_t file_app_js_end[] asm("_binary_webapp_dist_js_app_js_gz_end"); extern const uint8_t file_site_webmanifest_end[] asm("_binary_webapp_dist_site_webmanifest_end"); +#ifdef AUTO_GIT_HASH +#define ETAG_HTTP_HEADER_VAL "\"" AUTO_GIT_HASH "\"" // ETag value must be between quotes +#endif + void WebApiWebappClass::init(AsyncWebServer& server) { _server = &server; @@ -62,12 +66,12 @@ void WebApiWebappClass::init(AsyncWebServer& server) }); _server->on("/js/app.js", HTTP_GET, [](AsyncWebServerRequest* request) { -#ifdef AUTO_GIT_HASH +#ifdef ETAG_HTTP_HEADER_VAL // check client If-None-Match header vs ETag/AUTO_GIT_HASH bool eTagMatch = false; if (request->hasHeader("If-None-Match")) { const AsyncWebHeader* h = request->getHeader("If-None-Match"); - if (strncmp(AUTO_GIT_HASH, h->value().c_str(), strlen(AUTO_GIT_HASH)) == 0) { + if (strncmp(ETAG_HTTP_HEADER_VAL, h->value().c_str(), strlen(ETAG_HTTP_HEADER_VAL)) == 0) { eTagMatch = true; } } @@ -82,7 +86,7 @@ void WebApiWebappClass::init(AsyncWebServer& server) } // HTTP requires cache headers in 200 and 304 to be identical response->addHeader("Cache-Control", "public, must-revalidate"); - response->addHeader("ETag", AUTO_GIT_HASH); + response->addHeader("ETag", ETAG_HTTP_HEADER_VAL); #else AsyncWebServerResponse* response = request->beginResponse_P(200, "text/javascript", file_app_js_start, file_app_js_end - file_app_js_start); response->addHeader("Content-Encoding", "gzip"); @@ -93,4 +97,4 @@ void WebApiWebappClass::init(AsyncWebServer& server) void WebApiWebappClass::loop() { -} \ No newline at end of file +}