From 33262cc703c69eb85bd7000dbabcf81fe027e9aa Mon Sep 17 00:00:00 2001
From: Paul <paulmakles@gmail.com>
Date: Sat, 31 Jul 2021 14:48:08 +0100
Subject: [PATCH] Add cache control header for default avatars.

---
 set_version.sh                         |  2 +-
 src/routes/users/get_default_avatar.rs | 25 +++++++++++++++++++------
 src/version.rs                         |  2 +-
 3 files changed, 21 insertions(+), 8 deletions(-)

diff --git a/set_version.sh b/set_version.sh
index 23f0096..40cde68 100755
--- a/set_version.sh
+++ b/set_version.sh
@@ -1,3 +1,3 @@
 #!/bin/bash
-export version=0.5.1-alpha.20
+export version=0.5.1-alpha.21
 echo "pub const VERSION: &str = \"${version}\";" > src/version.rs
diff --git a/src/routes/users/get_default_avatar.rs b/src/routes/users/get_default_avatar.rs
index 4e46c73..d2504cf 100644
--- a/src/routes/users/get_default_avatar.rs
+++ b/src/routes/users/get_default_avatar.rs
@@ -1,28 +1,41 @@
-use rocket::response::NamedFile;
+use rocket::{Request, Response};
+use rocket::response::{self, NamedFile, Responder};
 use std::path::Path;
 
 use crate::database::Ref;
 
+pub struct CachedFile(NamedFile);
+
+pub static CACHE_CONTROL: &'static str = "public, max-age=31536000, immutable";
+
+impl<'r> Responder<'r, 'static> for CachedFile {
+    fn respond_to(self, req: &'r Request<'_>) -> response::Result<'static> {
+        Response::build_from(self.0.respond_to(req)?)
+            .raw_header("Cache-control", CACHE_CONTROL)
+            .ok()
+    }
+}
+
 #[get("/<target>/default_avatar")]
-pub async fn req(target: Ref) -> Option<NamedFile> {
+pub async fn req(target: Ref) -> Option<CachedFile> {
     match target.id.chars().nth(25).unwrap() {
         '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' => {
-            NamedFile::open(Path::new("assets/user_red.png")).await.ok()
+            NamedFile::open(Path::new("assets/user_red.png")).await.ok().map(|n| CachedFile(n))
         }
         '8' | '9' | 'A' | 'C' | 'B' | 'D' | 'E' | 'F' => {
             NamedFile::open(Path::new("assets/user_green.png"))
                 .await
-                .ok()
+                .ok().map(|n| CachedFile(n))
         }
         'G' | 'H' | 'J' | 'K' | 'M' | 'N' | 'P' | 'Q' => {
             NamedFile::open(Path::new("assets/user_blue.png"))
                 .await
-                .ok()
+                .ok().map(|n| CachedFile(n))
         }
         'R' | 'S' | 'T' | 'V' | 'W' | 'X' | 'Y' | 'Z' => {
             NamedFile::open(Path::new("assets/user_yellow.png"))
                 .await
-                .ok()
+                .ok().map(|n| CachedFile(n))
         }
         _ => unreachable!(),
     }
diff --git a/src/version.rs b/src/version.rs
index a16194b..c7d448d 100644
--- a/src/version.rs
+++ b/src/version.rs
@@ -1 +1 @@
-pub const VERSION: &str = "0.5.1-alpha.20";
+pub const VERSION: &str = "0.5.1-alpha.21";
-- 
GitLab