This is an automated email from the ASF dual-hosted git repository.
markt-asf pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/main by this push:
new d999a9fef4 Take account of headers set in a previous filter
d999a9fef4 is described below
commit d999a9fef42104d8b16ea51ccd3a2c920466da48
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 1e140d2ce8..9c7f2f2cea 100644
--- a/java/org/apache/catalina/filters/ExpiresFilter.java
+++ b/java/org/apache/catalina/filters/ExpiresFilter.java
@@ -553,6 +553,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.
*/
@@ -563,6 +565,7 @@ public class ExpiresFilter extends FilterBase {
private PrintWriter printWriter;
private final HttpServletRequest request;
+ private final HttpServletResponse response;
private ServletOutputStream servletOutputStream;
@@ -581,6 +584,7 @@ public class ExpiresFilter extends FilterBase {
public XHttpServletResponse(HttpServletRequest request,
HttpServletResponse response) {
super(response);
this.request = request;
+ this.response = response;
}
@Override
@@ -596,8 +600,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 {
@@ -612,6 +620,7 @@ public class ExpiresFilter extends FilterBase {
* @return the Cache-Control header value, or {@code null} if not set
*/
public String getCacheControlHeader() {
+ synchroniseCacheControlHeader();
return cacheControlHeader;
}
@@ -664,6 +673,7 @@ public class ExpiresFilter extends FilterBase {
this.lastModifiedHeader = 0;
this.lastModifiedHeaderSet = false;
this.cacheControlHeader = null;
+ this.wrappedCacheControlHeaderRead = false;
}
@Override
@@ -680,6 +690,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;
+ }
}
}
@@ -1556,7 +1581,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 cef54e8c0a..c2c4585a60 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -501,6 +501,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>
@@ -517,6 +518,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]