mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2025-12-06 07:49:52 +03:00
try out etags instead of immutable cache
This commit is contained in:
@@ -2,6 +2,7 @@ import { readdirSync, existsSync, unlinkSync, readFileSync, createWriteStream }
|
|||||||
import { resolve, relative, sep } from 'path';
|
import { resolve, relative, sep } from 'path';
|
||||||
import zlib from 'zlib';
|
import zlib from 'zlib';
|
||||||
import mime from 'mime-types';
|
import mime from 'mime-types';
|
||||||
|
import crypto from 'crypto';
|
||||||
|
|
||||||
const ARDUINO_INCLUDES = '#include <Arduino.h>\n\n';
|
const ARDUINO_INCLUDES = '#include <Arduino.h>\n\n';
|
||||||
const INDENT = ' ';
|
const INDENT = ' ';
|
||||||
@@ -11,14 +12,17 @@ const bytesPerLine = 20;
|
|||||||
var totalSize = 0;
|
var totalSize = 0;
|
||||||
|
|
||||||
const generateWWWClass = () =>
|
const generateWWWClass = () =>
|
||||||
`typedef std::function<void(const String& uri, const String& contentType, const uint8_t * content, size_t len)> RouteRegistrationHandler;
|
`typedef std::function<void(const String& uri, const String& contentType, const uint8_t * content, size_t len, const String& hash)> RouteRegistrationHandler;
|
||||||
// Total size is ${totalSize} bytes
|
// Total size is ${totalSize} bytes
|
||||||
|
|
||||||
class WWWData {
|
class WWWData {
|
||||||
${indent}public:
|
${indent}public:
|
||||||
${indent.repeat(2)}static void registerRoutes(RouteRegistrationHandler handler) {
|
${indent.repeat(2)}static void registerRoutes(RouteRegistrationHandler handler) {
|
||||||
${fileInfo
|
${fileInfo
|
||||||
.map((file) => `${indent.repeat(3)}handler("${file.uri}", "${file.mimeType}", ${file.variable}, ${file.size});`)
|
.map(
|
||||||
|
(file) =>
|
||||||
|
`${indent.repeat(3)}handler("${file.uri}", "${file.mimeType}", ${file.variable}, ${file.size}, "${file.hash}");`
|
||||||
|
)
|
||||||
.join('\n')}
|
.join('\n')}
|
||||||
${indent.repeat(2)}}
|
${indent.repeat(2)}}
|
||||||
};
|
};
|
||||||
@@ -50,6 +54,12 @@ const writeFile = (relativeFilePath, buffer) => {
|
|||||||
writeStream.write('const uint8_t ' + variable + '[] = {');
|
writeStream.write('const uint8_t ' + variable + '[] = {');
|
||||||
// const zipBuffer = zlib.brotliCompressSync(buffer, { quality: 1 });
|
// const zipBuffer = zlib.brotliCompressSync(buffer, { quality: 1 });
|
||||||
const zipBuffer = zlib.gzipSync(buffer, { level: 9 });
|
const zipBuffer = zlib.gzipSync(buffer, { level: 9 });
|
||||||
|
|
||||||
|
// create sha
|
||||||
|
const hashSum = crypto.createHash('sha256');
|
||||||
|
hashSum.update(zipBuffer);
|
||||||
|
const hash = hashSum.digest('hex');
|
||||||
|
|
||||||
zipBuffer.forEach((b) => {
|
zipBuffer.forEach((b) => {
|
||||||
if (!(size % bytesPerLine)) {
|
if (!(size % bytesPerLine)) {
|
||||||
writeStream.write('\n');
|
writeStream.write('\n');
|
||||||
@@ -58,15 +68,19 @@ const writeFile = (relativeFilePath, buffer) => {
|
|||||||
writeStream.write('0x' + ('00' + b.toString(16).toUpperCase()).slice(-2) + ',');
|
writeStream.write('0x' + ('00' + b.toString(16).toUpperCase()).slice(-2) + ',');
|
||||||
size++;
|
size++;
|
||||||
});
|
});
|
||||||
|
|
||||||
if (size % bytesPerLine) {
|
if (size % bytesPerLine) {
|
||||||
writeStream.write('\n');
|
writeStream.write('\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
writeStream.write('};\n\n');
|
writeStream.write('};\n\n');
|
||||||
|
|
||||||
fileInfo.push({
|
fileInfo.push({
|
||||||
uri: '/' + relativeFilePath.replace(sep, '/'),
|
uri: '/' + relativeFilePath.replace(sep, '/'),
|
||||||
mimeType,
|
mimeType,
|
||||||
variable,
|
variable,
|
||||||
size
|
size,
|
||||||
|
hash
|
||||||
});
|
});
|
||||||
|
|
||||||
// console.log(relativeFilePath + ' (size ' + size + ' bytes)');
|
// console.log(relativeFilePath + ' (size ' + size + ' bytes)');
|
||||||
|
|||||||
@@ -19,15 +19,32 @@ ESP8266React::ESP8266React(AsyncWebServer * server, FS * fs)
|
|||||||
, _restartService(server, &_securitySettingsService)
|
, _restartService(server, &_securitySettingsService)
|
||||||
, _factoryResetService(server, fs, &_securitySettingsService)
|
, _factoryResetService(server, fs, &_securitySettingsService)
|
||||||
, _systemStatus(server, &_securitySettingsService) {
|
, _systemStatus(server, &_securitySettingsService) {
|
||||||
// Serve static resources
|
//
|
||||||
WWWData::registerRoutes([server, this](const String & uri, const String & contentType, const uint8_t * content, size_t len) {
|
// Serve static web resources
|
||||||
ArRequestHandlerFunction requestHandler = [contentType, content, len](AsyncWebServerRequest * request) {
|
//
|
||||||
|
|
||||||
|
// Populate the last modification date based on build datetime
|
||||||
|
static char last_modified[50];
|
||||||
|
sprintf(last_modified, "%s %s CET", __DATE__, __TIME__);
|
||||||
|
|
||||||
|
WWWData::registerRoutes([server, this](const String & uri, const String & contentType, const uint8_t * content, size_t len, const String & hash) {
|
||||||
|
ArRequestHandlerFunction requestHandler = [contentType, content, len, hash](AsyncWebServerRequest * request) {
|
||||||
|
// Check if the client already has the same version and respond with a 304 (Not modified)
|
||||||
|
if (request->header("If-Modified-Since").indexOf(last_modified) > 0) {
|
||||||
|
return request->send(304);
|
||||||
|
} else if (request->header("If-None-Match").equals(hash)) {
|
||||||
|
return request->send(304);
|
||||||
|
}
|
||||||
|
|
||||||
AsyncWebServerResponse * response = request->beginResponse_P(200, contentType, content, len);
|
AsyncWebServerResponse * response = request->beginResponse_P(200, contentType, content, len);
|
||||||
response->addHeader("Content-Encoding", "gzip");
|
response->addHeader("Content-Encoding", "gzip");
|
||||||
response->addHeader("Cache-Control", "public, immutable, max-age=31536000");
|
// response->addHeader("Cache-Control", "public, immutable, max-age=31536000");
|
||||||
|
response->addHeader("Last-Modified", last_modified);
|
||||||
|
response->addHeader("ETag", hash);
|
||||||
// response->addHeader("Content-Encoding", "br"); // only works over HTTPS
|
// response->addHeader("Content-Encoding", "br"); // only works over HTTPS
|
||||||
request->send(response);
|
request->send(response);
|
||||||
};
|
};
|
||||||
|
|
||||||
server->on(uri.c_str(), HTTP_GET, requestHandler);
|
server->on(uri.c_str(), HTTP_GET, requestHandler);
|
||||||
// Serving non matching get requests with "/index.html"
|
// Serving non matching get requests with "/index.html"
|
||||||
// OPTIONS get a straight up 200 response
|
// OPTIONS get a straight up 200 response
|
||||||
|
|||||||
@@ -11,6 +11,21 @@
|
|||||||
#define WIFI_AP WIFI_MODE_AP
|
#define WIFI_AP WIFI_MODE_AP
|
||||||
#define WIFI_AP_STA WIFI_MODE_APSTA
|
#define WIFI_AP_STA WIFI_MODE_APSTA
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
WIFI_POWER_19_5dBm = 78, // 19.5dBm
|
||||||
|
WIFI_POWER_19dBm = 76, // 19dBm
|
||||||
|
WIFI_POWER_18_5dBm = 74, // 18.5dBm
|
||||||
|
WIFI_POWER_17dBm = 68, // 17dBm
|
||||||
|
WIFI_POWER_15dBm = 60, // 15dBm
|
||||||
|
WIFI_POWER_13dBm = 52, // 13dBm
|
||||||
|
WIFI_POWER_11dBm = 44, // 11dBm
|
||||||
|
WIFI_POWER_8_5dBm = 34, // 8.5dBm
|
||||||
|
WIFI_POWER_7dBm = 28, // 7dBm
|
||||||
|
WIFI_POWER_5dBm = 20, // 5dBm
|
||||||
|
WIFI_POWER_2dBm = 8, // 2dBm
|
||||||
|
WIFI_POWER_MINUS_1dBm = -4 // -1dBm
|
||||||
|
} wifi_power_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
ETH_CLOCK_GPIO0_IN = 0, /*!< RMII clock input to GPIO0 */
|
ETH_CLOCK_GPIO0_IN = 0, /*!< RMII clock input to GPIO0 */
|
||||||
ETH_CLOCK_GPIO0_OUT = 1, /*!< RMII clock output from GPIO0 */
|
ETH_CLOCK_GPIO0_OUT = 1, /*!< RMII clock output from GPIO0 */
|
||||||
|
|||||||
Reference in New Issue
Block a user