This is an automated email from the ASF dual-hosted git repository.
markt-asf pushed a commit to branch 9.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/9.0.x by this push:
new e9fb42c864 Take account of headers set in a previous filter
e9fb42c864 is described below
commit e9fb42c864c06475911c8d52b4ef1987f4a11533
Author: Mark Thomas <[email protected]>
AuthorDate: Tue Nov 3 18:57:53 2026 +0000
Take account of headers set in a previous filter
---
.../org/apache/catalina/filters/ExpiresFilter.java | 29 ++++++++++++++++++++--
webapps/docs/changelog.xml | 5 ++++
2 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/java/org/apache/catalina/filters/ExpiresFilter.java
b/java/org/apache/catalina/filters/ExpiresFilter.java
index 9d7f738dc7..4cee2c2666 100644
--- a/java/org/apache/catalina/filters/ExpiresFilter.java
+++ b/java/org/apache/catalina/filters/ExpiresFilter.java
@@ -574,6 +574,8 @@ public class ExpiresFilter extends FilterBase {
*/
private String cacheControlHeader;
+ private boolean wrappedCacheControlHeaderRead;
+
/**
* Value of the {@code Last-Modified} HTTP response header if it has
been set.
*/
@@ -584,6 +586,7 @@ public class ExpiresFilter extends FilterBase {
private PrintWriter printWriter;
private final HttpServletRequest request;
+ private final HttpServletResponse response;
private ServletOutputStream servletOutputStream;
@@ -602,6 +605,7 @@ public class ExpiresFilter extends FilterBase {
public XHttpServletResponse(HttpServletRequest request,
HttpServletResponse response) {
super(response);
this.request = request;
+ this.response = response;
}
@Override
@@ -617,8 +621,12 @@ public class ExpiresFilter extends FilterBase {
@Override
public void addHeader(String name, String value) {
+ boolean isCacheControlHeader =
HEADER_CACHE_CONTROL.equalsIgnoreCase(name);
+ if (isCacheControlHeader) {
+ synchroniseCacheControlHeader();
+ }
super.addHeader(name, value);
- if (HEADER_CACHE_CONTROL.equalsIgnoreCase(name)) {
+ if (isCacheControlHeader) {
if (cacheControlHeader == null) {
cacheControlHeader = value;
} else {
@@ -633,6 +641,7 @@ public class ExpiresFilter extends FilterBase {
* @return the Cache-Control header value, or {@code null} if not set
*/
public String getCacheControlHeader() {
+ synchroniseCacheControlHeader();
return cacheControlHeader;
}
@@ -685,6 +694,7 @@ public class ExpiresFilter extends FilterBase {
this.lastModifiedHeader = 0;
this.lastModifiedHeaderSet = false;
this.cacheControlHeader = null;
+ this.wrappedCacheControlHeaderRead = false;
}
@Override
@@ -701,6 +711,21 @@ public class ExpiresFilter extends FilterBase {
super.setHeader(name, value);
if (HEADER_CACHE_CONTROL.equalsIgnoreCase(name)) {
this.cacheControlHeader = value;
+ this.wrappedCacheControlHeaderRead = true;
+ }
+ }
+
+ /*
+ * Copy any existing cache control headers from the wrapped response
to the local copy. Only do this once to
+ * avoid duplicates. Subsequent calls to this method will be NO-OPs
unless reset() is called.
+ */
+ private void synchroniseCacheControlHeader() {
+ if (!wrappedCacheControlHeaderRead) {
+ wrappedCacheControlHeaderRead = true;
+ String originalCacheControlHeader =
StringUtils.join(response.getHeaders(HEADER_CACHE_CONTROL));
+ if (!originalCacheControlHeader.isEmpty()) {
+ cacheControlHeader = originalCacheControlHeader;
+ }
}
}
@@ -1613,7 +1638,7 @@ public class ExpiresFilter extends FilterBase {
String cacheControlHeader = response.getCacheControlHeader();
String newCacheControlHeader =
- (cacheControlHeader == null) ? maxAgeDirective :
cacheControlHeader + ", " + maxAgeDirective;
+ (cacheControlHeader == null) ? maxAgeDirective :
cacheControlHeader + "," + maxAgeDirective;
response.setHeader(HEADER_CACHE_CONTROL, newCacheControlHeader);
response.setDateHeader(HEADER_EXPIRES, expirationDate.getTime());
}
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 339217b48a..4c95fda80e 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -310,6 +310,7 @@
pools to share the same name. (remm)
</fix>
<fix>
+<<<<<<< HEAD
Use RequestDispatcher target rather than source when looking up
<code>security-role-ref</code>s for the current Servlet. (markt)
</fix>
@@ -326,6 +327,10 @@
<fix>
Align LockoutRealm with some Realm implementations and ignore leading
and trailing space in user names by default. (markt)
+=======
+ <code>ExpiresFilter</code> now takes account of headers set by a
+ previous filter in the filter chain. (markt)
+>>>>>>> 4908896a8e (Take account of headers set in a previous filter)
</fix>
</changelog>
</subsection>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]