1616 */
1717package com .djrapitops .plan .delivery .webserver ;
1818
19+ import com .djrapitops .plan .PlanSystem ;
1920import com .djrapitops .plan .delivery .domain .container .PlayerContainer ;
2021import com .djrapitops .plan .delivery .domain .keys .PlayerKeys ;
2122import com .djrapitops .plan .delivery .formatting .Formatter ;
3031import com .djrapitops .plan .delivery .web .resolver .ResponseBuilder ;
3132import com .djrapitops .plan .delivery .web .resolver .request .Request ;
3233import com .djrapitops .plan .delivery .web .resource .WebResource ;
34+ import com .djrapitops .plan .delivery .webserver .resolver .ETag ;
3335import com .djrapitops .plan .identification .Identifiers ;
3436import com .djrapitops .plan .identification .ServerUUID ;
3537import com .djrapitops .plan .settings .config .PlanConfig ;
4749import com .djrapitops .plan .utilities .java .Maps ;
4850import com .djrapitops .plan .utilities .java .UnaryChain ;
4951import dagger .Lazy ;
50- import org .apache .commons .codec .digest .DigestUtils ;
5152import org .apache .commons .lang3 .Strings ;
5253import org .apache .commons .text .StringEscapeUtils ;
5354import org .eclipse .jetty .http .HttpHeader ;
@@ -124,9 +125,9 @@ private Response forPage(@Untrusted Request request, Page page) {
124125
125126 private Response forPage (@ Untrusted Request request , Page page , int responseCode ) {
126127 long modified = page .lastModified ();
127- Optional <Long > etag = Identifiers .getEtag (request );
128+ Optional <ETag > etag = Identifiers .getEtag (request );
128129
129- if (etag .isPresent () && modified == etag .get ()) {
130+ if (etag .isPresent () && etag .get (). isOutdated ( modified )) {
130131 return browserCachedNotChangedResponse ();
131132 }
132133
@@ -171,10 +172,10 @@ private Response buildDBNotOpenResponse(Database.State dbState) throws IOExcepti
171172 .build ();
172173 }
173174
174- private Response getCachedOrNew (long modified , String fileName , Function <String , Response > newResponseFunction ) {
175+ private Response getCachedOrNew (ETag etag , String fileName , Function <String , Response > newResponseFunction ) {
175176 WebResource resource = getPublicOrJarResource (fileName );
176177 Optional <Long > lastModified = resource .getLastModified ();
177- if (lastModified .isPresent () && modified == lastModified . get ()) {
178+ if (lastModified .isPresent () && etag . isOutdated ( lastModified . get (), () -> "config-" + PlanSystem . LAST_RELOAD . get () )) {
178179 return browserCachedNotChangedResponse ();
179180 } else {
180181 return newResponseFunction .apply (fileName );
@@ -206,8 +207,8 @@ public Response rawPlayerPageResponse(UUID playerUUID) {
206207 .build ();
207208 }
208209
209- public Response javaScriptResponse (long modified , @ Untrusted String fileName ) {
210- return getCachedOrNew (modified , fileName , this ::javaScriptResponse );
210+ public Response javaScriptResponse (ETag etag , @ Untrusted String fileName ) {
211+ return getCachedOrNew (etag , fileName , this ::javaScriptResponse );
211212 }
212213
213214 public Response javaScriptResponse (@ Untrusted String fileName ) {
@@ -235,7 +236,7 @@ public Response javaScriptResponse(@Untrusted String fileName) {
235236 resource .getLastModified ().ifPresent (lastModified -> responseBuilder
236237 .setHeader (HttpHeader .CACHE_CONTROL .asString (), alwaysCheckRefetch ? CacheStrategy .CHECK_ETAG : CacheStrategy .CACHE_IN_BROWSER )
237238 .setHeader (HttpHeader .LAST_MODIFIED .asString (), httpLastModifiedFormatter .apply (lastModified ))
238- .setHeader (HttpHeader .ETAG .asString (), alwaysCheckRefetch ? DigestUtils . sha256Hex ( content ) : lastModified ));
239+ .setHeader (HttpHeader .ETAG .asString (), alwaysCheckRefetch ? "config-" + PlanSystem . LAST_RELOAD . get ( ) : lastModified ));
239240 }
240241 return responseBuilder .build ();
241242 } catch (UncheckedIOException e ) {
@@ -249,8 +250,8 @@ private String replaceMainAddressPlaceholder(String resource) {
249250 return Strings .CS .replace (resource , "PLAN_BASE_ADDRESS" , address );
250251 }
251252
252- public Response cssResponse (long modified , @ Untrusted String fileName ) {
253- return getCachedOrNew (modified , fileName , this ::cssResponse );
253+ public Response cssResponse (ETag etag , @ Untrusted String fileName ) {
254+ return getCachedOrNew (etag , fileName , this ::cssResponse );
254255 }
255256
256257 public Response cssResponse (@ Untrusted String fileName ) {
@@ -278,8 +279,8 @@ public Response cssResponse(@Untrusted String fileName) {
278279 }
279280 }
280281
281- public Response imageResponse (long modified , @ Untrusted String fileName ) {
282- return getCachedOrNew (modified , fileName , this ::imageResponse );
282+ public Response imageResponse (ETag eTag , @ Untrusted String fileName ) {
283+ return getCachedOrNew (eTag , fileName , this ::imageResponse );
283284 }
284285
285286 public Response imageResponse (@ Untrusted String fileName ) {
@@ -302,7 +303,7 @@ public Response imageResponse(@Untrusted String fileName) {
302303 }
303304 }
304305
305- public Response fontResponse (long modified , @ Untrusted String fileName ) {
306+ public Response fontResponse (ETag modified , @ Untrusted String fileName ) {
306307 return getCachedOrNew (modified , fileName , this ::fontResponse );
307308 }
308309
@@ -337,15 +338,15 @@ public Response fontResponse(@Untrusted String fileName) {
337338 }
338339 }
339340
340- public Response publicHtmlResourceResponse (long modified , @ Untrusted String fileName , String mimeType ) {
341+ public Response publicHtmlResourceResponse (ETag etag , @ Untrusted String fileName , String mimeType ) {
341342 // Slightly different from getCachedOrNew
342343 WebResource resource = publicHtmlFiles .findPublicHtmlResource (fileName )
343344 .map (Resource ::asWebResource )
344345 .orElse (null );
345346 if (resource == null ) return null ;
346347
347348 Optional <Long > lastModified = resource .getLastModified ();
348- if (lastModified .isPresent () && modified == lastModified .get ()) {
349+ if (lastModified .isPresent () && etag . isOutdated ( lastModified .get () )) {
349350 return browserCachedNotChangedResponse ();
350351 } else {
351352 return publicHtmlResourceResponse (fileName , mimeType );
@@ -573,8 +574,8 @@ public Response themeResponse(@Untrusted String themeName, Request request) {
573574 .asWebResource ();
574575
575576 Optional <Long > lastModified = foundTheme .getLastModified ();
576- @ Untrusted Optional <Long > tag = Identifiers .getEtag (request );
577- if (tag .isPresent () && lastModified .isPresent () && tag .get () >= lastModified .get ()) {
577+ @ Untrusted Optional <ETag > tag = Identifiers .getEtag (request );
578+ if (tag .isPresent () && lastModified .isPresent () && tag .get (). isOutdated ( lastModified .get () )) {
578579 return browserCachedNotChangedResponse ();
579580 } else {
580581 long date = lastModified .orElseGet (System ::currentTimeMillis );
0 commit comments