diff options
author | Malf Furious <m@lfurio.us> | 2019-03-24 01:12:21 -0400 |
---|---|---|
committer | Malf Furious <m@lfurio.us> | 2019-03-24 01:12:21 -0400 |
commit | 4586d033f6cfdd9df6f1036ced25dd202b462aaa (patch) | |
tree | fdff6bb5ebc92f1d3abb6f5672198cef1c253ea7 | |
parent | 14a20dcb0eae75e6096ec966c9fed6dcc1283993 (diff) | |
download | scrott-4586d033f6cfdd9df6f1036ced25dd202b462aaa.tar.gz scrott-4586d033f6cfdd9df6f1036ced25dd202b462aaa.zip |
Employ df cache validation using HTTP ETag header
This patch is a direct improvement on the previous one. Now, instead of
telling clients to always cache df resources for 24 hours before
revalidating the file, we tell them to cache it for zero seconds. This,
in cobination with the ETag header, prompts the browser to utilize the
If-None-Match request header.
When serving df resources, we will set an ETag, which is a sha256 of the
file content for the browser to cache. When the browser wants to load a
resource a second time, it will send the ETag back via the If-None-Match
header so we can compare it to the current file's hash. If the
browser's ETag is still current, we can return 304 and save some
bandwidth. Otherwise, the full response is sent as usual.
Signed-off-by: Malf Furious <m@lfurio.us>
-rw-r--r-- | app/df.php | 24 |
1 files changed, 17 insertions, 7 deletions
@@ -31,24 +31,34 @@ require_once "class/mesg.class.php"; /* * Serve the resource at the given URI in response to the current * request. When finished, this function will exit PHP and terminate - * this script. The response instructs the client to cache the - * result for 24 hours. + * this script. */ function serveResource(string $uri, ?string $filename = NULL) : void { $f = fopen($uri, "rb"); + /* no file */ if (!$f) exit; - $cachelen = 86400; // secs, 24-hours - $cachedate = gmdate("D, d M Y H:i:s", time() + $cachelen); + /* enable client caching */ + header("Cache-Control: max-age=0"); + header("Pragma: cache"); + + $hash = hash_file("sha256", $uri); + /* validate client cache */ + if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && + $_SERVER['HTTP_IF_NONE_MATCH'] == $hash) + { + header("HTTP/1.1 304 Not Modified"); + exit; + } + + /* resource metadata */ header("Content-Type: " . mime_content_type($uri)); header("Content-Length: " . filesize($uri)); - header("Expires: " . $cachedate); - header("Cache-Control: max-age=" . $cachelen); - header("Pragma: cache"); + header("ETag: " . $hash); if ($filename) header("Content-Disposition: attachment; filename=\"" . $filename . "\""); |