keycloak-uncached

Details

diff --git a/forms/common-freemarker/src/main/java/org/keycloak/freemarker/ExtendingThemeManager.java b/forms/common-freemarker/src/main/java/org/keycloak/freemarker/ExtendingThemeManager.java
index 06991e2..51f4984 100644
--- a/forms/common-freemarker/src/main/java/org/keycloak/freemarker/ExtendingThemeManager.java
+++ b/forms/common-freemarker/src/main/java/org/keycloak/freemarker/ExtendingThemeManager.java
@@ -22,6 +22,7 @@ public class ExtendingThemeManager implements ThemeProvider {
 
     private List<ThemeProvider> providers;
     private String defaultTheme;
+    private int staticMaxAge;
 
     public ExtendingThemeManager(ProviderSession providerSession) {
         providers = new LinkedList();
@@ -40,6 +41,11 @@ public class ExtendingThemeManager implements ThemeProvider {
         });
 
         this.defaultTheme = Config.scope("theme").get("default");
+        this.staticMaxAge = Config.scope("theme").getInt("staticMaxAge");
+    }
+
+    public int getStaticMaxAge() {
+        return staticMaxAge;
     }
 
     @Override
diff --git a/server/src/main/resources/META-INF/keycloak-server.json b/server/src/main/resources/META-INF/keycloak-server.json
index af4c79e..f35857e 100755
--- a/server/src/main/resources/META-INF/keycloak-server.json
+++ b/server/src/main/resources/META-INF/keycloak-server.json
@@ -20,6 +20,7 @@
 
     "theme": {
         "default": "keycloak",
+        "staticMaxAge": 2592000,
         "folder": {
           "dir": "${jboss.server.config.dir}/themes"
         }
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/AdminConsole.java b/services/src/main/java/org/keycloak/services/resources/admin/AdminConsole.java
index 090a2df..9104ea9 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/AdminConsole.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/AdminConsole.java
@@ -30,6 +30,7 @@ import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
+import javax.ws.rs.core.CacheControl;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.Response;
@@ -314,13 +315,17 @@ public class AdminConsole {
         }
 
         try {
-            //logger.info("getting resource: " + path + " uri: " + uriInfo.getRequestUri().toString());
             ExtendingThemeManager themeManager = new ExtendingThemeManager(providerSession);
             Theme theme = themeManager.createTheme(realm.getAdminTheme(), Theme.Type.ADMIN);
             InputStream resource = theme.getResourceAsStream(path);
             if (resource != null) {
                 String contentType = mimeTypes.getContentType(path);
-                return Response.ok(resource).type(contentType).build();
+
+                CacheControl cacheControl = new CacheControl();
+                cacheControl.setNoTransform(false);
+                cacheControl.setMaxAge(themeManager.getStaticMaxAge());
+
+                return Response.ok(resource).type(contentType).cacheControl(cacheControl).build();
             } else {
                 return Response.status(Response.Status.NOT_FOUND).build();
             }
diff --git a/services/src/main/java/org/keycloak/services/resources/ThemeResource.java b/services/src/main/java/org/keycloak/services/resources/ThemeResource.java
index 84413a3..55509d9 100755
--- a/services/src/main/java/org/keycloak/services/resources/ThemeResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/ThemeResource.java
@@ -11,6 +11,7 @@ import javax.activation.MimetypesFileTypeMap;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
+import javax.ws.rs.core.CacheControl;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.Response;
 import java.io.InputStream;
@@ -39,14 +40,18 @@ public class ThemeResource {
      * @return
      */
     @GET
-    @Path("/{themType}/{themeName}/{path:.*}")
-    public Response getResource(@PathParam("themType") String themType, @PathParam("themeName") String themeName, @PathParam("path") String path) {
+    @Path("/{themeType}/{themeName}/{path:.*}")
+    public Response getResource(@PathParam("themeType") String themType, @PathParam("themeName") String themeName, @PathParam("path") String path) {
         try {
             ExtendingThemeManager themeManager = new ExtendingThemeManager(providerSession);
             Theme theme = themeManager.createTheme(themeName, Theme.Type.valueOf(themType.toUpperCase()));
             InputStream resource = theme.getResourceAsStream(path);
             if (resource != null) {
-                return Response.ok(resource).type(mimeTypes.getContentType(path)).build();
+                CacheControl cacheControl = new CacheControl();
+                cacheControl.setNoTransform(false);
+                cacheControl.setMaxAge(themeManager.getStaticMaxAge());
+
+                return Response.ok(resource).type(mimeTypes.getContentType(path)).cacheControl(cacheControl).build();
             } else {
                 return Response.status(Response.Status.NOT_FOUND).build();
             }
diff --git a/testsuite/integration/src/main/resources/META-INF/keycloak-server.json b/testsuite/integration/src/main/resources/META-INF/keycloak-server.json
index 13b70f8..9d71a16 100755
--- a/testsuite/integration/src/main/resources/META-INF/keycloak-server.json
+++ b/testsuite/integration/src/main/resources/META-INF/keycloak-server.json
@@ -29,6 +29,7 @@
 
     "theme": {
         "default": "keycloak",
+        "staticMaxAge": 2592000,
         "folder": {
             "dir": "${keycloak.theme.dir}"
         }