From cdda83942617b2094da8b405ca8aeb88bcb47d74 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Thu, 7 Jan 2016 18:11:06 +0100 Subject: [PATCH] XML configuration support for RFC 5861 This commit adds the XML+XSD configuration part of the RFC 5861 Cache-Control directives added in Spring's `CacheControl`. Issue: SPR-13841 --- .../springframework/http/CacheControl.java | 60 +++++++++---------- .../http/CacheControlTests.java | 2 +- .../config/ResourcesBeanDefinitionParser.java | 10 +++- .../web/servlet/config/spring-mvc-4.3.xsd | 16 +++++ 4 files changed, 56 insertions(+), 32 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/CacheControl.java b/spring-web/src/main/java/org/springframework/http/CacheControl.java index 2685661798..fbdc5691a1 100644 --- a/spring-web/src/main/java/org/springframework/http/CacheControl.java +++ b/spring-web/src/main/java/org/springframework/http/CacheControl.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2015 the original author or authors. + * Copyright 2002-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -212,34 +212,34 @@ public class CacheControl { } /** - * Add an "stale-while-revalidate" directive. - *

This directive indicates that caches MAY serve the response in - * which it appears after it becomes stale, up to the indicated number of seconds. - * If a cached response is served stale due to the presence of this extension, - * the cache SHOULD attempt to revalidate it while still serving stale responses (i.e., without blocking). - * @param staleWhileRevalidate the maximum time the response should be used while being revalidated - * @param unit the time unit of the {@code sMaxAge} argument - * @return {@code this}, to facilitate method chaining - * @see rfc5861 section 3 - */ - public CacheControl staleWhileRevalidate(long staleWhileRevalidate, TimeUnit unit) { - this.staleWhileRevalidate = unit.toSeconds(staleWhileRevalidate); - return this; - } + * Add a "stale-while-revalidate" directive. + *

This directive indicates that caches MAY serve the response in + * which it appears after it becomes stale, up to the indicated number of seconds. + * If a cached response is served stale due to the presence of this extension, + * the cache SHOULD attempt to revalidate it while still serving stale responses (i.e., without blocking). + * @param staleWhileRevalidate the maximum time the response should be used while being revalidated + * @param unit the time unit of the {@code staleWhileRevalidate} argument + * @return {@code this}, to facilitate method chaining + * @see rfc5861 section 3 + */ + public CacheControl staleWhileRevalidate(long staleWhileRevalidate, TimeUnit unit) { + this.staleWhileRevalidate = unit.toSeconds(staleWhileRevalidate); + return this; + } - /** - * Add an "stale-if-error" directive. - *

This directive indicates that that when an error is encountered, a cached stale response MAY be used to satisfy - * the request, regardless of other freshness information.. - * @param staleIfError the maximum time the response should be used when errors are encountered - * @param unit the time unit of the {@code sMaxAge} argument - * @return {@code this}, to facilitate method chaining - * @see rfc5861 section 4 - */ - public CacheControl staleIfError(long staleIfError, TimeUnit unit) { - this.staleIfError = unit.toSeconds(staleIfError); - return this; - } + /** + * Add a "stale-if-error" directive. + *

This directive indicates that when an error is encountered, a cached stale response MAY be used to satisfy + * the request, regardless of other freshness information. + * @param staleIfError the maximum time the response should be used when errors are encountered + * @param unit the time unit of the {@code staleIfError} argument + * @return {@code this}, to facilitate method chaining + * @see rfc5861 section 4 + */ + public CacheControl staleIfError(long staleIfError, TimeUnit unit) { + this.staleIfError = unit.toSeconds(staleIfError); + return this; + } /** @@ -275,10 +275,10 @@ public class CacheControl { if (this.sMaxAge != -1) { appendDirective(ccValue, "s-maxage=" + Long.toString(this.sMaxAge)); } - if(this.staleIfError != -1) { + if (this.staleIfError != -1) { appendDirective(ccValue, "stale-if-error=" + Long.toString(this.staleIfError)); } - if(this.staleWhileRevalidate != -1) { + if (this.staleWhileRevalidate != -1) { appendDirective(ccValue, "stale-while-revalidate=" + Long.toString(this.staleWhileRevalidate)); } diff --git a/spring-web/src/test/java/org/springframework/http/CacheControlTests.java b/spring-web/src/test/java/org/springframework/http/CacheControlTests.java index b3c38bc64e..2111d2f1f6 100644 --- a/spring-web/src/test/java/org/springframework/http/CacheControlTests.java +++ b/spring-web/src/test/java/org/springframework/http/CacheControlTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2015 the original author or authors. + * Copyright 2002-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ResourcesBeanDefinitionParser.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ResourcesBeanDefinitionParser.java index f55e287af4..b462c66fb8 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ResourcesBeanDefinitionParser.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ResourcesBeanDefinitionParser.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2015 the original author or authors. + * Copyright 2002-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -242,6 +242,14 @@ class ResourcesBeanDefinitionParser implements BeanDefinitionParser { if (element.hasAttribute("s-maxage")) { cacheControl = cacheControl.sMaxAge(Long.parseLong(element.getAttribute("s-maxage")), TimeUnit.SECONDS); } + if (element.hasAttribute("stale-while-revalidate")) { + cacheControl = cacheControl.staleWhileRevalidate( + Long.parseLong(element.getAttribute("stale-while-revalidate")), TimeUnit.SECONDS); + } + if (element.hasAttribute("stale-if-error")) { + cacheControl = cacheControl.staleIfError( + Long.parseLong(element.getAttribute("stale-if-error")), TimeUnit.SECONDS); + } return cacheControl; } diff --git a/spring-webmvc/src/main/resources/org/springframework/web/servlet/config/spring-mvc-4.3.xsd b/spring-webmvc/src/main/resources/org/springframework/web/servlet/config/spring-mvc-4.3.xsd index ed4a4ffb50..50b90323a2 100644 --- a/spring-webmvc/src/main/resources/org/springframework/web/servlet/config/spring-mvc-4.3.xsd +++ b/spring-webmvc/src/main/resources/org/springframework/web/servlet/config/spring-mvc-4.3.xsd @@ -581,6 +581,22 @@ + + + + + + + + + +