Fix unregistering of UpgradeInfo when a connection is closed. Patch
suggested by abernal. (markt)
jdbc-pool
Fix reproducible build after addition of i18n strings. (markt)
Other
Ignore the bash auto-completion cache for Ant build targets when
building source distributions. (markt)
not released Tomcat 11.0.28 (markt)
General
Switch to using String.strip() rather than
String.trim() where appropriate. (markt)
Catalina
Use the resolved roleBase value when computing the
distinguished name of a group found during a nested role search in
JNDIRealm, so that groups nested more than one level deep
are found when roleBase uses pattern replacements. (remm)
Track the StartTlsResponse used by JNDIRealm
per connection rather than in a single realm-wide field, so that
closing one pooled connection when useStartTls is enabled
no longer terminates the TLS session of another, still active pooled
connection. (remm)
Select the primary or alternate directory server URL for each
JNDIRealm connection attempt individually rather than via
a realm-wide mutable flag that concurrent pooled connections raced on,
which could transiently cause a connection to use the wrong URL. Note
that this removes the connectionAttempt protected field
and changes the signature of the protected
getDirectoryContextEnvironment() method. (remm)
Stop pre-digesting the HTTP DIGEST client digest in
JAASCallbackHandler. The pre-digest, a leftover from the
pre-CredentialHandler design, could never match the
deterministic server digest and so made DIGEST authentication via
JAASRealm always fail whenever the realm's credential
handler algorithm matched the digest algorithm. The client digest is
now passed to the LoginModule unchanged, consistent with
the non-JAAS realms. (remm)
Give the SSI conditional expression operators &&
and || distinct precedences, &&
binding more tightly than ||, consistent with the
convention used by the C-like languages and by Apache HTTP Server
expressions. Previously, mixed chains were evaluated strictly left to
right, so $a || $b && $c was evaluated as
($a || $b) && $c rather than the expected
$a || ($b && $c). Note that this changes the
evaluation of existing documents using unparenthesized mixed
&& and || chains. (remm)
Fix the built-in SSI variables DATE_GMT,
DATE_LOCAL and LAST_MODIFIED always
resolving to null and rendering as
(none). The mediator stored and looked them up as
external variables using names starting with its own fully qualified
class name, which the servlet resolver rejects since those names fall
under the reserved org.apache.catalina. prefix. Hold the
built-in variables in the mediator itself and resolve them there, as
they are per-document values that do not need to be stored in the
external resolver. (remm)
Fix multiple data races in annotation scanning when the
parallelAnnotationScanning attribute of the
StandardContext is enabled. Classes matched for a
ServletContainerInitializer were collected into
non-thread-safe sets, which could silently lose matches. A scanner
thread could also cache an incomplete set of initializers for a class
when another thread had not finished adding that class' super class or
interfaces to the shared class cache, and the lazily computed set was
not safely published between threads. Matched classes could therefore
be missing from the set passed to
ServletContainerInitializer.onStartup(), misconfiguring
the application at runtime. (remm)
When automatic migration of a legacy Java EE web application from
the legacyAppBase to the appBase failed
after the previous version of the application had been moved aside,
the previous application was left in a temporary location from which
it was neither restored nor cleaned up, making it effectively lost.
The previous application is now restored to the deployment location
when the migrated application cannot be placed, and is retained with
a warning in the temporary location only in the rare cases where
restoring it is not possible. (remm)
Fix the ManagerSF store configuration factory always
treating a started StandardManager as non-default, since
the manager propagates its (possibly null) node identifier
to its session ID generator when it starts, which the default check
compared against an empty string. This caused a redundant
Manager element with a nested
SessionIdGenerator to be written for every context using
the default manager configuration when the running configuration was
stored. The default check was strengthened to require the exact
manager and session ID generator classes and to test
throwOnFailure, so the now reachable skip path cannot
silently drop a customised configuration. (remm)
Correctly handle error reports that cannot be proxied by
ProxyErrorReportValve. Previously, a relative location
or an unreachable, non-HTTP or failing proxy target resulted in an
empty response with only the error status set. The valve now falls
back to the error report of the default ErrorReportValve
in these cases, no longer applies proxy target metadata to the
response before the target response has been received, restricts
proxying to absolute HTTP and HTTPS URLs and applies connect and
read timeouts to the connection to the proxy target. (remm)
Make the selection of the effective parameter limits by
ParameterLimitValve deterministic when several configured
URL patterns match a request. Previously, the first matching pattern
was encountered in hash map iteration order, which is arbitrary for
java.util.regex.Pattern keys and could change between JVM
restarts. The limits are now stored in configuration order and the
first matching pattern in configuration order is applied. (remm)
When the Servlet asynchronous processing mechanism is used,
SemaphoreValve no longer attempts to acquire a second
permit when the request is dispatched back to the container. A
saturated semaphore previously rejected such a dispatch with a 503
response or an IllegalStateException. The permit
obtained when asynchronous processing starts is now released when
that asynchronous processing completes or fails. (remm)
Correct the values of the TIME_MON and
TIME_WDAY server variables in the rewrite valve, which
exposed the raw java.util.Calendar fields (month 0-11,
day of week 1-7 with Sunday first) instead of the documented
mod_rewrite values (month 1-12, day of week 0-6 with Sunday being 0).
(remm)
Stop resolving the REMOTE_IDENT server variable of the
rewrite valve to the authenticated user name. REMOTE_IDENT
is the RFC 931 ident protocol user name, which Tomcat does not support.
It now resolves to undefined, expanding to an empty string, instead of
silently turning ident-based rules into authentication checks. (remm)
Refactor the default Servlet Accept-Encoding handling to
use the common HTTP header parser for processing these headers. (markt)
Connector compression will now enable gzip compression with a request
header of the form Accept-Encoding: *. (markt)
Mark JAASRealm as a deprecated component. JAASRealm will be removed in
Tomcat 12. (schultz)
Rework maxLocaleCount behavior to ignore extra locales
when parsed instead of throwing an ISE, since a request remains
functionally coherent. (remm)
Include an Allow header when HttpServlet sends
a 405 response. Based on pull request #1103 by Arturo Bernal.
(markt)
Ensure the DefaultServlet returns the correct Allow header for
PATCH and QUERY requests. (markt)
Correctly parse RFC 850 formatted dates with two digit years where the
date appears to be more than 50 years in the future as required by RFC
9110. Treat the year as the most recent year in the past that had the
same last two digits. Based on pull request #1104 by Arturo
Bernal. (markt)
Validate that applications calling
HttpServletRequest.upgrade are also setting the
upgrade header on the response. Attempted upgrades without
this header will now fail. (markt)
Ensure that requests cannot try to start asynchronous processing and the
HTTP upgrade process on the same request. (markt)
Align the format of the TIME_MON, TIME_DAY,
TIME_HOUR, TIME_MIN, TIME_SEC
and TIME server variables in the rewrite valve with
mod_rewrite. The first five are now zero padded to two digits and
TIME is now of the form yyyyMMddHHmmss
rather than an HTTP date.
Refactor to reduce duplication and improve consistency when working with
resources in multi-release JAR files. Versions that include signs,
leading zeros or values less than 8 are no longer considered valid. All
types of resources, not just class files, are now handled in
multi-release JAR files. (markt)
Singleton JNDI resources built by the Tomcat JDBC pool factory that do
not configure the pool's object_name attribute are now
given a container-generated pool name, of the form
domain/host/context-path/JNDI-name for webapp resources
and domain/JNDI-name for global resources. Previously,
the pool generated a name that repeated across pools, which caused
pools to share the same name. (remm)
Use RequestDispatcher target rather than source when looking up
security-role-refs for the current Servlet. (markt)
As per the Jakarta Authentication specification, an
AuthException during
serverAuthContext.secureResponse() should result in an
internal server error (500) response. (markt)
Do not depend on the content length being defined when processing
request bodies with the CGI Servlet. (csutherl)
Align LockoutRealm with some Realm implementations and ignore leading
and trailing space in user names by default. (markt)
ExpiresFilter now takes account of headers set by a
previous filter in the filter chain. (markt)
70290: Fix a leak of the in-progress async request count
that could prevent a clean shutdown. If the connection was in an error
state when the initial async service call completed (for example, a
client dropped the connection and an
AsyncListener.onError() handler then called
AsyncContext.dispatch()), the request could be recycled
while still in the MUST_DISPATCH state so that
onComplete() was not called and the in-progress async
count was not decremented. In addition, when the error state still
permits I/O, output buffered before the request was completed is now
written rather than being discarded. Also fix a case where the async
processing never ended if the response had been committed and the
connection was then closed after the application had requested a
dispatch or completion, and ensure
AsyncListener.onError() is called when the container
reports an error without an exception. (markt)
Coyote
Keep the asynchronous timeout in place until the timeout event has
been processed, rather than clearing it when the event is dispatched.
A dispatched event may be discarded without being processed, for
example when no container thread is available to process it, which
previously left the asynchronous request running without any timeout.
(remm)
Stop reporting available bytes once a request body that was buffered
to allow a TLS client authentication renegotiation has been read in
full. Reporting the buffered length, or data belonging to a pipelined
next request, as available after the end of the stream was reached
violated the ServletInputStream contract and could keep
an application loop that polls available() running.
(remm)
Report a clean end of input on an upgraded connection as end of
stream, with blocking and non-blocking reads returning
-1 and the non-blocking ReadListener
receiving onAllDataRead(), rather than as an error with
an EOFException. Also ensure that no further
ReadListener call-backs occur once an error has been
reported to the listener, or once the end of the data has been
reported. (remm)
Report an error to the WriteListener of an upgraded
connection at most once and stop triggering further call-backs once
an error has been reported. A single failure to flush the output was
previously reported to the listener multiple times. (remm)
When releasing the HTTP/2 connection back log, cap the allocation to
each stream at the connection window capacity that remains to be
distributed, decrement that capacity by every allocation made and stop
distributing once it is exhausted. Previously, when the capacity was
exhausted by incremental streams, allocations could exceed the capacity
the client had made available, since every incremental stream received
a share rounded up to at least one byte and non-incremental streams at
the same urgency level received a share computed using a denominator
that only counted incremental streams. The connection could then send
more data than the client's flow control window allowed, which a
compliant client must treat as a connection error of type
FLOW_CONTROL_ERROR. Streams that are left without an
allocation remain in the back log and are considered again when the
next window increment arrives. Any part of the increment left
unallocated by the rounding of the proportional shares is allocated to
the waiting streams in priority order rather than being lost. (remm)
Permit the WINDOW_UPDATE and RST_STREAM
frames that may legitimately be in flight when an HTTP/2 stream is
closed by the receipt of an end of stream frame, rather than treating
them as a connection error of type STREAM_CLOSED that
closes the entire connection. These frames are already permitted when
the stream is closed in the other direction. (remm)
Correct the DER INTEGER encoding produced by
Asn1Writer.writeInteger() for multi-byte values and add
the leading zero byte required by DER for positive values whose most
significant bit is set. The length calculation loops in
writeInteger() and writeTag() were also
corrected to terminate, since the Java shift distance is evaluated
modulo 32. (remm)
The JSON parser now accepts numbers that have an exponent but no
fraction, such as 1e5, as required by RFC 8259. Note that
when the lenient dialect is used, a bare object key that is such a
number (for example {1e5:1}) is now a number and the key
is the string form of the parsed number (1E+5) rather than
the original text, as already happened for bare keys that have both a
fraction and an exponent. Quoted keys are not affected. Numbers with an
exponent that is too large or too small to be represented are now
rejected with a ParseException rather than an unchecked
NumberFormatException. (remm)
With native numbers enabled, the JSON parser now returns integers that
do not fit in a long as BigInteger rather than
failing with an unchecked NumberFormatException. (remm)
The JSON parser now rejects input with a nesting depth greater than
1000 with a ParseException. Previously, deeply nested
input caused a StackOverflowError since the parser
recursed once per nesting level with no limit. RFC 8259 allows
implementations to set a limit on the maximum depth of nesting.
(remm)
Ensure the Tomcat Native based OpenSSL SSLContext does not
drop TLS 1.3 when rebuilding the list of enabled protocols during
initialization. (dsoumis)
In the OpenSSL cipher configuration parser, treat an AND expression
(+) that contains an unknown term as matching no ciphers
and log a warning, rather than silently ignoring the unknown term and
using only the known terms. This matches OpenSSL behavior, where such
an expression results in no cipher match. (remm)
In the OpenSSL cipher name conversion, ignore the unimplemented SSLv2
ciphers so that names shared with a modern cipher, for example
RC4-MD5, resolve to the JSSE name of the modern cipher
rather than returning null, and so that names matching
only an SSLv2 cipher no longer resolve to a non-standard name.
Ambiguous and unknown names still resolve to null; the
OpenSSL engine implementations now filter such unmapped names rather
than adding null to the lists of cipher suites they
expose. (remm)
Correct the computation of the authentication method passed to a custom
X509TrustManager by the FFM based OpenSSL implementation.
The key exchange and authentication NIDs of the negotiated cipher were
compared against legacy OpenSSL flag values rather than the actual NID
constants, so the trust manager received UNKNOWN as the
authentication type for almost every cipher suite. The computation now
matches the one performed by the JNI based implementation. (remm)
Correct the selection of multi-release JAR entries by the
jar:file: and file: based JAR
implementation used when scanning. The entry selected for a class
present with multiple versions depended on the order of the entries
in the JAR, so an older version, or a version intended for a later
runtime, could be scanned instead of the version the runtime would
use. The highest applicable version is now selected, independently
of the entry order, matching the behaviour of the stream based JAR
implementation. (remm)
Correct the accounting of the count of submitted tasks that
ThreadPoolExecutor maintains for TaskQueue.
The count was not always adjusted when a submitted task could no
longer complete, such as when a rejected execution handler did not
throw, or when a queued task was removed. A drifted value caused
thread pools with idle threads to create unnecessary threads.
(remm)
Correct Asn1Parser.parseLength() to report the actual decoded
length instead of a placeholder value when the length is valid but exceeds
the available input data, and to use a distinct, accurate message when a
length cannot be represented by this implementation due to Java's 32-bit
signed int limitation rather than misreporting it as an
invalid length. (michaelo)
Align the OCSP checking performed by the OpenSSL/Panama based
implementation of SSLEngine with the behaviour of the
JSSE based implementation so that a certificate that is itself a
trust anchor (whether a self-signed root or a certificate trusted
directly via the configured trust store) is not subject to OCSP
checking. (markt)
Add support for configuring TLS pre-shared keys under an
SSLHostConfig. (markt)
Add TLS pre-shared key support to the OpenSSL FFM implementation.
(markt)
70286: Strip the script tag in the
AcceptLanguage2 parser. If the script subtag needs to be
preserved, use the standard parser by setting the system property
org.apache.tomcat.util.http.parser.StandardAcceptLanguageParser
to true. (remm)
Detect and disconnect a mis-behaving HTTP/2 client that sends large
numbers of unexpected settings acknowledgement frames. (markt)
Fix excessive CPU usage after a client half-closes an upgraded
connection while the application keeps the output stream open to finish
its response. Stop polling for input at end of stream and ensure that a
subsequent WebConnection.close() closes the connection.
(markt)
Fix rejection of large HTTP/2 response headers that fit within a frame
after HPACK compression. Allow the encoding workspace to grow to the
larger of twice the peer's advertised maximum frame payload size and
the peer's dynamic table capacity, so indexed fields remain usable after
a frame size reduction. Check the encoded payload against the peer's
frame size limit before writing it and close the connection with an
INTERNAL_ERROR if a header block can not be written. (markt)
70305: Move callback registrations in FFM code to the
SSL context. (remm)
When a Certificate is configured using a key store and no
certificateKeyAlias is set, ignore key entries whose
certificate has a malformed Extended Key Usage extension or one that
does not permit TLS server authentication when automatically selecting
which key in the key store to use. A configured
certificateKeyAlias is used even if its certificate is not
valid for TLS server authentication, except in the Windows-MY key store
accessed through the SunMSCAPI provider: there, if the configured
certificate is not valid but the store holds a valid certificate under
that alias with a numeric suffix appended - the format that provider uses
to give unique aliases to several certificates that share a name - the
suffixed certificate is used instead.
(dsoumis)
When validating HTTP/2 frames, make sure more serious errors take
priority over less serious errors. (markt)
Ensure that NIO2 connections are closed gracefully. On Windows, closing
an NIO2 connection with a read pending previously aborted the
connection, so the client saw a connection reset rather than the end of
the stream and could lose response data it had not yet read. (markt)
Ensure that time spent processing the TLS handshake with NIO, such as
OCSP checks of client certificates, is not counted towards the
connection timeout. Previously, a slow handshake could cause the
connection to be closed as soon as the server started waiting for the
client. (markt)
Jasper
Correct the handling of the -- argument by
jspc. The argument position was advanced past the full
stop argument on each iteration while collecting the JSP file
arguments, so every second file argument after -- was
silently omitted from processing. Option parsing now stops at the
first full stop argument wherever it appears. (remm)
When removing white-space only template text nodes from the body of a
jsp:attribute action while parsing a JSP document, the
node that was shifted into the vacated position is now re-examined.
Previously it was skipped, which, for bodies containing adjacent
template text nodes such as those produced by CDATA sections, could
leave a white-space only text node in the body or prevent the final
text node from being trimmed when trim was
true. (remm)
Correct the assignability check GraalBeanELResolver uses
when selecting a setter for an EL value. The check was inverted, so a
setter whose parameter type was a super-type of the value type, for
example a setter taking Object or an interface, was
rejected and EL writes to such properties could be silently dropped
when running in a GraalVM native image. (remm)
The tag plugins for c:when and c:otherwise
now fall back to the standard tag handlers when the direct parent tag
is not a plugin enabled c:choose. Previously, they
generated unbalanced Java code for such misplaced tags, for example a
c:when nested directly in a c:forEach, which
failed the translation of the entire page instead of reporting the
illegal nesting at runtime as the reference implementation does.
(remm)
The tag plugins for c:import and c:param now
share the working URL of the import tag through the plugin context
rather than the page scope attribute url_without_param.
The import plugin set that attribute while generating the tag body and
removed it afterwards, clobbering an application attribute of the same
name, and the fixed name made the exchange prone to interference
between nested URL tags. This matches the reference implementation,
which keeps the parameters of each tag to itself and never touches
page scope attributes. (remm)
The tag plugin for c:out now uses its body as the
fallback for a null value like the standard tag handler does: the
body content is captured, trimmed, then written with escaping
according to the escapeXml attribute, and the capture
is unwound if the body fails. The plugin previously wrote the body
inline, including its surrounding whitespace, and did not escape
the body content. (remm)
The tag plugin for c:set now handles a deferred value
expression (#{...}) with a var attribute
like the standard tag handler does. Such a value is passed to the
tag as a value expression object, and it is now stored as a mapping
in the variable mapper of the EL context, where it evaluates
lazily, rather than being stored as an attribute holding the raw
expression object. As in the standard handler, a non-page scope is
rejected for a deferred value, and mappings that would shadow a
plain attribute are removed. (remm)
The tag plugin for c:set now falls back to the standard
tag handler when the tag has a value but neither a
var nor a target attribute, so that the
invalid use fails as it does with the handler instead of being
silently ignored. (remm)
The tag plugins for c:url and c:redirect
now strip a trailing slash from a context path before
joining it with the URL, as the standard tag handlers do, so that a
context path ending in a slash no longer produces a resolved path
with a doubled slash. Previously only the root context was handled.
(remm)
The tag plugins for c:url, c:redirect and
c:param now share the working URL of the URL tag through
the plugin context rather than the page scope attribute
url_without_param. That fixed name overwrote an
application attribute of the same name while the tag body was
processed and removed it afterwards, and it let a nested URL tag
destroy the outer tag's URL, which then silently rendered as
null. This matches the reference implementation, which
keeps the parameters of each tag to itself and never touches page
scope attributes. (remm)
The tag plugins for c:url, c:redirect and
c:import now insert the parameters of nested
c:param tags ahead of any query string already present in
the URL, as the standard tag handlers do. A c:param that
the plugin cannot append to inline, because it is nested in a tag that
is generated by its standard tag handler, now returns the enclosing
URL tag to its standard handler instead of failing at runtime.
(markt)
RecordELResolver no longer prevents
BeanELResolver from resolving bean-style properties (such
as isValid()) on a Record. (markt)
Fix a JAR file handle leak when a tag file specifies an unsupported
pageEncoding. Close the input stream if reader creation
fails so that its reference to the JAR is released. (remm)
Cluster
When the cluster receiver automatically binds to a port other than the
configured port, retain the configured port,
securePort and udpPort values and expose the
bound ports via the new read-only boundPort,
boundSecurePort and boundUdpPort properties
so that the configured values are not lost when the configuration is
stored. (markt)
Preserve the interrupt status of threads that are interrupted while
waiting in the cluster code (sender and receiver shutdown, membership
start-up and recovery, heartbeat checks and coordinator elections),
report an interrupt while waiting for a pooled sender as such rather
than as a time out and measure the wait for a pooled sender with a
monotonic clock. (markt)
WebSocket
Make the WebSocket client secure channel wrapper,
AsyncChannelWrapperSecure, honor the timeout specified for
write operations so a stalled peer cannot block the write thread
indefinitely. (remm)
Correct the calculation of the digest response value by
the WebSocket client when the server uses qop="auth-int".
The hash of the (empty) entity body was omitted, resulting in an
incorrect response that the server always rejected. (remm)
Encode the credentials used for basic authentication by the WebSocket
client with UTF-8 by default rather than ISO-8859-1, and reject
challenges that specify a charset other than UTF-8, the only value
RFC 7617 allows. (remm)
Fix the entries returned by
CaseInsensitiveKeyMap.entrySet() so they implement the
Map.Entryequals() and hashCode()
contracts. This map backs the WebSocket handshake request and response
header maps. Pull request #1075 provided by breken-ai. (markt)
Improve resource clean-up during WebSocket error handling. (remm)
Web applications
Host Manager: Host names are now always converted to lower case before
use. (markt)
Documentation: Expand the documentation of the
maxHttpRequestHeaderSize attribute for the HTTP connector.
(markt)
Documentation: Describe how to configure the Windows certificate store
and reload externally renewed TLS certificates. (dsoumis)
Tribes
When the MessageDispatchInterceptor is configured with
useDeepClone="false", asynchronously sent messages are now
detached from the caller's buffer with a shallow clone before being
queued. Previously, the buffer could be returned to the send buffer pool
and reused by a concurrent send while the queued message still
referenced it, corrupting the transmitted data. (remm)
Fix the queue size accounting of the
MessageDispatchInterceptor. The message length
recorded when a message is queued is now also the length used
to release the accounting when the send completes. Previously,
when a downstream interceptor like
EncryptInterceptor or
FragmentationInterceptor replaced or extended the
message payload while the message was sent, the recorded queue
size drifted towards negative values and the
maxQueueSize limit eventually stopped being
enforced. (remm)
The NonBlockingCoordinator now uses a separate,
configurable mergeAliveTimeout with a default of
one second for the TCP liveness checks that run while merging
an arriving coordination message, instead of the 15 second
coordination message wait timeout. Members that do not respond
within this timeout are excluded from the merged view and the
exclusion is now logged. (remm)
The TcpFailureDetector now performs its TCP
liveness checks outside the membership monitor, and only
applies the result after re-acquiring the monitor and
re-checking that the membership state has not changed in the
meantime. Previously, the network I/O, up to the configured
connection timeout for each member, was performed while
holding the monitor, which blocked every other membership
operation and update for seconds during a network outage.
Member events forwarded by the interceptor are also no longer
sent while holding the monitor, removing a potential deadlock
with membership listeners that call back into the
interceptor. (remm)
When a node that is configured with the
StaticMembershipInterceptor is also discovered
dynamically, the StaticMembershipInterceptor now
replaces the statically configured member with the dynamically
discovered member if the host and all of the ports (TCP, secure
and UDP) match. Previously, the node was a member twice because
the unique id of a dynamically discovered member is random and
can not match the statically configured unique id, and every
message sent to all members was sent to the node twice. If only
some of the ports match, the mismatch is logged as a
configuration error and the members are not merged. The
failure detector is told to forget the statically configured
member before the discovered member is announced, so that it is
not added again by the member checks. If the dynamically
discovered member disappears, the statically configured member
is restored. A second statically configured member with the
same host and ports as an earlier one is logged as a
configuration error and ignored. (markt)
The TwoPhaseCommitInterceptor now forwards the
interceptor payload, and with it the ErrorHandler
supplied by the application, with the original message instead
of with its internal confirmation message. When the
MessageDispatchInterceptor performed the actual
send, completion and error callbacks were previously reported
under the confirmation message's random id, which the
application cannot correlate with the id returned by the send,
and failures of the original message were never reported at
all. (remm)
The TwoPhaseCommitInterceptor now remembers a
confirmation message that arrives before the original message
it confirms, and releases the original as soon as it arrives.
Previously, the confirmation was consumed as an error and the
original message was silently dropped when it arrived and no
further confirmation ever followed, so a single moment of
network reordering cost one lost cluster message. (remm)
The AbstractReplicatedMap now holds the map
members lock and the state lock only briefly. The entry
relocation triggered by the ping expiry runs outside the map
members lock, the backup selection for a newly added member
outside the state lock, and the (de)serialization of the map
content for a member joining or transferring its state
likewise outside the state lock. Previously, a slow send to a
dead member or the serialization of a large map blocked every
session operation and the state transfer of joining members
for the duration of that work. (remm)
The udpRxBufSize and udpTxBufSize configured
on the cluster channel Sender now take effect for messages
sent using UDP. These two properties were missing from the properties
transferred from the configured sender to the pooled senders and on to
the per-member senders those create, so the datagram socket was always
configured with the default buffer sizes and the configured values were
silently ignored. (remm)
The start of the cluster receiver now fails when the configured bind
address cannot be resolved. Previously, the resolution failure was only
logged and the receiver bound to the wildcard address, silently
exposing the cluster listener on all interfaces instead of the
configured address, while the unresolvable host was advertised to the
other cluster members. (remm)
Add TLS 1.2 and TLS 1.3 pre-shared key support to Apache Tribes. (markt)
jdbc-pool
68436: Reduce the log level from warning to debug for the
message logged when driverClassName is not set, as relying
on DriverManager to locate the driver is a valid
configuration. Pull request #1084 provided by Raphael Vullriede.
(markt)
70269: Correct a regression in the change that reset the
properties of statements cached by the StatementCache
interceptor that meant no statements were cached when using JDBC
drivers, such as H2 and MariaDB Connector/J, that always report
statements as not poolable. Pull request #1083 provided by
Raphael Vullriede. (markt)
Correct a defect that meant closing the connection pool from a thread
that carried an interrupt status, when
propagateInterruptState was set to
true, looped forever without closing any of the pool's
connections. The shutdown drain now always completes and the
interrupted status is propagated once it has. (remm)
Correct a defect that meant a connection borrow that was in flight
while the pool was force-closed could be handed a newly created,
working connection from the closed pool, leaving that physical
connection open indefinitely. The borrow side now honours the closed
flag after the physical connect completes, like the return side
already did, and disconnects the new connection. (remm)
Correct two races in the wake-up protocol between releasing and
waiting threads in the connection pool. Destroying the last connection
while a borrower was about to register as a waiter could leave that
borrower blocked although a slot was free (forever when
maxWait was set to 0 or less), and releasing an already
released connection still injected an extra wake-up placeholder,
inflating the pool size and allowing more physical connections than
maxActive. (remm)
Correct a defect that meant rollbackOnReturn and
commitOnReturn were silently ignored unless
defaultAutoCommit was explicitly set to
false, so a connection returned while still in a
transaction could be handed to the next borrower inside that
transaction. These options now act on the actual transaction state
of the connection being returned. (remm)
Correct a defect in the JDBC connection pool where the cached proxy
constructor ignored the connection kind after the first proxy was
created, so swapping the data source backing a running pool could
proxy later connections of the wrong kind: connections backed by an
XA connection no longer implemented XAConnection, and
plain connections falsely did, with XA method calls on them failing
with a NullPointerException. (remm)
Correct a defect in the ConnectionState interceptor where
the configured connection defaults were restored while the previous
borrower's transaction was still open: the isolation level and the
read only state are transaction scoped on many drivers, so the
restore was refused or deferred and the previous borrower's state
reached the next borrower, and restoring auto-commit committed
whatever the previous borrower had left pending. The interceptor now
terminates the pending transaction before restoring the configured
state, and fails the borrow rather than handing out a connection it
cannot verify. Pools that configure no defaults, and borrows that
need no restore, keep the previous behaviour of leaving the
transaction untouched. (remm)
Correct two defects in the StatementFinalizer
interceptor. Tracked statements were only removed in bulk when the
connection was returned, so a borrow that closed every statement it
created still accumulated one tracking entry per statement created
for the whole borrow cycle; and the tracking relied on weak
references without a queue, so exactly the statements the
interceptor exists for - those an application forgot about - could
be garbage collected before being closed, leaking their
database-side state to the next borrower. Statements are now
tracked with a strong reference in a list guarded against the
pool's cleaner thread, and the statement proxy handed to the
application removes its tracking entry as soon as the application
closes the statement, while a leaked statement is reliably closed
when the connection is returned regardless of the garbage
collector. (remm)
Remove the unfinished, experimental
MultiLockFairBlockingQueue class together with the
unreachable code that referenced it. The class was never
selectable - its instantiation in the pool was commented out and
no configuration property existed to enable it - while its
striped design kept items and waiting threads on unrelated
stripes, so enabling it as it stood could hang borrowers while
idle connections sat in another stripe, report the pool as
exhausted although it was not, lose a connection permanently
whenever a waiting thread was interrupted, and silently disable
the idle connection sweep because the queue's iterator was
always empty. Fair queueing remains available through
FairBlockingQueue. (remm)
Make the JDBC pool fail fast and explicitly when a resource of
type javax.sql.XADataSource is not actually backed
by an XA data source. XA connections are created by the data
source named by the dataSource or
dataSourceJNDI attribute, but the documentation
presented the resource type alone as enabling XA, so the common
driverClassName and url configuration
silently produced a pool of plain JDBC connections that looked
and behaved exactly like a non-XA pool; the missing XA support
only surfaced later, as an opaque generic failure inside the
transaction manager when it requested an XA connection. Such a
request now fails immediately with a message that names the
missing configuration, and the documentation now states the
requirement. (remm)
Make the asynchronous poll of the JDBC pool's fair queue
cancellable. Cancelling the future returned by
pollAsync() was a no-op, so the waiter it had
registered stayed on the queue indefinitely and a later
offer() handed an item – in the pool, a returned
connection – to a future nobody was reading, losing it from the
pool. Cancellation now deregisters the waiter as long as the
item has not already been handed over, a cancelled future fails
its get() methods with
CancellationException instead of blocking forever,
and the pool's own connection future uses this to release its
queue waiter, only falling back to retrieving and closing an
already in-flight connection when the cancellation comes too
late. (remm)
Include the JDBC 4.2 execution methods
executeLargeUpdate() and
executeLargeBatch() in the methods that the query
reporting interceptors recognise as query executions. Slow or
failed large updates and large batches – a common bulk
processing pattern – were never timed, never reported as slow
and never counted in the query statistics, so the monitoring the
interceptors exist to provide silently missed exactly the work
most likely to be slow. (remm)
Always wrap connection handles in the disposable connection
facade. The useDisposableConnectionFacade property
that could switch the facade off is deprecated and no longer has
any effect; it is still accepted so existing configurations keep
loading. Switching the facade off exposed the pool's cached
interceptor chain directly to the application: a handle kept from
an earlier borrow stayed usable and its close returned – or its
calls drove – the connection a later borrower was still using.
(remm)
Keep the abandoned timer alive while a pooled connection is
streaming a result set. The ResetAbandonedTimer
interceptor only reset the timer while a statement was executing,
so a borrower that left a cursor open across a long pause - the
usual reason for configuring a fetch size - appeared idle, and a
connection that was actively streaming could be reported as
abandoned and reclaimed from underneath its borrower. Statement
creation and result-set access through a pooled connection now
also reset the timer, so the abandoned check only reports a
connection that is genuinely making no progress. The
jdbcInterceptors documentation, which listed only
three of the interceptors bundled with the pool, has been
corrected. (remm)
The SlowQueryReportJmx interceptor MBean now exposes
the management surface its metadata declares: the
PoolName and PoolNames attributes and
the resetStats() operation are reachable through
JMX. Previously the MBean interface declared only
SlowQueriesCD, so the attributes and the operation
did not exist on the registered MBean, and once declared,
resetStats() would have thrown an
IllegalStateException whenever statistics were
present. (remm)
The CacheSize attribute of the
StatementCache interceptor MBean is now a plain
int. It used to be a
java.util.concurrent.atomic.AtomicInteger, which
meant that a client reading the attribute from inside the JVM
received the very object the pool uses to enforce its
max cache size, and could change the accounting it
had only come to observe: inflating it stopped the pool from
caching any further statement, deflating it let the cache grow
beyond max. A remote client, on the other hand,
received a snapshot that its writes could not affect. The value
reported by an interceptor instance that is not bound to a pooled
connection is now -1 instead of no value at all.
(remm)
Pool JMX notifications are now delivered on a dedicated
notification thread instead of on the thread that reported the
condition. Several of the pool's notifications are raised from
the connection lifecycle, some of them while the pool holds the
lock of the connection concerned, so a monitoring listener that
was slow or blocked stalled the borrow, return and abandon
processing of that connection for as long as it held on, and a
failed borrow from an exhausted pool repeated that cost on every
miss. Listeners observe the notifications in the same order the
pool reported them; a listener that stops draining the bounded
delivery queue now causes later notifications to be dropped and
logged rather than delaying the pool. The result of reporting a
notification through the pool MBean now describes that handoff
only, and no longer depends on whether a locally registered
listener threw. (remm)
The notification types that the connection pool MBean sends are now
declared as constants on the ConnectionPoolMBean
interface, the client-facing type for pool management. The types
were already discoverable as runtime metadata of the registered
MBean, but the interface that a JMX client compiles its listener
and notification filter against declared none of them, so client
code had to hardcode the type strings or compile against the
implementation class. The implementation now inherits the
constants from the interface; the notification types and the
strings they carry on the wire are unchanged. (remm)
Closing the connection pool now also terminates the asynchronous
borrows that were still waiting for a connection. A caller blocked in
the get() of the future that
getConnectionAsync() had returned waited forever on the
closed pool: a closed pool never hands another connection to the queue
that future waits on, and the waiter itself cannot observe the closed
state. The pool now cancels those outstanding polls, so their
get() reports a CancellationException. An
asynchronous borrow that races the closure is rejected with an
SQLException, like a synchronous borrow on a closed pool;
a borrow that had registered its waiter just before the closure ran
gets a future that reports that cancellation instead. (remm)
Correct a defect in the asynchronous borrow of the JDBC connection pool
that handed one physical connection to two users at once, silently
sharing a session between them. The queue delivers the connection it
produced to every caller of its get(), and the cancellation
of the future that getConnectionAsync() had returned used
that same delivery to retrieve the connection and close it, without
establishing whether a borrower had taken delivery of it. A
cancel() that landed while a borrower was receiving the
connection, or was still setting it up, therefore reported a successful
cancellation while the borrower was using that connection: it went back
to the pool and to the next borrower underneath its owner, or the owner
was handed a connection that had already been closed. The connection the
queue produces is now claimed once, by whichever of the borrower and the
cancellation gets there first. A borrower that won the claim keeps its
connection and cancel() reports that nothing was cancelled,
the way java.util.concurrent.Future reports nothing
cancelled once the work is done; a cancellation that won it returns the
connection to the pool exactly once and the future reports a
CancellationException to its callers instead of a closed
connection. (remm)
Make a timed-out retrieval from the JDBC pool's fair queue fail
terminally instead of leaving its future in a state nobody can
complete. (remm)
A JDBC pool validation that runs its built-in check against the
database now terminates a pending transaction with a rollback rather
than by committing it, so a health check no longer commits work the
application left uncommitted, and a validation whose rollback fails
is reported as failed so the connection is taken out of service; the
configured commitOnReturn or
rollbackOnReturn termination of a returned connection
now runs before the return validation that would otherwise override
it. (remm)
Always wrap pooled statements and their result sets in the statement
facade, so a statement handle kept past the end of its borrow can no
longer execute against the session the next borrower holds, and a
statement reports the pooled connection it was created from rather
than the driver's. Every result set those handles hand back is sealed
with them, whatever the method that returned it was called: a cursor
read through getObject(), the way a driver reports a REF
cursor or hands out a nested cursor, arrives as a handle too and
retires with the borrow, while unwrap() still reaches the
driver's own object. The useStatementFacade property that
could switch the facade off is deprecated and no longer has any
effect, but it is still accepted so existing configurations keep
loading. (remm)
Send the JDBC 4.3 request boundary hints on the pooled connections:
beginRequest() is now called on the physical connection
when the pool hands it to the application and
endRequest() when the application returns it, so that a
driver which optimises session handling around a unit of work can do
so. The hints are looked up reflectively and skipped on a Java runtime
that predates JDBC 4.3, and a driver that refuses a hint has the
refusal logged rather than the borrow or the return around it failed.
Pull request #677 provided by Fernanda Meheust. (remm)
Record the borrow site of a connection borrowed from the JDBC pool
with logAbandoned enabled as stack trace elements
instead of a formatted thread-dump string, and format the trace only
when an abandoned-connection report actually reads it. Every borrow
previously formatted - and almost always threw away - a full thread
dump; the text reported for a connection that really is abandoned is
unchanged. Pull request #1048 provided by sainadh777. (remm)
59569: Unwrap a pooled connection through a driver whose
own connection is itself a wrapper around another driver's
connection: when the physical connection does not directly implement
the requested interface, isWrapperFor() and
unwrap() now delegate to it, so the vendor object behind
a wrapping driver - like the AWS JDBC wrapper over the PostgreSQL
driver - is reachable through the pooled connection. The pool's
DataSource, whose implementations of the two methods
always answered false and returned null, now recognises itself and
the configured dataSource, and reports a failed unwrap
as the SQLException that the Wrapper
contract requires. Pull request #1077 provided by Shayan
Davarzani. (remm)
63705: Publish a JMX MBean for every physical connection
held by the JDBC pool, not only for the ones the application has
borrowed at least once. The connection MBeans that appear below the
pool's MBean as connections=PooledConnection[n] were
registered when a connection was borrowed for the first time, so the
connections the pool pre-created for its initialSize, and
any idle connection that was never borrowed, were counted in the pool's
Size and NumIdle attributes while remaining
invisible to management. A connection's MBean is now registered as soon
as its physical connection is established, and the connections a
running pool already holds are published when the pool's own MBean is
registered. A connection keeps its registration across a reconnect and
releases it, as before, when it leaves the pool.
(remm)
Correct a defect that meant the JNDI factory for the JDBC pool aborted
with a NullPointerException when a resource reference
carried an attribute with null content, and that made it impossible to
give the pool a live javax.sql.DataSource through a
reference: an object-valued dataSource attribute was
stringified and then rejected with a message contradicting the
documented property type. Attributes with null content are now skipped
and an object-valued dataSource attribute is used to back
the pool, taking precedence over dataSourceJNDI; a string
value for that attribute is still rejected, with a message that now
points at the supported ways of providing a data source. (remm)
Do not wait on pool creation when closing a JDBC pool data source.
The pool constructor pre-establishes the initialSize
connections, and it previously ran under the data source monitor that
close() takes, so closing a data source whose initial
connections were still being attempted against an unresponsive
database parked the shutdown on the driver for an unbounded,
uninterruptible time. The construction now runs under a gate that
serializes it on its own, outside that monitor, so a close does not
wait for an in-flight creation; that creation observes the closure at its
publication step and tears down the pool it built rather than
publishing it. As before, no database session and no pool cleaner
outlives the close, and the closure stays terminal. (remm)
50571: A configured connection state (auto-commit,
read-only or catalog) that could not be restored on a pooled
connection was logged and ignored, and the connection was handed out
in the wrong state: a defaultCatalog naming a database
that does not exist, for example, left the application working on the
session's original catalog with nothing surfaced to the application.
The borrow now fails with an SQLException and the
connection is discarded. Restoring the transaction isolation level
retains the previously logged-and-ignored behavior. (remm)
56586: An initSQL statement run by the JDBC
pool while a connection is established is now committed when the pool
runs with auto commit off, so the initialization it performs - a data
change or a session setting - persists for the lifetime of the
connection. It previously ran inside a transaction that the
connect-time validation then rolled back again, so the effects were
discarded before the first borrower ever used the connection.
Validation queries and the isValid() check keep the
opposite rule and still terminate an open transaction with a rollback,
so a health check continues to never commit application work. (remm)
65929: Calling abort() on a pooled connection
bypassed the pool. The call reached the physical connection while the
borrow stayed open: the session remained counted in the busy pool
against maxActive, and the handle kept reporting itself
open although the specification says a connection is closed once
abort() returns, so an application that trusts that and
does not call close() afterwards permanently consumed one
connection slot per call until the pool reported exhaustion. The pool
now intercepts abort(): the call is delegated to the
driver, the session is then taken out of service whatever the driver
made of it - no borrower may receive a session an abort was attempted
on - the slot is freed, and the handle is closed, reporting
isClosed() true, isValid() false and an
SQLException for any further use. On a handle already
closed, abort() is the no-op the specification
prescribes. Based on code submitted by Arturo Bernal. (remm)
Correct a defect in the StatementCache interceptor
where an interceptor listed after the cache that wraps statements
beneath it - StatementDecoratorInterceptor, for
example - silently stopped the cache from caching. The cached
statement recorded as its connection whatever that lower wrapper
answered for the statement's getConnection() - the
pool's handle for the borrow, not the physical connection - so no
closed statement ever passed the session check on the way into the
cache, every one was closed instead, and the next prepare prepared
again, at any log level. The cache now binds a cached statement to
the physical session the prepare ran on, using the driver's own
answer where it is readable, while a statement prepared on a
session that has since been replaced still refuses both caching
and reuse, and a park refused for a lost association is now noted
once per connection at debug level. (remm)
Correct a defect where listing the StatementCache
interceptor before the StatementFinalizer interceptor in
jdbcInterceptors handed the next borrower of a session a
cached statement that failed on any use. The finalizer tracked the
driver statement beneath the cache and closed every statement still
open when the connection was returned, while a statement parked in
the cache is deliberately left open, so that return-time close killed
the cached statement out from under a live cache entry and the next
cache hit served a closed statement. The cache now refuses to park
statements when such a tracker is configured beneath it - the close
then reaches the statement through the normal path - and the pool
warns once at start when the configuration lists the cache before the
finalizer, as it already does for the analogous query timeout
ordering. (remm)
Mask the password carried in the user:password@host
userinfo section of a JDBC URL, and in the equivalent
user/password@host form of the legacy Oracle URLs, in the
toString() dump of the pool configuration, where the rest
of the dump is masked and the leak gave a false impression that the
dump carried no credential. The user name, host, port and the rest of
the URL stay readable, and an authority that carries no credential -
a bare host or a port - is left untouched. (remm)
Correct a defect in the ResetAbandonedTimer interceptor
where a call that was still in flight when its borrow ended, and that
completed after the same connection had been handed to the next
borrower, reset the timer of that next borrower and cleared its
suspect state: the completing call is refused by the pool below, but
the interceptor booked its activity from the completion of the call,
where the connection looked checked out again, and the borrower the
abandoned check was watching read as active. Stamps from calls are now
booked only for the borrow the call started under, while the
resetTimer() management operation is unchanged. (remm)
Correct a defect where renaming a running connection pool - the pool's
own JMX exposes a setName that rewrites the name property
of a live pool - silently detached the SlowQueryReport
and SlowQueryReportJmx interceptors from the state their
pool had registered under its start-time name: connections borrowed
after the rename booked their statistics nowhere and logged a false
"Connection has already been closed or abandoned" warning on every
execution, a SlowQueryReportJmx borrow registered a
second MBean under the new name, and the pool's close released the
name it carried at close time rather than the one it had registered,
leaving the statistics, the interceptor MBean and with them the whole
closed pool's object graph registered forever. A nulling rename made
the same release throw and be swallowed, leaking the same way. The
registrations are now recorded under the name the pool started with
and every lookup of them resolves through that record, so a rename
changes what the pool calls itself and nothing else. (remm)
The SlowQueryReportJmx interceptor now publishes a
small, pool-independent resource as the MBean for a pool name,
instead of publishing the borrowing connection's own interceptor
instance. That instance holds the connection, the pool and the
pool's properties, so as long as the MBean was registered the JVM
could not reclaim a pool that had been abandoned without being
closed - a pool leaked this way kept its connections, its
statistics and its MBean alive for the life of the JVM, and a
pool that was never closed never released the name either. The
MBean also showed the name of whichever pool had borrowed first,
and its statistics and resetStats() operation acted
on that pool's state long after it had been replaced under the
name. The published MBean now resolves the pool currently using
its name, so it reports that pool, and an abandoned pool is
collected once nothing else refers to it, with its name released
by the next pool that takes it over. (remm)
The SlowQueryReport and SlowQueryReportJmx
interceptors now key their statistics and their JMX registration to
the connection pool rather than to the pool name. Statistics belong
to the pool that records them, are published under the name that
pool started with and are given up when that pool closes, so
starting, closing or replacing a pool no longer disturbs the
statistics or the registration of another pool; reading recorded
queries by name remains available as a view. Sharing one name
between live pools is no longer supported. The identity hash term in
the default pool name, which identified only the class loader and
added no uniqueness, has been removed. (remm)
Correct a defect in the JDBC connection pool where a non-fatal
Error raised by a driver or a wrapper while a connection
was being created, for example a LinkageError from a web
application that has stopped, escaped the creation guard. The
connection had already claimed one of the pool's
maxActive slots, so the slot and the physical session
were lost for the life of the pool; a pre-load of
initialSize connections that failed the same way also
bypassed the pool's start-up failure handling. The creation now treats
a non-fatal Error like any other failed creation, releases
the connection and reports the failure as an
SQLException. (remm)
Report a duplicate live pool name as an error from the JDBC pool's slow
query reporting interceptors. Tomcat gives every pool it manages a name
of its own, but a pool built programmatically can be given the name of a
live pool, and the statistics and the JMX registration are keyed by that
name: the two pools then displaced each other's statistics store. The
name is documented as having to be unique among live pools, and a
duplicate is reported at error level. (remm)
Remove the retry of refused JMX unregistrations from the JDBC pool's
JMX helper. JMX is a best-effort management channel and Catalina gives
every pool component a name of its own, so a refusal is logged for the
operator rather than remembered and retried later. A retry by name
could unregister a replacement MBean that had taken the name in the
meantime, silently removing the replacement's management surface.
(remm)
Other
Bump spotbugs to 4.10.4. (schultz)
69902: Change the ZIP distribution to store the same file
and directory permissions as the tar.gz distribution so that the
scripts in bin are executable when the archive is
extracted on a Unix platform. (schultz)
Avoid re-evaluation of command-line arguments in tool-wrapper.sh.
(schultz)
Update Tomcat Native to 2.0.17. (markt)
Update Byte Buddy to 1.18.17. (markt)
Update JaCoCo to 0.8.16. (markt)
Update JSign to 7.6. (markt)
Improvements to French translations. (remm)
Improvements to Japanese translations provided by tak7iji. (markt)
2026-10-12 Tomcat 11.0.27 (markt)
Catalina
When starting a web application, don't try and use the web application
class loader until after the web application class loader has started.
(markt)
Fix various concurrency issues around adding and removing
Realms from a CombinedRealm, in particular
doing so while the CombinedRealm is in use. Note that once
a Realm instance has been removed from a
CombinedRealm instance at run-time, the removed
Realm instance may not be reused apart from re-adding it to
the same CombinedRealm. (markt)
When StoreConfig re-writes an existing
server.xml or context configuration file, preserve the
layout of the existing file (comments, blank lines and attribute
order) on a best effort basis. (remm)
Track in StandardContext whether the context was
deployed from a Context element in
server.xml. Use it to have StoreConfig
save to a new config file. (remm)
Improve error handling on start-up. (markt)
Fix byte range responses generated by DefaultServlet so a
short resource stream read does not truncate the response. Treat a
premature end of stream as an I/O error. Based on pull request
#1067 by aoto-tech. (markt)
Align OpenSSLLifecycleListener with
AprLifecycleListener and throw an Error when FIPS is
requested but not available. (markt)
Ensure that, as per the documentation, a simple bind is always used when
the JNDI realm binds using the user provided name and password to
authenticate the user. (markt)
Optimize Accept-Language header processing and use of
resource budles for localization. (remm)
Coyote
70236: Fix a stalled TLS handshake with the OpenSSL based
implementations of SSLEngine when the first flight of
handshake messages sent by the server is too large to fit in the
buffer used by the BIO pair. Patch submitted by Lukas Hellebrandt.
(remm)
#1073: Fix possible corruption when using HTTP/2 and async IO
on uploads. Submitted by Tim Burke. (remm)
Avoid very rare race between async write notification and completion.
Skip the write notification in these cases since it would be useless.
(remm)
Fix a timing issue that could cause large non-blocking writes to stall
for AJP connections. (markt)
Improve the handling of the requirements for response closure in section
5.7 of the Servlet specification. If a non-blocking write writes exactly
content-length bytes to the response, allow that write to complete in a
non-blocking manner before the response is closed. (markt)
Ensure that the non-blocking write buffer is empty before sending an AJP
end response message. (markt)
Fix CharChunk.indexOf(char) so that it searches from the
start of the chunk rather than from twice the chunk's start offset
when the chunk does not begin at the start of its buffer. (breken-ai)
70247: Fix a leak in the HTTP/2 connection flow control
window when part of the HTTP request body is received but not read.
Based on a patch provided by Guillaume Darmont. (markt)
70251: Avoid closing a JarFile in
CloseableURLConnection unless it is certain the JAR is not
shared. (remm)
Fix possible corruption of HTTP/1.1 chunked response bodies if a
previous write to a chunked body fails. (markt)
Align cipher order with the results produced by OpenSSL if the cipher
specification adds, removes and then re-adds ciphers. (markt)
Correct a narrow race condition when processing HTTP/2 headers. (markt)
Fix possible TLS connections failures caused by one of the flags Tomcat
uses to track TLS handshake progress not being correctly reset. (markt)
Allow for absolute host names in SNI checks. (markt)
Correct a gap in asynchronous error handling that could lead to
unexpected IllegalStateExceptions for some error
conditions. (markt)
Harden HTTP/2 against applications that do not correctly handle
asynchronous errors. (markt)
Jasper
Route JspC servlet context logging through Ant when used as
an Ant task. (sainadh777)
Fix the tag plugin for the JSTL <c:redirtect> tag so that page
processing ends with the redirect. (markt)
Cluster
Fire the documented send_message_failure lifecycle event
with the message, destination and exception when a
SimpleTcpCluster message send fails and
notifyLifecycleListenerOnFailure is enabled. The event
was previously declared but never fired. (remm)
Fix a possible deadlock in DeltaSession.expire(): the
final session delta is now captured and sent to the cluster before the
session monitor is acquired, because obtaining the delta takes the
delta lock and code that runs while the delta lock is held, such as
session attribute listener notifications, may in turn wait for the
session monitor. (remm)
Fix a possible deadlock in DeltaSession: session attribute
listeners are no longer called while the delta lock is held when
attributes are set or removed. The delta lock is only held while the
change is recorded. (markt)
Fix a possible deadlock in DeltaSession: received session
deltas are now read into a separate DeltaRequest from the
one the session uses to record local changes. This avoids having to
hold the delta lock while processing received changes. (markt)
Move context attributes that were set while the web application was
still starting into the replicated attribute map when it is installed
in ReplicatedContext, so that they are replicated to the
other nodes like attributes set later on rather than remaining local to
the node that started the application. (remm)
Replicate SSO session key set changes made by removeSession()
and sessionChangedId() in ClusterSingleSignOn so
that SSO entries are correctly deregistered and removed from all nodes when
the last associated session expires, even when the sessions expire on
different cluster nodes. (remm)
Fix an issue replicating SessionListener additions and
removals that meant some modification were not replicated leading to
inconsistent listener configurations across the cluster. (markt)
Web applications
Documentation: Explicitly state that virtual host matching via the HTTP
host header and TLS configuration matching via SNI are completely
separate processes. (markt)
Examples: Draw axis-aligned rectangles and ellipses as lines in the
WebSocket drawboard. (sainadh777)
Tribes
Document Tribes channel, membership, transport and replication
status available through JMX. Based on pull request #1071 by
sainadh777. (markt)
Other
Update the internal fork of Apache Commons BCEL to 6.13.0. (markt)
Update to the Eclipse JDT compiler 4.41. (markt)
Update to NSIS 3.13. (markt)
Update to Byte Buddy 1.18.14. (markt)
Update to Bouncy Castle 1.8.6. (markt)
Improvements to French translations. (remm)
Improvements to Japanese translations provided by tak7iji. (markt)
Update to Migration tool for Jakarta EE 1.0.13. (markt)
2026-09-15 Tomcat 11.0.26 (markt)
Catalina
Improve the handling of AsyncContext.dispatch() when the
Context attribute dispatchersUseEncodedPaths
is set to false since the application has no control over
the path used for the AsyncContext.dispatch(). Prior to
this fix, paths containing literal '?' characters were
truncated. (markt)
Ensure that capture groups from a RewriteCond always
reflect the result of the current request. (markt)
When a PersistentManager needs to reduce the number of
active sessions, swap out the least recently used eligible sessions
first. Pull request #1045 provided by sainadh777. (markt)
Align web.xml logging output with the new Context attribute
urlPatternsProvidedInDecodedForm. (markt)
Improve robustness of DIGEST authentication to system clock jumps.
(markt)
Support multiple protocol header values (treat as a single merged header
value) in the RemoteIpFilter and
RemoteIpValve. (markt)
Fix potential concurrency issues when loading/saving sessions from/to a
session store. Custom Store implementations that do not extend StoreBase
must implement the new getSessionStoreLock() method of the
Store interface to ensure concurrency protection. The
default method implementation provided only provides the pre-fix
functionality. (markt)
Ensure that PersistentManager implementations that extend
PersistentManagerBase do not swap out sessions that are
associated with a request that is currently being processed. This
includes not swapping out a session unless the session was created when
activity tracking was enabled. (markt)
Ensure namespace attributes are XML escaped in WebDAV responses. (markt)
Resolve null or missing rewrite substitutions as an empty string, to
align with the mod_rewrite behavior. (remm)
Add a best efforts protection in the
CrawlerSessionManagerValve against crawlers being
associated with an authenticated session. (markt)
Clarify the meaning of various RewriteValve server variables and
explicitly use the canonical context path for the
CONTEXT_PATH server variable. (markt)
Fix storeconfig not saving the path when a context is saved in
server.xml. (remm)
WAR URLConnection should propagate use of caching. (remm)
Ensure resources are evicted from the static resource cache in the
correct order. (markt)
When Jakarta Authentication is configured for a web application, cache
the ServerAuthConfig in the Authenticator
valve. This ensures web application specific settings are cached on a
per web application basis. (markt)
70203: Fix RegistrationListener notifications in
Jakarta Authentication implementation. (markt)
Handle CGI scripts that write excessively to stdout after setting an
HTTP error status code. (schultz)
Require the request to the login action during FORM authentication to be
made using HTTP POST. (markt)
70208: Make URL encoding more robust. Based on pull request
#1065 by Chenjp. (markt)
Coyote
Fix parsing of client certificates that specify more than one OCSP
responder for configurations that use OpenSSL-FFM. (markt)
Align xreflection better with IntrospectionUtils. (remm)
In HTTP/2 after half closed (remote), any unexpected frame should be
a stream error. (remm)
Fix incorrect initial window size calculation when upgrading to HTTP/2.
(remm)
Avoid HTTP/2 exceptions with invalid content-length
values. (remm)
Only try and load the native library from the CATALINA_HOME
system property when the property is set. (markt)
Fix max connections enforcement after an enpoint resume. (remm)
Implement stricter ALPN matching for Connectors using FFM. (markt)
Add length validation for ALPN protocol names. (markt)
Make FFM certificate verification more robust. (markt)
Align FFM OCSP URL parsing with Tomcat Native and treat a parsing
failure as if no usable OCSP URLs were present. (markt)
Make the processing of OCSP responses more robust. (markt)
Stricter OCSP handling when soft-fail is disabled. (markt)
Cleaner handling of AJP response headers which overflow the maximum
message size. (remm)
Small performance optimisation. Don't waste cycles swallowing an AJP
request body when the connection is going to be closed. (markt)
Fix OpenSSL support for CRLs when using OpenSSL trust with the server
key held in a Java key store. (markt)
Reject HTTP/1.0 or earlier requests that send a
transfer-encoding header. (markt)
Ensure per request HTTP/2 bad request marker is cleared when the request
is recycled. (markt)
Additional clean-up after HTTP/2 stream reset to aid GC. (markt)
Revert earlier refactoring of HTTP/2 header field validation that moved
it earlier since the refactoring made correct handling of invalid
headers more difficult. (markt)
Jasper
Fix EL evaluation of some lambda expressions. (remm)
Cluster
Validate that the DeltaManager attribute
sendAllSessionsSize is a positive integer. Zero or negative
values previously caused an infinite loop or a
NegativeArraySizeException during session state transfer.
Pull request #1042 provided by lihongyi87. (markt)
Improve robustness of cloud membership providers if an error occurs
fetching members. (remm)
WebSocket
Fix an exception when an automatic Pong response races with the
closing of the WebSocket session. (moritzfl)
Harden the WebSocket client and use a SecureRandom when
generating the Sec-WebSocket-Key header. (markt)
Improve robustness of client handshakes. (remm)
Ensure that WebSocket write timeouts apply to the complete message and
are not lost if two writes have the same timeout. (markt)
Reduce CPU usage while sending WebSocket close message. (markt)
Fix overly broad check that prevented request URIs containing literal
{ and } characters from being mapped to
WebSocket end points. (markt)
Fix handling of WebSocket messages with compressed payloads using
per-message-deflate that have one or more non-final blocks where the
BFINAL bit is set. (markt)
Fix handling of per-message-deflate context takeover when receiving
compressed WebSocket messages. (markt)
Web applications
Manager: Fix a potential concurrency issue when ordering sessions prior
to displaying a list of session. (markt)
Wrap the RewriteRule regular expression syntax reference
on narrow displays. Pull request #1044 by sainadh777. (markt)
jdbc-pool
DataSourceProxy.getPooledConnection(String,String) now
delegates to getConnection(String,String) rather than
getConnection(). (markt)
Log a warning if an attempt is made to obtain a connection with
credentials when alternateUsernameAllowed is set to
false. (markt)
Ensure StatementCache interceptor resets properties of cached statements
between uses. (mark)
Other
Update Easymock to 5.7.0. (markt)
Update bnd to 7.4.0. (markt)
Update Tomcat Native to 2.0.16. (markt)
Improvements to French translations. (remm)
Improvements to Japanese translations provided by tak7iji and
Ktamura.biz.80. (markt)
2026-08-18 Tomcat 11.0.25 (markt)
Catalina
Ensure that a login-config conflict when merging web.xml
fragments triggers a deployment failure. (markt)
Remove unnecessary calls to String.intern() in the parsing
of configuration files. (markt)
Extend sessionAttributeValueClassNameFilter to include
filtering of dynamic proxy interface classes. (markt)
Attempt to use rollback when persisting user data to the
DataSourceUserDatabase fails and improve error reporting.
(remm)
70143: Handle InvalidFileNameException when parsing parts to
rethrow it as an IllegalStateException as mandated by the
Servlet specification. (remm)
Add missing reason to the JsonErrorReportValve. (remm)
Fix evaluation of the N and C flags for
rewrite rules. (remm)
qsd flag should always discard the original query string
when rewriting. (remm)
Add appropriate escaping for context path, current directory name and
parent directory name for directory listings produced by the default
servlet. Ensure XML escaping is used with XML output. (markt)
When processing certificate subject names and issuer names within
RewriteValve rules, always use the RFC 2253 format name. (markt)
Fix the incorrect rejection of requests using digest authentication when
the client provided nonce count is at the upper boundary of the window
(markt).
Separate the Context role mapping from the Servlet
specification security-role-ref. (remm)
Handle the case where the JNDIRealm is configured to
perform role searches with userRoleAttribute but the
attribute is not available or not configured for the current user.
(markt)
Improve handling of session attribute addition concurrent with session
expiration. An application will now either see a successful addition
followed by expiration or the addition will not succeed. It is no longer
possible for the session to expire and the addition to succeed. This is
of particular not for attributes that implement
HttpSessionBindingListener. (markt)
Add a new attribute to the Context,
urlPatternsProvidedInDecodedForm. This attribute controls
whether URLs and URL patterns provided in the deployment descriptor
(web.xml), annotations and/or their programmatic equivalents are treated
as being provided in URL-encoded form (i.e. using %nn encoding) or in
decoded form. The Servlet specification requires that they are provided
in decoded form. However, Tomcat has historically treated them as if
they are provided in encoded form. In Tomcat 12, they will always be
treated as if they are provided in decoded form. This setting enables
migration from encoded form to decoded form on an application by
application basis. This attribute will be removed in Tomcat 12 where it
will effectively be hard-coded to true. (markt)
Ensure the security constraint with the longest matching path is
selected when more than one constraint matches the request path. (markt)
If the request saved by FORM authentication uses a method other than
GET, ensure that the security constraints are re-assessed after the
saved request is restored and before it is processed. Custom
Authenticator implementations that extend
FormAuthenticator and override
doAuthenticate() and/or restoreRequest() will
require modification. (markt)
Various improvements to the DataSourceRealm. A failure to
connect to the database or an exception during either user or role
lookup will now result in an authentication failure rather than a
partially populated Principal. For CLIENT-CERT and
SPNEGO authentication, the user must exist in the database
for authentication to succeed. (markt)
Coyote
Add utility AutoCloseable URLConnection wrapper, and use it to cleanup
existing code patterns. (remm/markt)
When processing an HTTP upgrade from HTTP/1.1 to HTTP/2, ensure that all
the HTTP/1.1 data has been processed before switching protocols. (markt)
Require every HTTP/2 request to provide an authority (either an
:authority pseudo header or a Host header).
(markt)
Register the use of an HTTP/2 stream identifier earlier so that there is
no possibility of a re-used stream identifier being accepted, regardless
of how early in the HEADERS frame processing an error is detected.
(markt)
Add new attributes (unixDomainSocketParentPermissions and
unixDomainSocketParentOwner) to the NIO connector to
provide additional control over the security of Unix Domain Sockets.
Additional checks (enabled by default) have also been added for the
directory where the Unix Domain Socket will be created.(markt)
Fix an allocation leak in the HTTP/2 backlog tracking when a stream is
reset. (markt)
Jasper
Ensure internal state is reset before re-using ELParser. (markt)
Cluster
Change the default encryptionAlgorithm for the
EncryptInterceptor to AES/GCM/NoPadding. This
is a breaking change for the EncryptInterceptor. (markt)
Expand the documentation for the EncryptInterceptor to be
more explicit regarding the security weaknesses of some supported
algorithms. Also explicitly state that the replay protection is only
effective for non-malleable algorithms. (markt)
Expand the Javadoc for the DNSMembershipProvider in
particular explaining its behaviour and providing configuration advice
if control more over cluster membership is required. (markt)
WebSocket
Add a limit (defaults to 8KB) on the size of the HTTP response headers
accepted during a WebSocket HTTP upgrade. This is configured via the
org.apache.tomcat.websocket.MAX_HTTP_RESPONSE_HEADER_BYTES
user property. (markt)
Improve URI template matching for WebSocket end points. Trailing slashes
are now significant both for template definitions and URIs considered
for potential matches to those URIs. Note that this means if a URI
template ends in a variable without a trailing slash, that variable
might be expanded to the empty string. (markt)
Account for session ID changes when tracking WebSocket connections for
closure because they were created under an authenticated HTTP session
that has since ended. (markt)
Web applications
70160: Correct various references to the Servlet
specification to use version 6.1. (markt)
Documentation: Better sample httpd configuration for use with SSLValve
and add a note that the exact configuration required will depend on the
overall httpd configuration. (markt)
Examples: Limit the buffering of messages in the WebSocket chat example
to prevent a malicious client triggering excessive memory usage that
could lead to a DoS. (markt)
Documentation: Expand the description of the %S (session ID)
access log pattern token. (markt)
Manager: Use reflection to load clustering classes in
sessionsList.jsp so the sessions list page renders
correctly when clustering JARs are not present. (csutherl)
jdbc-pool
70164: Correct the documentation for the
testOnBorrow attribute. Pull request #1033 provided
by Kohei Tamura. (markt)
Other
Update Maven Resolver Ant Tasks to 1.6.1. (rjung)
Update Objenesis to 3.6. (markt)
Update JSign to 7.5. (markt)
Update Bouncy Castle to 1.85. (markt)
Improvements to French translations. (remm)
Improvements to Japanese translations provided by tak7iji. (markt)
2026-07-08 Tomcat 11.0.24 (markt)
Catalina
Avoid a race condition with concurrent lookups for a singleton JNDI
resource. (markt)
Improve the performance of range validation for the default servlet.
(markt)
Avoid NPE in RewriteValve. (markt)
70127: Fix use of Bootstrap through reflection by restoring
the public constructor. Use through scripts was not affected. (remm)
Restore ability to extend many element classes from
AbstractAccessLogValve. (remm)
Align DIGEST authentication with RFC 7616 and require clients to provide
a valid qop parameter. (markt)
Use Files API to create temporary docBase when
antiLockingDocBase is enabled. (markt)
Improve validation of configuration when DataSourceRealm
starts. (remm)
JAASRealm should do a logout if login does not fail outright but
does not produce a Principal. (remm)
Various edge cases for SSI substitutions, quoting and escaping. (remm)
Fix unintentional conversion of literal + to a space during
rule processing in the RewriteValve. (markt)
Coyote
Avoid a potential JVM crash if a suitable version of Tomcat Native is
not available when the connector is explicitly configured to use Tomcat
Native with OpenSSL for TLS. (markt)
Jasper
70120: The fix for 69399 (itself a fix for a
regression in the fix for 69333) was incomplete and tags that
threw exceptions in doStartTag() and
doEndTag() were incorrectly re-used. This fix prevents tags
from being re-used if such an exception occurs. (markt)
Add support for specifying Java 28 (with the value 28) as
the compiler source and/or compiler target for JSP compilation. If used
with an Eclipse JDT compiler version that does not support these values,
a warning will be logged and the default will be used.
(markt)
WebSocket
70126: Fix WebSocket extension permessage-deflate so that it
does not drop bytes if a compressed message inflates to more than the
available buffer. Fix written by GPT-5.5. Test case written by Hironori
Ichimiya. (markt)
Optimise WebSocket client processing of server responses during
WebSocket HTTP upgrade process. (markt)
Other
Update to the Eclipse JDT compiler 4.40. (markt)
Update Byte Buddy to 1.18.9. (markt)
Update UnboundID to 7.0.5. (markt)
Update JaCoCo to 0.8.15. (markt)
Update BND to 7.3.0. (markt)
Improvements to French translations. (remm)
Improvements to Japanese translations provided by tak7iji. (markt)
2026-06-22 Tomcat 11.0.23 (markt)
Catalina
Add support for literal '%' characters in access log
output. Based on pull request #1002 by Fabian Hahn. (markt)
Lower the log level to debug when OpenSSL initialization fails in
OpenSSLLifecycleListener to avoid stack traces
when libssl.so is not present and to align the behavior
of the isAvailable() check with the
AprLifecycleListener and gracefully fail when natives
are not present. (csutherl)
70038: Cookie.clone() should also clone the
internal attribute map. (markt)
Remove unnecessary code from the SSI processing engine that was
duplicating some of the normalisation checks. (markt)
Cleaner handling of invalid SPNEGO tokens. (remm)
Avoid some NPEs in the Connector class on an uninitialize protocol.
(remm)
Incorrect session average life calculation. (remm)
Improve robustness on using Pipeline.setBasic on a running
pipeline. (remm)
Avoid any init parameter updates when conflicts are found for filters,
similar to what is done for servlets, as required by the servlet
specification. (remm)
Fix container event cleanups in some edge cases. (remm)
Check for last-modified header in ExpiresFilter when a
servlet uses addDateHeader to avoid wrongly considering
it has been set. (remm)
Fix hour unit used by ExpiresFilter. (remm)
Remove exception swallowing in DataSourceStore to align
it with FileStore and avoid session loss on errors. (remm)
Add support for single-quote escaped literal as well as quoted literals
in DateFormatCache. (schultz)
On JAAS logout, clear out role principals on the subject that were
added on commit, as recommended by the JAAS specification. (remm)
MemoryRealm should not add a dummy role when none is
specified in the configuration. (remm)
DataSourceUserDatabase should return a null principal on
a non existing user. (remm)
Fix shared lock expiration in WebDAV. (remm)
Inaccurate session exipration statistics when using the persistent
manager. (remm)
Skip BOM when serving files with UTF-32 encoding. (remm)
Mixup of WrapperListener and WrapperLifecycle elements in storeconfig.
(remm)
Incorrect processing of modified users in
DataSourceUserDatabase. (remm)
Clarify behavior in the UserDatabase for user, role and
group creation that it does not immediately override existing elements.
Removal (or update) needs to be used instead. (remm)
70049: Align the web application class loader with parent
class loaders and swallow any errors caused by invalid paths when
looking up resources and behave as if the resources were not found in
that case. (markt)
Improve validation of Range and Content-Range
parsers so invalid ranges trigger a 4xx response rather
than a 500 response. Pull request #1012 provided by
Sahana Surendra Bogar. (markt)
Fix connection leak in ProxyErrorReportValve. (remm)
When using the RewriteValve, %{SSL:HTTPS} now
returns on or off rather than
true or false to align with httpd. (markt)
Reset the encoding used for query string parameters between requests in
case an application changed the encoding in a previous request. (markt)
When encoding URLs with the CsrfPreventionFilter, don't add
the nonce to URLs that are known not to require it. (markt)
Fix SSO cookie partitioned configuration. (remm)
Fix CombinedRealmisAvailable, it allows
authentication if at least one sub realm is available. (remm)
70048: Correctly handle asynchronous requests in
PersistentValve. (markt)
Improve the detection of cross-context dispatches when using a
RequestDispatcher. (markt)
Fix various instances of double decoding of URL patterns configured
either programmatically or in web.xml. (remm/markt)
Align the rewrite conditions ornext flag processing with
mod_rewrite, which follows a purely sequential evaluation strategy.
(remm)
Update default web.xml version to match supported Servlet specification
version. (markt)
Change the default for the useRedirect attribute of the
ProxyErrorReportValve from true to
false. (markt)
Add support for the showReport attribute in
JsonErrorReportValve and
ProxyErrorReportValve. When set to false,
detailed error information (message, description, stack trace) is
suppressed from error responses. (dsoumis)
Avoid a NoClassDefFoundError at startup when
catalina-tribes.jar is removed but
catalina-ha.jar is present and the
Cluster element is enabled in
server.xml. Cluster digester rules are now fully
conditional on both JARs being available. (dsoumis)
Fix a potential deadlock when copying resources using WebDAV. (markt)
Add jakarta., org.apache.catalina. and
org.apache.tomcat.to the list of reserved prefixes for SSI
variables and request attributes. (markt)
Missing URL decoding when processing addMapping on a
Servlet registration. (remm)
The Timeout WebDAV header allows comma separated values
(according to the examples in the RFC). Use the first acceptable value.
(remm)
Fix various issues when logging the effective web.xml for a web
application. Empty sections are no longer logged. Special roles and
empty authorisation constraints are included. All session cookie
attributes are included. (markt)
Expand the write lock for the save process in the
MemoryUserDatabase to avoid concurrency issues with the
file save operations. (markt)
Ensure atomic session persistence in FileStore. Based on
pull request #1016 by sahvx655-wq. (markt)
Do not ignore methods configured on security constraints that map to the
default servlet. (markt)
Coyote
Log a suitable warning if an encrypted PEM file is detected using an
insecure form for encryption. (markt)
If TLS groups have been configured, use the configured groups rather
than using OpenSSL's default TLS groups when using Tomcat Native with
OpenSSL based connectors. (markt)
For HTTP/2, ensure that any in progress request body reads are cancelled
if the container resets the associated stream. This prevents delays
waiting for reads to time out when it is known that no more data will be
received. (markt)
Ensure that malformed HTTP/2 messages that should trigger a stream reset
do so, rather than triggered a connection close. (markt)
Improve enforcement of header trailer allow list for HTTP/2. (remm)
70050: Avoid NPE when no header frame is processed in HTTP/2,
following refactor clean-up of header buffer. (remm)
Properly use pollerThreadPriority for the NIO poller
thread. (remm)
Fix MessageByte.equals if called on a null MB. (remm)
Call the delegate key manager in JSSE to retrieve the server key.
(remm)
Avoid overflow scenarios in Asn1Parser. (remm)
70091: Add a new attribute, allowSchemeMismatch
to Http2Protocol that allows the consistency check for the
scheme provided by the user agent to be bypassed. (markt)
isTrailerFieldsReady was always returning
true. (remm)
Align OpenSSL/Panama TLS implementation with other implementations and
throw an exception if there is an error loading the provided CRL(s).
(markt)
Parsing of OpenSSL format cipher expressions incorrectly stopped if
@STRENGTH was encountered, ignoring any subsequent
expressions. (markt)
Handle the case where the HTTP/2 payload length is insufficient for the
mandatory data required by the flags set in the header. (markt)
70102: Correct expected size of ticket keys when calling
setSessionTicketKeys with an FFM connector. (markt)
69988: Fix post handshake authentication for TLS 1.3. It was
broken by a breaking change in OpenSSL between 1.1.1 and 3.0.0. (markt)
When processing an OpenSSL cipher specification, fully align the order
of the resulting ciphers with the order produced by OpenSSL. (markt)
Add support for Brainpool TLS groups. Patch provided by YStankov.
(schultz)
Update both the minimum and recommended version for Tomcat Native 2.x to
2.0.15. (markt)
Update the minimum version for Tomcat Native 1.x to 1.3.8. (markt)
Jasper
Fix possible EL argument mismatch when it was set to null. (remm)
Fix thread safety of TagPluginManager. (remm)
Correctly use flush on JSP include. (remm)
Cluster
Expand wording and increase visibility of log message when cloud
membership is configured without a trust store as all certificates will
be trusted in this configuration. (markt)
Ensure listeners are correctly added and removed when configuring the
channel coordinator. (markt)
Fix some concurrency issues in FragmentationInterceptor.
(markt)
Fix some concurrency issues in OrderInterceptor.
(markt)
Fix some concurrency issues in TwoPhaseCommitInterceptor.
(markt)
Fix concurrency issues generating MD5 digests in the
CloudMembershipProvider implementations. (markt)
Add replay protection to the EncryptInterceptor. This is a
breaking change for the EncryptInterceptor. (markt)
WebSocket
Incorrect Future.isDone() return by
AsyncChannelWrapperSecure. (remm)
Trigger standard WebSocket error handling if a call to
Endpoint.onOpen() fails for a programmatic endpoint.
(markt)
70110: Fix memory leak if a call to
Endpoint.onOpen() fails for a programmatic endpoint. Test
case provided by uabdur. (markt)
If a client presents invalid parameters when negotiating a WebSocket
extension, decline the negotiation offer that includes the invalid
parameters rather than failing the connection. Pull request
#1019 provided by sahvx655-wq. (markt)
Web applications
Manager: Add checks to ensure that any uploaded files are uploaded to
the expected location. (markt)
Manager: Add checks to ensure that the requested context path for a
deployed WAR, directory or descriptor file is valid. (markt)
Documentation: Expand the description of some of the attributes of the
CrawlerSessionManagerValve. (markt)
Documentation: Clearer description and correct documented default for
ocspSoftFail. (markt)
Fix double escaping in the context names for the JSON mode of the
manager servlet. (remm)
Manager: Ensure automatic deployment does not trigger an undeployment
during a Manager triggered web application reload. (markt)
Documentation: Provide better documentation for the scheme
and secure attributes of a Connector. (markt)
Other
Use per connection authenticator when executing an Ant task. (remm/markt)
Update Commons Daemon to 1.6.1. (markt)
Prevent duplicate log messages when clustering JARs are not present on
startup. (csutherl)
Improvements to French translations. (remm)
Improvements to Japanese translations provided by tak7iji. (markt)
Update the packaged version of the Tomcat Migration Tool for Jakarta EE
to 1.0.12. (markt)
Update Tomcat Native to 2.0.15. (markt)
2026-05-05 Tomcat 11.0.22 (markt)
Catalina
Enhance version.sh and version.bat to display
APR, Tomcat Native, and OpenSSL version information (both APR and FFM
implementations), along with version compatibility warnings and
third-party library version information. (csutherl)
Coyote
Avoid various edge cases if Content-Length is set via
setHeader(String,String) or
addHeader(String,String) with an invalid value by always
clearing the previous value whether the new value is valid or not and
ignoring any invalid new value. (markt)
Refactor the calculation of the real index in the HPACK dynamic header
table implementation to reduce code duplication. (markt)
Fix various minor issues with some HTTP/2 stream error messages for
HTTP/2. (markt)
Consistently reject URIs containing NULL bytes when
normalizing. (markt)
Fix a few minor memory leaks on error paths reading TLS keys and
certificates when using FFM. (markt)
Refactor clean-up after HTTP/2 headers have been processed to aid GC
after a stream reset. (markt)
Align HTTP/2 trailer fields with HTTP/1.1 and filter out any fields
not permitted in trailers. (markt)
Free private keys after use in FFM based connector configuration.
(markt)
Correct an unlikely edge-case parsing bug in the HTTP/2 HPACK header
decoding that could result in a valid header triggering an unexpected
connection close. (markt)
Refactor HTTP/2 HPACK encoding so header field names are only converted
to lower case once during the encoding process. (markt)
Refactor HTTP/2 header field validation so it occurs earlier. Extend
validation to check for disallowed characters as well as upper case
characters. (markt)
Add TLS 1.3 groups added in OpenSSL 4.0. (remm)
Add validation that the HTTP/2 :scheme pseudo-header is
consistent with the use (or not) of TLS. (markt)
Correct the validation of pseudo headers and CONNECT requests to align
Tomcat's behaviour with RFC 9113, section 8.5. (markt)
Fix a potential integer overflow when allocating capacity from a
connection level window update to individual HTTP/2 streams. Based on
#996 by Mike Tingey Jr. (markt)
Switch AJP secret comparison to a constant time algorithm. (markt)
WebSocket
Fix the initial connection to a WebSocket end point where the connection
is made via a proxy that requires DIGEST authentication. (markt)
Other
69993: Update the URL to the CDDL 1.0 license. (markt)
Add warning when OpenSSL binary is not found. (csutherl)
Add check for Tomcat Native library, and log warning when it's not found
to make it easier to see when it's not used by the suite. (csutherl)
Update Byte Buddy to 1.18.8. (markt)
Update Bouncy Castle to 1.84. (markt)
Improvements to French translations. (remm)
Improvements to Japanese translations provided by tak7iji. (markt)
2026-04-04 Tomcat 11.0.21 (markt)
Catalina
Add escaping for URI and query string in the access log. (markt)
Coyote
Fix an HTTP/2 header frame parsing bug that could result in a connection
being closed without a GOAWAY frame if an invalid
HEADERS frame was received. (markt)
69982: Fix a bug in the non-blocking flushing code for
NIO+TLS that meant that a response may not be fully written until the
connection is closed. Pull request #966 provided by Phil Clay.
(markt)
Ensure the HTTP/2 request header read buffer is reset (including
restoration to default size) after a stream reset. (markt)
Provide trailer field filtering equivalent to that provided for
non-trailer fields. Control characters (excluding TAB), and characters
with code points above 255 will be replaced with a space. (markt)
Align OpenSSL FFM behaviour with Tomcat Native for various OCSP edge
cases. (markt)
Jasper
69995: Make dependent ordering predictable. Patch submitted
by Jan Luehe. (remm)
70001: Ensure JSP compilation is reproducible when
dependencies exist for tag files and tag libraries located on the class
path but outside of the web application. #992 submitted by Jan
Luehe. (markt)
Cluster
Reduce log verbosity of the Kubernetes connection attempts and failure.
(remm)
Better error handling for the EncryptInterceptor. (markt)
Other
Update bnd to 7.2.3. (markt)
Improvements to French translations. (remm)
Improvements to Japanese translations provided by tak7iji. (markt)
2026-03-20 Tomcat 11.0.20 (markt)
Coyote
Fix case sensitive handling of the protocol host name. (remm)
not released Tomcat 11.0.19 (markt)
Catalina
69967: Fix inconsistencies related to
Content-Length and Content-Type headers when
accessed using the getHeader method and similar. (remm)
69940: Improve redirect handling in the
LoadBalancerDrainingValve. (schultz)
Coyote
Add an HTTP configuration setting, noCompressionEncodings,
that can be used to control which content encodings will not be
compressed when compression is enabled. Based on pull request
#914 by Long9725. (markt)
Add size limit for OCSP responses. Based on code submitted by Chenjp.
(remm)
To maintain the documented alignment with the OpenSSL development
branch, the use of the aliases SSLv3, EXPORT,
EXPORT40, EXPORT56, KRB5,
kFZA, aFZA, eFZA and
FZA are no longer supported when setting the
ciphers attribute of an SSLHostConfig element.
(markt)
To maintain the documented alignment with the OpenSSL development
branch, add support for the aliases ARIAGCM and
CBCwhen setting the ciphers attribute of
an SSLHostConfig element. (markt)
69870: Add a drainTimeout to the HTTP/2
UpgradeProtocol element to allow configuration of an
time between the two final GOAWAY frames sent by Tomcat
when closing am HTTP/2 connection. Pull request #917 provided by
Kai Burjack. (markt)
Update StoreRegistry to dynamically load optional clustering
classes rather than statically referencing them. This matches the pattern
used in Catalina.addClusterRuleSet() and prevents
NoClassDefFoundError when StoreConfigLifecycleListener
is configured but clustering classes are not available. (csutherl)
Update the minimum recommended version of Tomcat Native so that users of
1.3.x are recommended to update to 2.0.x. (markt)
Respect the value for the jdk.tls.namedGroups system
property as the default value for the configured group list on the
Connector. (remm)
69964: Respect the configured cipher order, which was no
longer respected following the addition of TLS 1.3 specific cipher
configuration. TLS 1.3 ciphers will always be first in the list. (remm)
Free the x509 object in the FFM code when getting the peer certificate
if getting the bytes from the certificate somehow fails.
Pull request #951 provided by Chenjp. (remm)
Improve HPACK exception use, making sure HpackException
is thrown instead of unexpected types. (remm)
Update the parser for the HTTP Host header and
:authority pseudo header to convert the port, if any, to an
Integer rather than a Long to be consistent
with how port is exposed in the Servlet API. (markt)
To aid the migration from the single ciphers configuration
attribute to the use of ciphers and
cipherSuites, TLS 1.3 cipher suites listed in the
ciphers attribute will be removed from the
ciphers attribute and added to the end of the
cipherSuites attribute. This behaviour will be removed in
Tomcat 12.0.x onwards. (markt)
Replace the external OpenSSL based OCSP responder used during unit tests
with a Bouncy Castle based, in-process Java OCSP responder. (markt)
Relax HTTP/2 header validation and respond to invalid requests with a
stream reset or a 400 response as appropriate rather then with a
connection reset. (markt)
Add validation of chunk extensions for chunked transfer encoding.
(markt)
Update the recommended version for Tomcat Native 2.x to 2.0.14. (markt)
Align the FFM handling of OCSP TRY_LATER responses with
Tomcat Native. (remm)
Free CA certificate after calling SSL_CTX_add_client_CA
in the FFM code. Based on code from PR 44 from tomcat-native. (remm)
Free certificate chain if an error occurs, in the FFM code. (remm)
Report handshake issues as SSLException in the FFM
code, rather than IllegalStateException. (remm)
Jasper
69948: Avoid ArrayOutOfBoundsException instead of
PropertyNotFoundException when generating a properties not found
exception in AstValue. Based on #950 submitted by Jérôme
Besnard. (remm)
Add support for specifying Java 27 (with the value 27) as
the compiler source and/or compiler target for JSP compilation. If used
with an Eclipse JDT compiler version that does not support these values,
a warning will be logged and the default will be used.
(markt)
Cluster
69970: Support raw IPv6 in Kubernetes membership provider
for the service host. (remm)
Add support for new algorithms provided by JPA providers to the
EncryptInterceptor. (markt)
WebSocket
69972: Remove unwanted space in DIGEST authorization header.
Patch submitted by Stefan Kalscheuer in #957. (remm)
Web applications
69931: Add <label> for fields in the HTML manager
application. Patch provided by yukitidev. (schultz)
Other
Update the internal fork of Apache Commons BCEL to 6.12.0. (markt)
Update to the Eclipse JDT compiler 4.39. (markt)
Update Tomcat Native to 2.0.14. (markt)
Update Objenesis to 3.5. (markt)
Update Byte Buddy to 1.18.7. (markt)
Update BND to 7.2.1. (markt)
Improvements to French translations. (remm)
Improvements to Chinese translations provided by eaststrongox. (markt)
Improvements to Japanese translations provided by tak7iji. (markt)
2026-01-26 Tomcat 11.0.18 (markt)
Coyote
69936: Fix bug in previous fix for Tomcat Native crashes on
shutdown that triggered a significant memory leak. Patch provided by
Wes. (markt)
69938: Avoid changing the closed state of TLS channel when
resetting it after close. (remm)
not released Tomcat 11.0.17 (markt)
Catalina
69932: Fix request end access log pattern regression,
which would log the start time of the request instead. (remm)
Coyote
Prevent concurrent release of OpenSSLEngine resources and
the termination of the Tomcat Native library as it can cause crashes
during Tomcat shutdown. (markt)
Other
Add property "gpg.sign.files" to optionally disable release artefact
signing with GPG. (rjung)
not released Tomcat 11.0.16 (markt)
Catalina
69623: Additional fix for the long standing regression that
meant that calls to ClassLoader.getResource().getContent()
failed when made from within a web application with resource caching
enabled if the target resource was packaged in a JAR file. (markt)
Pull request #923: Avoid adding multiple CSRF tokens to a URL in
the CsrfPreventionFilter. (schultz)
69918: Ensure request parameters are correctly parsed for
HTTP/2 requests when the content-length header is not set. (dsoumis)
Enable minimum and recommended Tomcat Native versions to be set
separately for Tomcat Native 1.x and 2.x. Update the minimum and
recommended versions for Tomcat Native 1.x to 1.3.4. Update the minimum
and recommended versions for Tomcat Native 2.x to 2.0.12. (markt)
Add a new ssoReauthenticationMode to the Tomcat provided
Authenticators that provides a per Authenticator override of the SSO
Valve requireReauthentication attribute. (markt)
Ensure URL encoding errors in the Rewrite Valve trigger an exception
rather than silently using a replacement character. (markt)
Coyote
Improve warnings when setting ciphers lists in the FFM code, mirroring
the tomcat-native changes. (remm)
69910: Dereference TLS objects right after closing a socket
to improve memory efficiency. (remm)
Relax the JSSE vs OpenSSL configuration style checks on
SSLHostConfig to reflect the existing implementation that
allows one configuration style to be used for the trust attributes and a
different style for all the other attributes. (markt)
Better warning message when OpenSSLConf configuration
elements are used with a JSSE TLS implementation. (markt)
When using OpenSSL via FFM, don't log a warning about missing CA
certificates unless CA certificates were configured and the
configuration failed. (markt)
For configuration consistency between OpenSSL and JSSE TLS
implementations, TLSv1.3 cipher suites included in the
ciphers attribute of an SSLHostConfig are now
always ignored (previously they would be ignored with OpenSSL
implementations and used with JSSE implementations) and a warning is
logged that the cipher suite has been ignored. (markt)
Add the ciphersuite attribute to
SSLHostConfig to configure the TLSv1.3 cipher suites.
(markt)
Add OCSP support to JSSE based TLS connectors and make the use of OCSP
configurable per connector for both JSSE and OpenSSL based TLS
implementations. Align the checks performed by OpenSSL with those
performed by JSSE. (markt)
Add support for soft failure of OCSP checks with soft failure support
disabled by default. (markt)
Add support for configuring the verification flags passed to
OCSP_basic_verify when using an OpenSSL based TLS
implementation. (markt)
69333: Correct a regression in the previous fix for
69333 and ensure that reuse() or
release() is always called for a tag. (markt)
Cluster
62814: Document that human-readable names may be used for
mapSendOptions and align documentation with
channelSendOptions. Based on pull request #929 by
archan0621. (markt)
WebSocket
69920: When attempting to write to a closed
Writer or OutputStream obtained from a
WebSocket session, throw an IOException rather than an
IllegalStateExcpetion as required by Writer
and strongly suggested by OutputStream. (markt)
Other
Add test.silent property to suppress JUnit console output
during test execution. Useful for cleaner console output when running
tests with multiple threads. (csutherl)
Update the internal fork of Commons Pool to 2.13.1. (markt)
Update the internal fork of Commons DBCP to 2.14.0. (markt)
Update Commons Daemon to 1.5.1. (markt)
Update to the Eclipse JDT compiler 4.37. (markt)
Update ByteBuddy to 1.18.3. (markt)
Update UnboundID to 7.0.4. (markt)
Update Checkstyle to 12.3.1. (markt)
Improvements to French translations. (markt)
Improvements to Japanese translations provided by tak7iji. (markt)
Improvements to Chinese translations provided by Yang. vincent.h and
yong hu. (markt)
Update Tomcat Native to 2.0.12. (markt)
Update bnd to 7.2.0. (markt)
2025-12-08 Tomcat 11.0.15 (markt)
Catalina
69871: Increase log level to INFO for missing configuration
for the rewrite valve. (remm)
Add log warnings for additional Host appBase suspicious
values. (remm)
Remove hard dependency on tomcat-jni.jar for catalina.jar.
org.apache.catalina.Connector no longer requires
org.apache.tomcat.jni.AprStatus to be present. (markt)
Add the ability to use a custom function to generate the client
identifier in the CrawlerSessionManagerValve. This is only
available programmatically. Pull request #902 by Brian Matzon.
(markt)
Change the SSO reauthentication behaviour for SPNEGO authentication so
that a normal SPNEGO authentication is performed if the SSL Valve is
configured with reauthentication enabled. This is so that the delegated
credentials will be available to the web application. (markt)
Coyote
Don't log an incorrect certificate KeyStore location when
creating a TLS connector if the KeyStore instance has been
set directly on the connector. (markt)
HTTP/0.9 only allows GET as the HTTP method. (remm)
Add strictSni attribute on the Connector to
allow matching the SSLHostConfig configuration associated
with the SNI host name to the SSLHostConfig configuration
matched from the HTTP protocol host name. Non matching configurations
will cause the request to be rejected. The attribute default value is
true, enabling the matching. (remm)
Jasper
69877: Catch IllegalArgumentException when processing URIs
when creating the classpath to handle invalid URIs. (remm)
Fix populating the classpath with the webapp classloader repositories.
(remm)
Clustering
Correct a regression introduced in 11.0.11 that broke some clustering
configurations. (markt)
Web Applications
Manager: Fix abrupt truncation of the HTML and JSON complete server
status output if one or more of the web applications failed to start.
(schultz)
Manager: Include web application state in the HTML and JSON complete
server status output. (markt)
Documentation: Expand the documentation to better explain when OCSP is
supported and when it is not. (markt)
jdbc-pool
64083: If the underlying connection has been closed, don't
add it to the pool when it is returned. Pull request #235 by
Alex Panchenko. (markt)
Other
Add test profile system for selective test execution. Profiles can be
specified via -Dtest.profile=<name> to run specific
test subsets without using patterns directly. Profile patterns are
defined in test-profiles.properties. (csutherl)
Update file extension to media type mappings to align with the current
list used by the Apache Web Server (httpd). (markt)
Update the packaged version of the Tomcat Migration Tool for Jakarta EE
to 1.0.10. (markt)
Update Commons Daemon to 1.5.0. (markt)
Update Byte Buddy to 1.18.2. (markt)
Update Checkstyle to 12.2.0. (markt)
Improvements to Spanish translations provided by White Vogel. (markt)
Improvements to French translations. (remm)
Improvements to Japanese translations provided by tak7iji. (markt)
2025-11-10 Tomcat 11.0.14 (markt)
Catalina
When generating the class path in the Loader, re-order the check on
individual class path components to avoid a potential
NullPointerException. Identified by Coverity Scan. (markt)
Fix SSL socket factory configuration in the JNDI realm. Based on pull
request #915 by Joshua Rogers. (remm)
Add an attribute, digestInRfc3112Order, to
MessageDigestCredentialHandler to control the order in
which the credential and salt are digested. By default, the current,
non-RFC 3112 compliant, order of salt then credential will be used. This
default will change in Tomcat 12 to the RFC 3112 compliant order of
credential then salt. (markt)
Coyote
Graceful failure for OCSP on BoringSSL in the FFM code. (remm)
69866: Fix a memory leak when using a trust store with the
OpenSSL provider. Pull request #912 by aogburn. (markt)
Fix potential crash on shutdown when a Connector depends on the Tomcat
Native library. (markt)
69862: Avoid NPE unwrapping Servlet exception which would
hide some exception details. Patch submitted by Eric Blanquer. (remm)
Other
Update the internal fork of Apache Commons BCEL to 6.11.0. (markt)
Update to the Eclipse JDT compiler 4.37. (markt)
Update to Byte Buddy 1.17.8. (markt)
Update to Checkstyle 12.1.1. (markt)
Update to Jacoco 0.8.14. (markt)
Update to SpotBugs 4.9.8. (markt)
Update to JSign 7.4. (markt)
Update Maven Resolver Ant Tasks to 1.6.0. (rjung)
Improvements to French translations. (remm)
Improvements to Japanese translations provided by tak7iji. (markt)
2025-10-13 Tomcat 11.0.13 (markt)
Catalina
Add CIDR support for the configuration of internal and trusted proxies
for the RemoteIpFilter and RemoteIpValve.
Configuration via regular expression has been deprecated and will be
removed in Tomcat 12. (markt)
Log warnings when the SSO configuration does not comply with the
documentation. (remm)
Deprecate the RemoteAddrFilter and
RemoteAddrValve in favour of the
RemoteCIDRFilter and RemoteCIDRValve. (markt)
69837: Fix corruption of the class path generated by the
Loader when running on Windows. (markt)
Reject requests that map to invalid Windows file names earlier. (markt)
69839: Ensure that changes to session IDs (typically after
authentication) are promulgated to the SSO Valve to ensure that SSO
entries are fully clean-up on session expiration. Patch provided by Kim
Johan Andersson. (markt)
Fix a race condition in the creation of the storage location for the
FileStore. (markt)
Coyote
69836: Incorrect processing of partitioned setting when
generating session cookie. Patch submitted by Marc Pynaert. (remm)
69848: Fix copy/paste errors in 11.0.12 that meant DELETE
requests received via the AJP connector were processed as OPTIONS
requests and PROPFIND requests were processed as TRACE. (markt)
Various OCSP processing issues in the OpenSSL FFM code. (dsoumis)
WebSocket
69844: Close the connection with a protocol error if the
server sends masked frames. (markt)
69845: When using permessage-deflate with Java
25 onwards, handle the underlying Inflater and/or
Deflater throwing IllegalStateException
when closed rather than NullPointerException as they do in
Java 24 and earlier. (markt)
Other
69847: Remove remaining references to the
org.apache.tomcat.util.codec.binary package which has been
deleted. (markt)
2025-10-07 Tomcat 11.0.12 (markt)
Catalina
Change the digest used to calculate strong ETags (if enabled) for the
default Servlet from SHA-1 to SHA-256 to align with the recommendation
in RFC 9110 that hash functions used to generate strong ETags should be
collision resistant. (markt)
HTTP methods are case-sensitive so always use case sensitive comparisons
when comparing HTTP methods. (markt)
69814: Ensure that HttpSession.isNew() returns
false once the client has joined the session. (markt)
Further performance improvements for ParameterMap. (jengebr/markt)
Refactor access log time stamps to be based on the Instant
request processing starts. (markt)
Fix a case-sensitivity issue in the trailer header allow list. (markt)
Be proactive in cleaning up temporary files after a failed multi-part
upload rather than waiting for GC to do it. (markt)
Coyote
Add specific certificate selection code for TLS 1.3 supporting post
quantum cryptography. Certificates defined with type
MLDSA will be selected depending on the TLS client hello.
(remm)
Add groups attribute on SSLHostConfig
allowing to restrict which groups can be enabled on the SSL engine.
(remm)
Optimize the conversion of HTTP method from byte form to String form.
(markt)
Store HTTP request headers using the original case for the header name
rather than forcing it to lower case. (markt)
Cluster
Prevent the channel configuration (sender, receiver, membership service)
from being changed unless the channel is fully stopped. (markt)
Web applications
Documentation. Clarify the purpose of the maxPostSize
attribute of the Connector element. (markt)
Avoid NPE in manager webapp displaying certificate information. (remm)
Other
Update Byte Buddy to 1.17.7. (markt)
Update Checkstyle to 11.1.0. (markt)
Update SpotBugs to 4.9.6. (markt)
Update Jsign to 7.2. (markt)
Improvements to Russian translations provided by usmazat. (markt)
Improvements to French translations. (remm)
Improvements to Japanese translations provided by tak7iji. (markt)
Minor refactoring in JULI loggers. Patch provided by minjund. (schultz)
2025-09-05 Tomcat 11.0.11 (markt)
Catalina
Remove a number of unnecessary packages from the catalina-deployer.jar.
(markt)
69781: Fix concurrent access issues in the session
FileStore implementation that were causing lost sessions
when the store was used with the PersistentValve. Based on
pull request #882 by Aaron Ogburn. (markt)
Refactor WebResource locking to use the new
KeyedReentrantReadWriteLock. (markt)
Fix handling of QSA and QSD flags in
RewriteValve. (markt)
Coyote
69762: Additional overflow fix for HPACK decoding of
integers. Pull request #880 by Chenjp. (markt)
Ensure keys are handed out to OpenSSL even if PEMFile
fails to process it, with appropriate logging. (remm)
Add new ML-DSA key algorithm to PEMFile
and improve reporting when reading a key fails. (remm)
Fix possible early timeouts for network operations caused by a spurious
wake-up of a waiting thread. Found by Coverity Scan. (markt)
Cluster
Handle spurious wake-ups during leader election for
NonBlockingCoordinator. (markt)
Handle spurious wake-ups during sending of messages by
RpcChannel. (markt)
Other
Review logging and include the full stack trace and exception message
by default rather then just the exception message when logging an error
or warning in response to an exception. (markt)
Add escaping to log formatters to align with JSON formatter. (markt)
Update Checkstyle to 11.0.0. (markt)
2025-08-06 Tomcat 11.0.10 (markt)
Catalina
Fix bloom filter population for archive indexing when using a packed
WAR containing one or more JAR files. (markt)
Coyote
69748: Add missing call to set keep-alive timeout when using
HTTP/1.1 following an async request, which was present for AJP.
(remm/markt)
69762: Fix possible overflow during HPACK decoding of
integers. Note that the maximum permitted value of an HPACK decoded
integer is Integer.MAX_VALUE. (markt)
Update the HTTP/2 overhead documentation - particularly the code
comments - to reflect the deprecation of the PRIORITY frame
and clarify that a stream reset always triggers an overhead increase.
(markt)
Cluster
Add enableStatistics configuration attribute for the
DeltaManager, defaulting to true. (remm)
WebSocket
Align the WebSocket extension handling for WebSocket client connections
with WebSocket server connections. The WebSocket client now only
includes an extension requested by an endpoint in the opening handshake
if the WebSocket client supports that extension. (markt)
Web applications
Manager and Host Manager. Provide the Manager and Host Manager web
applications with a dedicated favicon file rather than using the one
from the ROOT web application which might not be present or may
represent something entirely different. Pull requests #876
and #878 by Simon Arame.
Other
Update Checkstyle to 10.26.1. (markt)
Improvements to French translations. (remm)
Improvements to Japanese translations by tak7iji. (markt)
2025-07-04 Tomcat 11.0.9 (markt)
Catalina
Ensure application configured welcome files override the defaults when
configuring an embedded web application programmatically. (markt)
Optimize Request#getCharsetHolder to avoid repeated parsing
when charset is null. Patch provided by morning-gu. (schultz)
Allow the default servlet to set the content length when the content
length is known, no content has been written and a Writer
is being used. (markt)
69717: Correct a regression in the fix for CVE-2025-49125
that prevented access to PreResources and PostResources when mounted
below the web application root with a path that was terminated with a
file separator. (remm/markt)
69731: Fix an issue that meant that the value of
maxParameterCount applied was smaller than intended for
multipart uploads with non-file parts when the parts were processed
before query string parameters. (markt)
Align size tracking for multipart requests with FileUpload's use of
long. (schultz)
Coyote
69710: Increase the default for maxPartCount
from 10 to 50. Update the documentation to
provide more details on the memory requirements to support multi-part
uploads while avoiding a denial of service risk. (markt)
69713: Correctly handle an HTTP/2 data frame that includes
padding when the headers include a content-length. (remm/markt)
Correctly collect statistics for HTTP/2 requests and avoid counting one
request multiple times. Based on pull request #868 by
qingdaoheze. (markt)
Fix JMX value for keepAliveCount on the endpoint. Also add
the value of useVirtualThreads in JMX. (remm)
69728: Remove incorrect warning when HTTP/2 is used with
optional certificate verification and improve the warnings when a web
application tries to use CLIENT-CERT with either HTTP/2 or a JSSE
implementation of TLS 1.3. (markt)
When setting the initial HTTP/2 connection limit, apply those limits
earlier. (markt)
Jasper
Remove IMPL_OBJ_START from EL grammar for
IDENTIFIER. (markt)
Remove the INSTANCEOF and FUNCTIONSUFFIX
definitions from the EL grammar as both are unused. (markt)
Web applications
Documentation. Provide more explicit guidance regarding the security
considerations for enabling write access to the web application via
WebDAV, HTTP PUT requests or similar. (markt)
Documentation. Add a section on reverse proxies to the security
considerations page. (markt)
Other
Update to the Eclipse JDT compiler 4.36. (markt)
Update UnboundID to 7.0.3. (markt)
Update Checkstyle to 10.25.1. (markt)
Improvements to French translations. (remm)
Improvements to Japanese translations provided by tak7iji. (markt)
2025-06-09 Tomcat 11.0.8 (markt)
Catalina
Add support for the java:module namespace which mirrors
the java:comp namespace. (markt)
69690: Calling HttpServletRequest.getParameter()
and related methods for a request with content type
multipart/form-data when the mapped servlet does not have a
@MultipartConfig or equivalent should not trigger an
exception. Note that calling getPart() or
getParts() is these circumstances will trigger an
exception. (markt)
Support parsing of multiple path parameters separated by ;
in a single URL segment. Based on pull request #860 by Chenjp.
(markt)
69699: Encode redirect URL used by the rewrite valve with
the session id if appropriate, and handle cross context with different
session configuration when using rewrite. (remm)
#863: Add support for comments at the end of lines in text
rewrite map files to align behaviour with Apache httpd. Pull request
provided by Chenjp. (markt)
69706: Fix saved request serialization issue in FORM
introduced when allowing infinite session timeouts. (remm)
Expand the path checks for Pre-Resources and Post-Resources mounted at a
path within the web application. (markt)
Coyote
#861: Refactor TaskQueue to use the new interface
RetryableQueue which enables better integration of custom
Executors which provide their own
BlockingQueue implementation. Pull request provided by
Paulo Almeida. (markt)
Provide finer grained control of multi-part request processing via two
new attributes on the Connector element.
maxPartCount limits the total number of parts in a
multi-part request and maxPartHeaderSize limits the size of
the headers provided with each part. Add support for these new
attributes to the ParameterLimitValve. (markt)
Jasper
69696: Mark the JSP wrapper for reload after a failed
compilation. (remm)
Web applications
69694: Improve error reporting of deployment tasks done
using the manager webapp when a copy operation fails. (remm)
Other
Add thread name to webappClassLoader.stackTraceRequestThread message.
Patch provided by Felix Zhang. (schultz)
Update Tomcat Native to 2.0.9. (markt)
Update the internal fork of Apache Commons FileUpload to 1.6.0
(2025-06-05). (markt)
Update EasyMock to 5.6.0. (markt)
Update Checkstyle to 10.25.0. (markt)
Use the full path when the installer for Windows sets calls
icacls.exe to set file permissions. (markt)
Improvements to Japanese translations provided by tak7iji. (markt)
2025-05-13 Tomcat 11.0.7 (markt)
Catalina
Process possible path parameters rewrite production in the rewrite
valve. (remm)
69588: Enable allowLinking to be set on
PreResources, JarResources and
PostResources. If not set explicitly, the setting will be
inherited from the Resources. (markt)
69633: Add support for Filters using context root mappings.
(markt)
69643: Optimize directory listing for large amount of files.
Patch submitted by Loic de l'Eprevier. (remm)
#843: Fix off by one validation logic for partial PUT ranges
and associated test case. Submitted by Chenjp. (remm)
Refactor GCI servlet to access resources via the
WebResource API. (markt)
69662: Report name in exception message when a naming lookup
failure occurs. Based on code submitted by Donald Smith. (remm)
Ensure that the FORM authentication attribute
authenticationSessionTimeout works correctly when sessions
have an infinite timeout when authentication starts. (markt)
Provide a content type based on file extension when web application
resources are accessed via a URL. (markt)
Jasper
69635: Add support to jakarta.el.ImportHandler
for resolving inner classes. (markt)
#842Add support for optimized execution of c:set and c:remove tags, when
activated via JSP servlet param useNonstandardTagOptimizations.
(jengebr)
Fix an edge case compilation bug for JSP and tag files on case
insensitive file systems that was exposed by the test case for
69635. (markt)
Web applications
68876: Documentation. Update the UML diagrams for server
start-up, request processing and authentication using PlantUML and
include the source files for each diagram. (markt)
Other
Update Jacoco to 0.8.13. (remm)
Explicitly set the locale to be used for Javadoc. For official releases,
this locale will be English (US) to support reproducible builds. (schultz)
Update Byte Buddy to 1.17.5. (markt)
Update Checkstyle to 10.23.1. (markt)
Update file extension to media type mappings to align with the current
list used by the Apache Web Server (httpd). (markt)
Improvements to French translations. (remm)
Improvements to Japanese translations provided by tak7iji. (markt)
2025-04-09 Tomcat 11.0.6 (markt)
Catalina
69602: Fix regression in releases from 12-2024 that were too
strict and rejected weak etags in the If-Range header with
a 400 response. Instead will consider it as a failed match since strong
etags are required for If-Range. (remm)
Return 400 if the amount of content sent for a partial PUT is
inconsistent with the range that was specified. (remm)
Add a new RateLimiter implementation,
org.apache.catalina.util.ExactRateLimiter, that can be used
with org.apache.catalina.filters.RateLimitFilter to provide
rate limit based on the exact values configured. Based on pull request
#794 by Chenjp. (markt)
Fix parsing of the time-taken token in the
ExtendedAccessLogValve. (remm)
Fix invocation of the FFM OpenSSL code for setting a SSL engine and
FIPS mode. (remm)
69600: Add IPv6 local addresses (RFC 4193 and RFC 4291) to
the default internal proxies for the RemoteIpFilter and RemoteIpValve.
(markt)
69615: Improve integration with the not found class resources
cache for users who are using a custom web application class loader
and/or using reflection to dynamically add external repositories to the
web application class loader. (markt)
Add a new initialisation parameter to the Default servlet -
allowPostAsGet - which controls whether a direct request
(i.e. not a forward or an include) for a static resource using the POST
method will be processed as if the GET method had been used. If not
allowed, the request will be rejected. The default behaviour of
processing the request as if the GET method had been used is unchanged.
(markt)
69623: Correct a long standing regression that meant that
calls to ClassLoader.getResource().getContent() failed when
made from within a web application with resource caching enabled.
(markt)
Add missing throwable stack trace to
JsonErrorReportValve equivalent to the one from
ErrorReportValve. (remm)
Fix stack trace trimming in ErrorReportValve after removal
of the security manager support. (remm)
Improve the handling of %nn URL encoding in the
RewriteValve and document how %nn URL encoding may be used
with rewrite rules. (markt)
Fix a potential exception when calling
WebappClassLoaderBase.getResource(""). (markt)
Coyote
69607: Allow failed initialization of MD5. Based on code
submitted by Shivam Verma. (remm)
69614: HTTP/2 priority frames with an invalid priority field
value should be ignored. (markt)
Improve handling of unexpected errors during HTTP/2 processing. (markt)
Simplify the process of using a custom SSLContext for an HTTPS enabled
connector. Based on pull request #805 by Hakky54. (markt)
Jasper
Replace custom URL encoding provided by the JSP runtime library with
calls to java.net.URLEncoder.encode(). (markt)
Add compiler using the Java Compiler API, supporting
exploded web applications. The compilerClassName to use is
org.apache.jasper.compiler.JavaCompiler. (remm)
Add support for specifying Java 25 (with the value 25) as
the compiler source and/or compiler target for JSP compilation. If used
with an Eclipse JDT compiler version that does not support these values,
a warning will be logged and the default will be used.
(markt)
Cluster
Fix resetting cross context sessions in the
ReplicationValve. (remm)
Web applications
Documentation. Add a link to the Log4j documentation that describes how
to use Log4j rather than JULI for Tomcat's internal logging. (markt)
Documentation. Document the runtime attributes available to web
applications via the Request or the ServletContext. Based on pull
request #832 by usmazat. (markt)
Other
Revert JSign to 6.0 to avoid a file locking issue. (markt)
Update to the Eclipse JDT compiler 4.35. (markt)
Update to NSIS 3.11. (markt)
Update to ByteBuddy 1.17.4. (markt)
Update to Checkstyle 10.21.4. (markt)
Update to SpotBugs to 4.9.3. (markt)
Improvements to French translations. (remm)
Improvements to Japanese translations provided by tak7iji. (markt)
2025-03-05 Tomcat 11.0.5 (markt)
Catalina
When looking up class loader resources by resource name, the resource
name should not start with '/'. If the resource name does start with
'/', Tomcat is lenient and looks it up as if the '/' was not present.
When the web application class loader was configured with external
repositories and names starting with '/' were used for lookups, it was
possible that cached 'not found' results could effectively hide lookup
results using the correct resource name. (markt)
Enable the JNDIRealm to validate credentials provided to
HttpServletRequest.login(String username, String password)
when the realm is configured to use GSSAPI authentication. (markt)
Improve the checks for exposure to and protection against CVE-2024-56337
so that reflection is not used unless required. The checks for whether
the file system is case sensitive or not have been removed. (markt)
Fix a bug in the JRE compatibility detection that incorrectly identified
Java 19 and Java 20 as supporting Java 21 features. (markt)
Add support for logging the connection ID (as returned by
ServletRequest.getServletConnection().getConnectionId())
with the AccessLogValve and
ExtendedAccessLogValve. Based on pull request #814
by Dmole. (markt)
Avoid scenarios where temporary files used for partial PUT would not
be deleted. (remm)
Coyote
69575: Avoid using compression if a response is already
compressed using compress, deflate or
zstd. (remm)
Use Transfer-Encoding for compression rather than
Content-Encoding if the client submits a TE
header containing gzip. (remm)
Fix a race condition in the handling of HTTP/2 stream reset that could
cause unexpected 500 responses. (markt)
Cluster
69598: Add detection of service account token changes to the
KubernetesMembershipProvider implementation and reload the
token if it changes. Based on a patch by Miroslav Jezbera. (markt)
Other
Add makensis as an option for building the Installer for
Windows on non-Windows platforms. (rjung/markt)
Update Byte Buddy to 1.17.1. (markt)
Update Checkstyle to 10.21.3. (markt)
Update SpotBugs to 4.9.1. (markt)
Update JSign to 7.1. (markt)
Improvements to French translations. (remm)
Improvements to Japanese translations by tak7iji. (markt)
2025-02-17 Tomcat 11.0.4 (markt)
Catalina
69576: Avoid possible failure initializing
JreCompat due to uncaught exception introduced for the
check for CVE-2024-56337. (remm)
Other
Add org.apache.juli.JsonFormatter to format log as one
line JSON documents. (remm)
2025-02-10 Tomcat 11.0.3 (markt)
Catalina
Add tableName configuration on the
DataSourcePropertyStore that may be used by the WebDAV
Servlet. (remm)
Improve HTTP If headers processing according to RFC 9110. Based on pull
request #796 by Chenjp. (remm/markt)
Allow readOnly attribute configuration on the
Resources element and allow configure the
readOnly attribute value of the main resources. The
attribute value will also be used by the default and WebDAV Servlets.
(remm)
69285: Optimise the creation of the parameter map for
included requests. Based on sample code and test cases provided by John
Engebretson. (markt)
69527: Avoid rare cases where a cached resource could be set
with 0 content length, or could be evicted immediately. (remm)
Fix possible edge cases (such as HTTP/1.0) with trying to detect
requests without body for WebDAV LOCK and PROPFIND. (remm)
69528: Add multi-release JAR support for the
bloomarchiveIndexStrategy of the
Resources. (remm)
Improve checks for WEB-INF and META-INF in
the WebDAV servlet. Based on a patch submitted by Chenjp. (remm)
Remove unused session to client map from
CrawlerSessionManagerValve. Submitted by Brian Matzon.
(remm)
Add a check to ensure that, if one or more web applications are
potentially vulnerable to CVE-2024-56337, the JVM has been configured to
protect against the vulnerability and to configure the JVM correctly if
not. Where one or more web applications are potentially vulnerable to
CVE-2024-56337 and the JVM cannot be correctly configured or it cannot
be confirmed that the JVM has been correctly configured, prevent the
impacted web applications from starting. (markt)
When using the WebDAV servlet with serveSubpathOnly set to
true, ensure that the destination for any requested WebDAV
operation is also restricted to the sub-path. (markt)
Generate an appropriate Allow HTTP header when the Default
servlet returns a 405 (method not allowed) response in response to a
DELETE request because the target resource cannot be
deleted. Pull request #802 provided by Chenjp. (markt)
Refactor creation of RequestDispatcher instances so that
the processing of the provided path is consistent with normal request
processing. (markt)
Add encodedReverseSolidusHandling and
encodedSolidusHandling attributes to Context to provide
control over the handling of the path used to created a
RequestDispatcher. (markt)
Handle a potential NullPointerException after an
IOException occurs on a non-container thread during
asynchronous processing. (markt)
Enhance lifecycle of temporary files used by partial PUT. (remm)
Added support for limiting the number of parameters in HTTP requests through
the new ParameterLimitValve. The valve allows configurable
URL-specific limits on the number of parameters. (dsoumis)
Coyote
Don't log warnings for registered HTTP/2 settings that Tomcat does not
support. These settings are now silently ignored. (markt)
Avoid a rare NullPointerException when recycling the
Http11InputBuffer. (markt)
Lower the log level to debug for logging an invalid socket channel when
processing poller events for the NIO Connector as this may occur in
normal usage. (markt)
Refactor the SavedRequestInputFilter so the buffered data
is used directly rather than copied. (markt)
Replace the unused buffer in
org.apache.catalina.connector.InputBuffer with a static,
zero length buffer. (markt)
Clean-up references to the HTTP/2 stream once request processing has
completed to aid GC and reduce the size of the HTTP/2 recycled request
and response cache. (markt)
Add a new Connector configuration attribute,
encodedReverseSolidusHandling, to control how
%5c sequences in URLs are handled. The default behaviour is
unchanged (decode) keeping in mind that the
allowBackslash attribute determines how the decoded
URI is processed. (markt)
69545: Improve CRLF skipping for the available
method of the ChunkedInputFilter. (remm)
Improve the performance of repeated calls to getHeader().
Pull request #813 provided by Adwait Kumar Singh. (markt)
69559: Ensure that the Java 24 warning regarding the use of
sun.misc.Unsafe::invokeCleaner is only reported by the JRE
when the code will be used. (markt)
Jasper
69508: Correct a regression in the fix for 69382
that broke JSP include actions if both the page attribute and the body
contained parameters. Pull request #803 provided by Chenjp.
(markt)
Update the identifier validation in the Expression Language parser to
reflect that, as of Java 9, _ is also a Java keyword and
may not be used as an identifier. (markt)
69521: Update the EL Parser to allow the full range of valid
characters in an EL identifier as defined by the Java Language
Specification. (markt)
69532: Optimise the creation of
ExpressionFactory instances. Patch provided by John
Engebretson. (markt)
Web applications
Documentation. Expand the description of the security implications of
setting mapperContextRootRedirectEnabled and/or
mapperDirectoryRedirectEnabled to true.
(markt)
Documentation. Better document the default for the
truststoreProvider attribute of a
SSLHostConfig element. (markt)
Other
Update to Commons Daemon 1.4.1. (markt)
Update the packaged version of the Tomcat Migration Tool for Jakarta EE
to 1.0.9. (markt)
Update the internal fork of Commons Pool to 2.12.1. (markt)
Update Byte Buddy to 1.16.1. (markt)
Update UnboundID to 7.0.2. (markt)
Update Checkstyle to 10.21.2. (markt)
Update SpotBugs to 4.9.0. (markt)
Improvements to French translations. (remm)
Improvements to Japanese translations by tak7iji. (markt)
Improvements to Chinese translations by leeyazhou. (markt)
2024-12-09 Tomcat 11.0.2 (markt)
Catalina
Add option to serve resources from subpath only with WebDAV Servlet like
with DefaultServlet. (michaelo)
Add special handling for the protocols attribute of
SSLHostConfig in storeconfig. (remm)
69442: Fix case sensitive check on content-type
when parsing request parameters. (remm)
Refactor duplicate code for extracting media type and subtype from
content-type into a single method. (markt)
Compatibility of generated embedded code with components where
constructors or property related methods throw a checked exception.
(remm)
The previous fix for inconsistent resource metadata during concurrent
reads and writes was incomplete. (markt)
#780: Fix content-range header length. Submitted
by Chenjp. (remm)
69444: Ensure that the
jakarta.servlet.error.message request attribute is set when
an application defined error page is called. (markt)
Avoid quotes for numeric values in the JSON generated by the status
servlet. (remm)
Add strong ETag support for the WebDAV and default servlet, which can
be enabled by using the useStrongETags init parameter with
a value set to true. The ETag generated will be a SHA-1
checksum of the resource content. (remm)
Use client locale for directory listings. (remm)
69439: Improve the handling of multiple
Cache-Control headers in the ExpiresFilter.
Based on pull request #777 by Chenjp. (markt)
69447: Update the support for caching classes the web
application class loader cannot find to take account of classes loaded
from external repositories. Prior to this fix, these classes could be
incorrectly marked as not found. (markt)
69466: Rework handling of HEAD requests. Headers explicitly
set by users will not be removed and any header present in a HEAD
request will also be present in the equivalent GET request. There may be
some headers, as per RFC 9110, section 9.3.2, that are present in a GET
request that are not present in the equivalent HEAD request. (markt)
69471: Log instances of CloseNowException caught
by ApplicationDispatcher.invoke() at debug level rather
than error level as they are very likely to have been caused by a client
disconnection or similar I/O issue. (markt)
Add a test case for the fix for 69442. Also refactor
references to application/x-www-form-urlencoded. Based on
pull request #779 by Chenjp. (markt)
69476: Catch possible ISE when trying to report PUT failure
in the DefaultServlet. (remm)
69478: Correct a regression introduced in 11.0.0-M19 that
meant when calling setHttpOnly(boolean) or
setSecure(boolean) for a cookie, the respective flags were
set regardless of the value passed to the method. (markt)
#787: Add regression tests for 69478. Pull request
provided by Thomas Krisch. (markt)
The default servlet now rejects HTTP range requests when two or more of
the requested ranges overlap. Based on pull request #782
provided by Chenjp. (markt)
Enhance Content-Range verification for partial PUT requests handled by
the default servlet. Provided by Chenjp in pull request #778.
(markt)
Harmonize DataSourceStore lookup in the global resources
to optionally avoid the comp/env prefix which is usually
not used there. (remm)
As required by RFC 9110, the HTTP Range header will now
only be processed for GET requests. Based on pull request
#790 provided by Chenjp. (markt)
Deprecate the useAcceptRanges initialisation parameter for
the default servlet. It will be removed in Tomcat 12 onwards where it
will effectively be hard coded to true. (markt)
Add DataSource based property storage for the
WebdavServlet. (remm)
Coyote
Align encodedSolidusHandling with the Servlet
specification. If the pass-through mode is used, any
%25 sequences will now also be passed through to avoid
errors and/or corruption when the application decodes the path. (markt)
Jasper
Further optimise EL evaluation of method parameters. Patch provided by
Paolo B. (markt)
Follow-up to the fix for 69381. Apply the optimisation for
method lookup performance in expression language to an additional
location. (markt)
Web applications
Documentation. Remove references to the ResourceParams
element. Support for ResourceParams was removed in Tomcat
5.5.x. (markt)
Documentation. 69477: Correct name of attribute for
RemoteIPFilter. The attribute is
internalProxies rather than
allowedInternalProxies. Pull request #786 provided
by Jorge Díaz. (markt)
Examples. Fix broken links when Servlet Request Info example is called
via a URL that includes a pathInfo component. (markt)
Examples. Expand the obfuscation of session cookie values in the request
header example to JSON responses. (markt)
Examples. Add the ability to delete session attributes in the servlet
session example. (markt)
Examples. Add a hard coded limit of 10 attributes per session for the
servlet session example. (markt)
Examples. Add the ability to delete session attributes and add a hard
coded limit of 10 attributes per session for the JSP form authentication
example. (markt)
Examples. Limit the shopping cart example to only allow adding the
pre-defined items to the cart. (markt)
Examples. Remove JSP calendar example. (markt)
Other
69465: Fix warnings during native image compilation using the
Tomcat embedded JARs. (markt)
Update Tomcat's fork of Commons DBCP to 2.13.0. (markt)
Update EasyMock to 5.5.0. (markt)
Update Checkstyle to 10.20.2. (markt)
Update BND to 7.1.0. (markt)
Update to the Eclipse JDT compiler 4.34. (markt)
Improvements to French translations. (remm)
Improvements to Korean translations. (markt)
Improvements to Chinese translations. (markt)
Improvements to Japanese translations by tak7iji. (markt)
2024-11-10 Tomcat 11.0.1 (markt)
Catalina
Add support for the new Servlet API method
HttpServletResponse.sendEarlyHints(). (markt)
55470: Add debug logging that reports the class path when a
ClassNotFoundException occurs in the digester or the web
application class loader. Based on a patch by Ralf Hauser. (markt)
69374: Properly separate between table header and body
in DefaultServlet's listing. (michaelo)
69373: Make DefaultServlet's HTML listing
file last modified rendering better (flexible). (michaelo)
Improve HTML output of DefaultServlet. (michaelo)
Refactor RateLimitFilter to use FilterBase as
the base class. The primary advantage for doing this is less code to
process init-param values. (markt)
69370: DefaultServlet's HTML listing
uses incorrect labels. (michaelo)
Avoid NPE in CrawlerSessionManagerValve for partially
mapped requests. (remm)
Add missing WebDAV Lock-Token header in the response when
locking a folder. (remm)
Invalid WebDAV lock requests should be rejected with 400. (remm)
Fix regression in WebDAV when attempting to unlock a collection. (remm)
Verify that destination is not locked for a WebDAV copy operation.
(remm)
Send 415 response to WebDAV MKCOL operations that include
a request body since this is optional and unsupported. (remm)
Enforce DAV: namespace on WebDAV XML elements. (remm)
Do not allow a new WebDAV lock on a child resource if a parent
collection is locked (RFC 4918 section 6.1). (remm)
WebDAV DELETE should remove any existing lock on
successfully deleted resources. (remm)
Remove WebDAV lock null support in accordance with RFC 4918 section 7.3
and annex D. Instead a lock on a non existing resource will create an
empty file locked with a regular lock. (remm)
Rewrite implementation of WebDAV shared locks to comply with RFC 4918.
(remm)
Implement WebDAV If header using code from the Apache
Jackrabbit project. (remm)
Add PropertyStore interface in the WebDAV Servlet,
to allow implementation of dead properties storage. The store used
can be configured using the propertyStore init parameter
of the WebDAV servlet by specifying the class name of the store. A
simple non persistent implementation is used if no custom store is
configured. (remm)
Implement WebDAV PROPPATCH method using the newly added
PropertyStore, and update PROPFIND to support
it. (remm)
Cache not found results when searching for web application class loader
resources. This addresses performance problems caused by components such
as java.sql.DriverManager which, in some circumstances,
will search for the same class repeatedly. In a large web application
this can cause performance problems. The size of the cache can be
controlled via the new notFoundClassResourceCacheSize on
the StandardContext. (markt)
Stop after INITIALIZED state should be a noop since it is
possible for subcomponents to be in FAILED after init.
(remm)
Fix incorrect web resource cache size calculations when there are
concurrent PUT and DELETE requests for the
same resource. (markt)
Add debug logging for the web resource cache so the current size can be
tracked as resources are added and removed. (markt)
Replace legacy WebDAV opaquelocktoken: scheme for lock
tokens with urn:uuid: as recommended by RFC 4918, and
remove secret init parameter. (remm)
Concurrent reads and writes (e.g. GET and PUT
/ DELETE) for the same path caused corruption of the
FileResource where some of the fields were set as if the
file exists and some were set as if it does not. This resulted in
inconsistent metadata. (markt)
69415: Ensure that the ExpiresFilter only sets
cache headers on GET and HEAD requests. Also
skip requests where the application has set Cache-Control:
no-store. (markt)
69419: Improve the performance of
ServletRequest.getAttribute() when there are multiple
levels of nested includes. Based on a patch provided by John
Engebretson. (markt)
69426: Restore providing a value (rather than null) for
Class.getProtectionDomain().getCodeSource().getLocation()
as a number of libraries and JRE features depend on this being non-null
even when a SecurityManager is not is use. (markt)
All applications to send an early hints informational response by
calling HttpServletResponse.sendError() with a status code
of 103. (schultz)
Coyote
Return null SSL session id on zero length byte array returned from the
SSL implementation. (remm)
Skip OpenSSLConf with BoringSSL since it is unsupported. (remm)
Align buffer reuse of the OpenSSLEngine for tomcat-native with the FFM
code. (remm)
Create the HttpParser in Http11Processor
if it is not present on the AbstractHttp11Protocol
to provide better lifecycle robustness for regular HTTP/1.1. The new
behavior was introduced on a previous refactoring to improve HTTP/2
performance. (remm)
OpenSSLContext will now throw a
KeyManagementException if something is known to have gone
wrong in the init method, which is the behavior
documented by javax.net.ssl.SSLContext.init. This makes
error handling more consistent. (remm)
Jasper
69399: Fix regression caused by the improvement
69333 which caused the tag release to be called
when using tag pooling, and to be skipped when not using it.
Patch submitted by Michal Sobkiewicz. (remm)
69381: Improve method lookup performance in expression
language. When the required method has no arguments there is no need to
consider casting or coercion and the method lookup process can be
simplified. Based on pull request #770 by John Engebretson.
(markt)
69382: Improve the performance of the JSP include action by
re-using results of relatively expensive method calls in the generated
code rather than repeating them. Patch provided by John Engebretson.
(markt)
69398: Avoid unnecessary object allocation in
PageContextImpl. Based on a suggestion by John Engebretson.
(markt)
69406: When using StringInterpreterEnum, do not
throw an IllegalArgumentException when an invalid
Enum is encountered. Instead, resolve the value at runtime.
Patch provided by John Engebretson. (markt)
69429: Optimise EL evaluation of method parameters for
methods that do not accept any parameters. Patch provided by John
Engebretson. (markt)
Other
Switch from DigiCert ONE to ssl.com eSigner for code signing. (markt)
Update Byte Buddy to 1.15.10. (markt)
Update CheckStyle to 10.20.0. (markt)
Improvements to German translations. (remm)
Improvements to French translations. (remm)
Improvements to Japanese translations by tak7iji. (markt)
2024-10-09 Tomcat 11.0.0 (markt)
Catalina
Ensure that ServerAuthModule.initialize() is called when
a Jakarta Authentication module is configured via
registerServerAuthModule(). (markt)
Ensure that the Jakarta Authentication CallbackHandler only
creates one GenericPrincipal in the Subject.
(markt)
If the Jakarta Authentication process fails with an Exception,
explicitly set the HTTP response status to 500 as the
ServerAuthContext may not have set it. (markt)
When persisting the Jakarta Authentication provider configuration,
create any necessary parent directories that don't already exist.
(markt)
Correct the logic used to detect errors when deleting temporary files
associated with persisting the Jakarta Authentication provider
configuration. (markt)
When processing Jakarta Authentication callbacks, don't overwrite a
Principal obtained from the PasswordValidationCallback with
null if the CallerPrincipalCallback does not
provide a Principal. (markt)
Avoid store config backup loss when storing one configuration more than
once per second. (remm)
69359: WebdavServlet duplicates
getRelativePath() method from super class with
incorrect Javadoc. (michaelo)
69360: Inconsistent DELETE behavior between
WebdavServlet and DefaultServlet.
(michaelo)
Make WebdavServlet properly return the Allow
header when deletion of a resource is not allowed. (michaelo)
Add log warning if non wildcard mappings are used with the
WebdavServlet. (remm)
69361: Ensure that the order of entires in a multi-status
response to a WebDAV is consistent with the order in which resources
were processed. (markt)
69362: Provide a better multi-status response when deleting a
collection via WebDAV fails. Empty directories that cannot be deleted
will now be included in the response. (markt)
69363: Use getPathPrefix() consistently in the
WebDAV servlet to ensure that the correct path is used when the WebDAV
servlet is mounted at a sub-path within the web application. (markt)
Coyote
69316: Ensure that
FastHttpDateFormat#getCurrentDate() (used to generate Date
headers for HTTP responses) generates the correct string for the given
input. Prior to this change, the output may have wrong by one second in
some cases. Pull request #751 provided by Chenjp. (markt)
Request start time may not have been accurately recorded for HTTP/1.1
requests preceded by a large number of blank lines. (markt)
Add server and serverRemoveAppProvidedValues
to the list of attributes the HTTP/2 protocol will inherit from the
HTTP/1.1 connector it is nested within. (markt)
Avoid possible crashes when using Apache Tomcat Native, caused by
destroying SSLContext objects through GC after APR has been terminated.
(remm)
Improve HTTP/2 handling of trailer fields for requests. Trailer fields
no longer need to be recieved before the headers of the subsequent
stream nor are trailer fields for an in progress stream swallowed if the
Connector is paused before the trailer fields are received. (markt)
Ensure the request and response are not recycled too soon for an HTTP/2
stream when a stream level error is detected during the processing of
incoming HTTP/2 frames. This could lead to incorrect processing times
appearing in the access log. (markt)
Jasper
69333: Remove unnecessary code from generated JSPs. (markt)
69338: Improve the performance of processing expressions that
include AND or OR operations with more than two operands and expressions
that use not empty. (markt)
69348: Reduce memory consumption in ELContext by
using lazy initialization for the data structure used to track lambda
arguments. (markt)
Web applications
The manager webapp will now be able to access certificates again when
OpenSSL is used. (remm)
Other
Update to the Eclipse JDT compiler 4.33. (markt)
Update Byte Buddy to 1.15.3. (markt)
Update CheckStyle to 10.18.2. (markt)
Improvements to French translations. (remm)
Improvements to Japanese translations by tak7iji. (markt)
Improvements to Chinese translations by Ch_jp. (markt)
2024-09-16 Tomcat 11.0.0-M26 (markt)
Coyote
Fix 69320, a regression in the fix for 69302 that
meant the HTTP/2 processing was likely to be broken for all clients once
any client sent an HTTP/2 reset frame. (markt)
2024-09-10 Tomcat 11.0.0-M25 (markt)
Catalina
Implement the recent clarification from the Jakarta Servlet project that
if a content length is declared then once that many bytes have been
written to the response, further writes should trigger an
IOException. (markt)
Improve performance of
ApplicationHttpRequest.parseParameters(). Based on sample
code and test cases provided by John Engebretson. (markt)
Coyote
Correct a regression in the fix for non-blocking reads of chunked
request bodies that caused InputStream.available() to
return a non-zero value when there was no data to read. In some
circumstances this could cause a blocking read to block waiting for more
data rather than return the data it had already received. (markt)
Add a new attribute cookiesWithoutEquals to the
Rfc6265CookieProcessor. The default behaviour is unchanged.
(markt)
Ensure that Tomcat sends a TLS close_notify message after receiving one
from the client when using the OpenSSLImplementation.
(markt)
69301: Fix trailer headers replacing non-trailer headers when
writing response headers to the access log. Based on a patch and test
case provided by hypnoce. (markt)
69302: If an HTTP/2 client resets a stream before the request
body is fully written, ensure that any ReadListener is
notified via a call to ReadListener.onErrror(). (markt)
Jasper
Switch the TldScanner back to logging detailed scan
results at debug level rather than trace level. (markt)
Simplify the implementation of OptionalELResolver. (markt)
WebSocket
If a blocking message write exceeds the timeout, don't attempt the write
again before throwing the exception. (markt)
An Exception being thrown during message processing (e.g. in a method
annotated with @onMessage) should not automatically cause
the connection to close. The application should handle the exception and
make the decision whether or not to close the connection. (markt)
Web applications
Documentation. Align the logging configuration documentation with the
current defaults. (markt)
jdbc-pool
69255: Correct a regression in the fix for 69206
that meant exceptions executing statements were wrapped in an
java.lang.reflect.UndeclaredThrowableException rather than
the application seeing the original SQLException. Fixed
by pull request #744 provided by Michael Clarke. (markt)
69279: Correct a regression in the fix for 69206
that meant that methods that previously returned a nullResultSet were returning a proxy with a null delegate.
Fixed by pull request #745 provided by Huub de Beer. (markt)
Other
Exclude the tomcat-coyote-ffm.jar from JAR scanning by
default. (markt)
Change the default log handler level to ALL so log messages
are not dropped by default if a logger is configured to use trace
(FINEST) level logging. (markt)
Update Hamcrest to 3.0. (markt)
Update EasyMock to 5.4.0. (markt)
Update Byte Buddy to 1.15.0. (markt)
Update CheckStyle to 10.18.0. (markt)
Update the internal fork of Apache Commons BCEL to 6.10.0. (markt)
Improvements to Spanish translations by Fernando. (markt)
Improvements to French translations. (remm)
Improvements to Japanese translations by tak7iji. (markt)
2024-08-06 Tomcat 11.0.0-M24 (markt)
Catalina
69234: Fix a regression caused by the refactoring to use
java.net.URI rather than java.net.URL that
broke support for parallel deployment with WAR files. (markt)
Coyote
Correct regressions in the refactoring that added recycling of the
coyote request and response to the HTTP/2 processing. (markt)
not released Tomcat 11.0.0-M23 (markt)
Catalina
Add support for RFC 8297 (Early Hints). Applications can use this
feature by casting the HttpServletResponse to
org.apache.catalina.connector.Reponse and then calling the
method void sendEarlyHints(). This method will be added to
the Servlet API (removing the need for the cast) in Servlet 6.2 onwards.
(markt)
69214: Do not reject a CORS request that uses POST but does
not include a content-type header. Tomcat now correctly
processes this as a simple CORS request. Based on a patch suggested by
thebluemountain. (markt)
Refactor SpnegoAuthenticator so it uses
Subject.callAs() rather than Subject.doAs()
when the available. (markt)
Coyote
Add FFM compatibility methods for LibreSSL support. Renegotiation is
not supported at the moment. (remm)
Add org.apache.tomcat.util.openssl.LIBRARY_NAME (specifies
the name of the library to load) and
org.apache.tomcat.util.openssl.USE_SYSTEM_LOAD_LIBRARY
(set to true to use System.loadLibrary rather
than the FFM library loading code) to configure the OpenSSL library
loading using FFM. (remm)
Add FFM compatibility methods for BoringSSL support. Renegotiation is
not supported in many cases. (remm)
Ensure that HTTP/2 stream input buffers are only created when there is a
request body to be read. (markt)
Refactor creation of HttpParser instances from the Processor level to
the Protocol level since the parser configuration depends on the
protocol and the parser is, otherwise, stateless. (markt)
Align HTTP/2 with HTTP/1.1 and recycle the container internal request
and response processing objects by default. This behaviour can be
controlled via the new discardRequestsAndResponses
attribute on the HTTP/2 upgrade protocol. (markt)
jdbc-pool
69206: Ensure statements returned from Statement
methods executeQuery(), getResultSet() and
getGeneratedKeys() are correctly wrapped before being
returned to the caller. Based on pull request #742 provided by
Michael Clarke.
Other
Fix packaging regression with missing osgi information following
addition of the test-only build target. (remm)
Update Tomcat Native to 2.0.8. (markt)
Update Byte Buddy to 1.14.18. (markt)
Improvements to French translations. (remm)
Improvements to Japanese translations by tak7iji. (markt)
2024-07-05 Tomcat 11.0.0-M22 (markt)
Catalina
Allow JAASRealm to use the configuration source to load a
configured configFile, for easier use with testing. (remm)
Fix a potential NullPointerException in classes that extend
ServletResponse when
setCharacterEncoding(Charset) is called with
null. (markt)
Add missing algorithm callback to the JAASCallbackHandler.
(remm)
Add the OpenSSL version number on the APR and OpenSSL status classes.
(remm)
69131: Expand the implementation of the filter
value of the Authenticator attribute allowCorsPreflight, so
that it applies to all requests that match the configured URL patterns
for the CORS filter, rather than only applying if the CORS filter is
mapped to /*. (markt)
Coyote
Improve the algorithm used to identify the IP address to use to unlock
the acceptor thread when a Connector is listening on all local
addresses. Interfaces that are configured for point to point connections
or are not currently up are now skipped. (markt)
Clean and log OpenSSL errors before processing of OpenSSL conf commands
in the FFM code. (remm)
69121: Ensure that the onComplete() event is
triggered if AsyncListener.onError() dispatches to a target
that throws an exception. (markt)
Following the trailer header field refactoring, -1 is no
longer an allowed value for maxTrailerSize. Adjust
documentation accordingly. (remm)
Move OpenSSL support using FFM to a separate JAR named
tomcat-coyote-ffm.jar that advertises Java 22 in its
manifest. (remm)
Fix search for OpenSSL library for FFM on Mac OS so that
java.library.path is searched. (markt)
Jasper
Update the optimisation in jakarta.el.ImportHandler so it
is aware of new classes added to the java.lang package in
Java 23. (markt)
Ensure that an exception in toString() still results in an
ELException when an object is coerced to a String using
ExpressionFactory.coerceToType(). (markt)
Add support for specifying Java 24 (with the value 24) as
the compiler source and/or compiler target for JSP compilation. If used
with an Eclipse JDT compiler version that does not support these values,
a warning will be logged and the default will used.
(markt)
69135: When using include directives in a tag file packaged
in a JAR file, ensure that context relative includes are processed
correctly. (markt)
69135: When using include directives in a tag file packaged
in a JAR file, ensure that file relative includes are processed
correctly. (markt)
69135: When using include directives in a tag file packaged
in a JAR file, ensure that file relative includes are are not permitted
to access files outside of the /META_INF/tags/ directory
nor outside of the JAR file. (markt)
Web applications
Fix status servlet detailed view of the connectors when using automatic
port. (remm)
Other
Add test-only build target to allow running only the
testsuite, supporting Java versions down to the minimum supported
to run Tomcat. (rjung)
Update to the Eclipse JDT compiler 4.32. (markt)
Update UnboundID to 7.0.1. (markt)
Update to SpotBugs 4.8.6. (markt)
Remove cglib dependency as it is not required by the version of EasyMock
used by the unit tests. (markt)
Update EasyMock to 5.3.0. This adds a test dependency on Byte-Buddy
1.14.17. (markt)
Improvements to Czech translations by Vladimír Chlup. (markt)
Improvements to French translations. (remm)
Improvements to Japanese translations by tak7iji. (markt)
Improvements to Chinese translations by fangzheng. (markt)
2024-06-18 Tomcat 11.0.0-M21 (markt)
Catalina
Add support for shallow copies when using WebDAV. (markt)
Remove the WebdavFixFilter as it is no longer required.
(markt)
69066: Fix regression in SPNEGO authenticator when
processing Base64. Submitted by Daniel Lyko. (remm)
Add RealmBase.getPrincipal(GSSName, GSSCredential, GSSContext)
for retrieving extended/additional information from an established
GSS context. (michaelo)
Correct a regression in the fix for 68721 that caused some
instances of LinkageError to be reported as
ClassNotFoundException. (markt)
Ensure that static resources deployed via a JAR file remain accessible
when the context is configured to use a bloom filter. Based on pull
request #730 provided by bergander. (markt)
Introduce reference counting so the AprLifecycleListener
is more robust. This particularly targets more complex embedded
configurations with multiple server instances with independent
lifecycles where more than one server instance requires the
AprLifecycleListener. (markt)
Coyote
Fix OpenSSL FFM use of ERR_error_string with a 128 byte buffer,
and use ERR_error_string_n instead. (remm)
Fix a crash on Windows setting CA certificate on null path.
(remm)
69068: Ensure read timouts are triggered for asynchronous,
non-blocking reads when using HTTP/2. (markt)
69133: Add task queue size configuration on the
Connector element, similar to the Executor
element, for consistency. (remm)
Make counting of active HTTP/2 streams per connection more robust.
(markt)
Add support for TLS 1.3 client initiated re-keying. (markt)
Jasper
68546: Small additional optimisation for initial loading of
Servlet code generated for JSPs. Based on a suggestion by Dan Armstrong.
(markt)
Web applications
Add the ability to set a sub-title for the Manager web application main
page. This is intended to allow users with lots of instances to easily
distinguish them. Based on pull request #724 by Simon Arame.
(markt)
Other
Revert Derby to 10.16.1.1 as that is the latest version of Derby that
runs on Java 17. (markt)
Update to Commons Daemon 1.4.0. (markt)
Update to Jakarta Annotations API 3.0. (markt)
Update to Jakarta Authentication API 3.1. (markt)
Update to Objenesis 3.4. (markt)
Update to Checkstyle 10.17.0. (markt)
Update to SpotBugs 4.8.5. (markt)
Improvements to French translations. (remm)
Improvements to Japanese translations by tak7iji. (markt)
2024-05-08 Tomcat 11.0.0-M20 (markt)
Catalina
Deprecate and remove sessionCounter (replaced by the
addition of the active session count and the expired session count,
as a reasonable approximation) and duplicates (which
does not represent a possible event in current implementations)
statistics from the session manager. (remm)
68890 Align output encoding of JSPs in the Manager webapp
with the XML declarations in those same files. (schultz)
Update Basic authentication to implement the requirements of RFC 7617
including the removal of the trimCredentials setting which
is now hard-coded to false. (markt)
Small performance optimization when logging cookies with no values.
(schultz)
Correct error handling for asynchronous requests. If the application
performs an dispatch during AsyncListener.onError() the
dispatch is now performed rather than completing the request using the
error page mechanism. (markt)
Re-factor ElapsedTimeElement in AbstractAccessLogValve to use a customizable
style. (schultz)
Add more timescale options to AccessLogValve and ExtendedAccessLogValve.
Allow timescales to apply to "time-taken" token in ExtendedAccessLogValve.
(schultz)
Fix WebDAV lock null (locks for non existing resources) thread safety
and removal. (remm)
Add periodic checking for WebDAV locks expiration. (remm)
Extend Asn1Parser to parse UTF8Strings.
(michaelo)
Remove MBean metadata for attibutes that have been removed. Based on
pull request #719 by Shawn Q. (markt)
Remove duplicate ID check from Manager.rotateSessionId().
(markt)
Coyote
Add OpenSSL FFM classes to tomcat-embed-core.jar. (remm)
Align non-secure and secure writes with NIO and skip the write attempt
when there are no bytes to be written. (markt)
Allow any positive value for socket.unlockTimeout. If a
negative or zero value is configured, the default of 250ms
will be used. (mark)
Reduce the time spent waiting for the connector to unlock. The previous
default of 10s was noticeably too long for cases where the unlock has
failed. The wait time is now 100ms plus twice
socket.unlockTimeout. (markt)
Ensure that the onAllDataRead() event is triggered when the
request body uses chunked encoding and is read using non-blocking IO.
(markt)
68934: Add debug logging in the latch object when exceeding
maxConnections. (remm)
Refactor trailer field handling to use a MimeHeaders
instance to store trailer fields. (markt)
Ensure that multiple instances of the same trailer field are handled
correctly. (markt)
Fix non-blocking reads of chunked request bodies. (markt)
Refactor HTTP header parsing to use common parsing code. (markt)
When an invalid HTTP response header was dropped, an off-by-one error
meant that the first header in the response was also dropped. Fix based
on pull request #710 by foremans. (markt)
Jasper
Add support for specifying Java 23 (with the value 23) as
the compiler source and/or compiler target for JSP compilation. If used
with an Eclipse JDT compiler version that does not support these values,
a warning will be logged and the default will used.
(markt)
WebSocket
68884: Reduce the write timeout when writing WebSocket close
messages for abnormal closes. The timeout defaults to 50 milliseconds
and may be controlled using the
org.apache.tomcat.websocket.ABNORMAL_SESSION_CLOSE_SEND_TIMEOUT
property in the user properties collection associated with the WebSocket
session. (markt)
Web applications
Examples: Improve performance of WebSocket chat application when
multiple clients disconnect at the same time. (markt)
Examples: Increase the number of previous messages displayed when using
the WebSocket chat application. (markt)
Examples: Improve performance of WebSocket snake application when
multiple clients disconnect at the same time. (markt)
Other
Switch to using the Base64 encoder and decoder provided by the JRE
rather than the version provided by Commons Codec. This removes the
internal fork of Commons Codec. (markt)
Update to the Eclipse JDT compiler 4.31. (markt)
Update NSIS to 3.10. (mark0t)
Update UnboundID to 7.0.0. (markt)
Update Checkstyle to 10.16.0. (markt)
Update JaCoCo to 0.8.12. (markt)
Update SpotBugs to 4.8.4. (markt)
Update the internal fork of Apache Commons BCEL to 6.9.0. (markt)
Update the internal fork of Apache Commons DBCP to 2.12.0. (markt)
Improvements to Japanese translations by tak7iji. (remm)
2024-04-16 Tomcat 11.0.0-M19 (remm)
Catalina
Add highConcurrencyStatus attribute to the
SemaphoreValve to optionally allow the valve to return an
error status code to the client when a permit cannot be acquired from
the semaphore. (remm)
Add checking of the "age" of the running Tomcat instance since its
build-date to the SecurityListener, and log a warning if the server
is old. (schultz)
When using the AsyncContext, throw an
IllegalStateException, rather than allowing an
NullPointerException, if an attempt is made to use the
AsyncContext after it has been recycled. (markt)
Add a default implementation for HttpSession.getAccessor()
to align with the Servlet 6.1 API. (markt)
Add the Jakarta EE 11 XML schemas and update Tomcat and included web
applications to use them. (markt)
Change the thread-safety mechanism for protecting StandardServer.services
from a simple synchronized lock to a ReentrantReadWriteLock to allow
multiple readers to operate simultaneously. Based upon a suggestion by
Markus Wolfe. (schultz)
Improve Service connectors, Container children and Service executors
access sync using a ReentrantReadWriteLock. (remm)
Improve handling of integer overflow if an attempt is made to upload a
file via the Servlet API and the file is larger than
Integer.MAX_VALUE. (markt)
68862: Handle possible response commit when processing read
errors. (remm)
Coyote
Add threadsMaxIdleTime attribute to the endpoint,
to allow configuring the amount of time before an internal executor
will scale back to the configured minSpareThreads size.
(remm)
Adjust the Set-Cookie header generated by the
Rfc6265CookieProcessor so that attributes with a value of
the empty string will be output as bare attribute names without an
equals sign or value. This will simplify future support for similar new
attributes by removing the need for special handling. (markt)
Refactor the internal representation of the HttpOnly and
Secure attributes to use the empty string as the value for
consistency with the recent changes to Set-Cookie header
generation. (markt)
Do not generate the Max-Age attribute for
Set-Cookie headers associated with cookies that have been
configured with a Max-Age value of zero as RFC 6265 does
not permit a value of zero in this case. (markt)
Correct a regression in the support for user provided
SSLContext instances that broke the
org.apache.catalina.security.TLSCertificateReloadListener.
(markt)
Jasper
Handle the case where the JSP engine forwards a request/response to a
Servlet that uses an OutputStream rather than a
Writer. This was triggering an
IllegalStateException on code paths where there was a
subsequent attempt to obtain a Writer. (markt)
Correctly handle the case where a tag library is packaged in a JAR file
and the web application is deployed as a WAR file rather than an
unpacked directory. (markt)
Prevent the web application's ClassLoader from being pinned by the JSP
compiler if an application uses a custom XMLInputFactory. Based upon a
suggestion from Simon Niederberger. (schultz)
Other
Update Checkstyle to 10.14.1. (markt)
Update the internal fork of Apache Commons BCEL to 6.8.2. (markt)
Update the internal fork of Apache Commons Codec to 1.16.1. (markt)
Improvements to French translations. (remm)
Improvements to Japanese translations by tak7iji. (remm)
Improvements to Chinese translations by leeyazhou. (remm)
2024-03-14 Tomcat 11.0.0-M18 (markt)
General
Reduce the minimum supported Java version to Java 17. (markt)
Catalina
Minor performance improvement for building filter chains. Based on
ideas from pull request #702 by Luke Miao. (remm)
Align error handling for Writer and
OutputStream. Ensure use of either once the response has
been recycled triggers a NullPointerException provided that
discardFacades is configured with the default value of
true. (markt)
68692: The standard thread pool implementations that are
configured using the Executor element now implement
ExecutorService for better support NIO2. The
org.apache.catalina.Executor interface now extends
ExecutorService. (remm)
68495: When restoring a saved POST request after a successful
FORM authentication, ensure that neither the URI, the query string nor
the protocol are corrupted when restoring the request body. (markt)
After forwarding a request, attempt to unwrap the response in order to
suspend it, instead of simply closing it if it was wrapped. Add a new
suspendWrappedResponseAfterForward boolean attribute on
Context to control the bahavior, defaulting to
true. (remm)
68721: Workaround a possible cause of duplicate class
definitions when using ClassFileTransformers and the
transformation of a class also triggers the loading of the same class.
(markt)
The rewrite valve should not do a rewrite if the output is identical
to the input. (remm)
Add a new valveSkip (or VS) rule flag to the
rewrite valve to allow skipping over the next valve in the Catalina
pipeline. (remm)
Coyote
Fix bad symbol lookup use in the OpenSSL FFM code. (remm)
Improve the HTTP/2 stream prioritisation process. If a stream uses all
of the connection windows and still has content to write, it will now be
added to the backlog immediately rather than waiting until the write
attempt for the remaining content. (markt)
Jasper
Add method invocation support for java.util.Optional via
the jakarta.el.OptionalELResolver to Tomcat's
implementation of the Jakarta EL API to align with the latest proposals
for the Jakarta EL 6.0 API. The property support has also been refined
for greater consistency. (markt)
The defaults for compilerSourceVM and
compilerTargetVM have been updated to 17 to align with Java
17 being the minimum Java version required for Tomcat 11. (markt)
Cluster
Avoid updating request count stats on async. (remm)
Other
Improvements to French translations. (remm)
Improvements to Japanese translations by tak7iji. (markt)
57130: Allow digest.(sh|bat) to accept password from a file
or stdin. (csutherl/schultz)
2024-02-19 Tomcat 11.0.0-M17 (markt)
Catalina
Implement HttpSession.getAccessor() which provides a
mechanism for applications to interact with an HttpSession
outside the standard Servlet processing of an HTTP request. This is
expected to be especially useful with applications using the Jakarta
WebSocket API. (markt)
Correct JPMS and OSGi meta-data for tomcat-embed-core.jar
by removing reference to org.apache.catalina.ssi package
that is no longer included in the JAR. Based on pull request
#684 by Jendrik Johannes. (markt)
Fix ServiceBindingPropertySource so that trailing \r\n
sequences are correctly removed from files containing property values
when configured to do so. Bug identified by Coverity Scan. (markt)
Add improvements to the CSRF prevention filter including the ability
to skip adding nonces for resource name and subtree URL patterns. (schultz)
Review usage of debug logging and downgrade trace or data dumping
operations from debug level to trace. (remm)
68089: Further improve the performance of request attribute
access for ApplicationHttpRequest and
ApplicationRequest. (markt)
68559: Allow asynchronous error handling to write to the
response after an error during asynchronous processing. (markt)
Coyote
Setting a null value for a cookie attribute should remove
the attribute. (markt)
Optimize state handling for OpenSSL context callbacks with the FFM API.
(remm)
Make asynchronous error handling more robust. Ensure that once a
connection is marked to be closed, further asynchronous processing
cannot change that. (markt)
Make asynchronous error handling more robust. Ensure that once the call
to AsyncListener.onError() has returned to the container,
only container threads can access the AsyncContext. This
protects against various race conditions that would otherwise occur if
application threads continued to access the AsyncContext.
Review usage of debug logging and downgrade trace or data dumping
operations from debug level to trace. In particular, most of the
HTTP/2 debug logging has been changed to trace level. (remm)
Add support for user provided SSLContext instances
configured on SSLHostConfigCertificate instances. Based on
pull request #673 provided by Hakan Altındağ. (markt)
Partial fix for 68558: Cache the result of converting to
String for request URI, HTTP header names and the request
Content-Type value to improve performance by reducing
repeated byte[] to String conversions. (markt)
Improve error reporting to HTTP/2 clients for header processing errors
by reporting problems at the end of the frame where the error was
detected rather than at the end of the headers. (markt)
Remove the remaining reference to a stream once the stream has been
recycled. This makes the stream eligible for garbage collection earlier
and thereby improves scalability. (markt)
Jasper
Additional fixes to correctly support length as a read-only
property of an array via the ArrayELResolver. (markt)
68546: Generate optimal size and types for JSP imports maps,
as suggested by John Engebretson. (remm)
Review usage of debug logging and downgrade trace or data dumping
operations from debug level to trace. (remm)
WebSocket
Correct a regression in the fix for 66508 that could cause an
UpgradeProcessor leak in some circumstances. (markt)
Review usage of debug logging and downgrade trace or data dumping
operations from debug level to trace. (remm)
Ensure that WebSocket connection closure completes if the connection is
closed when the server side has used the proprietary suspend/resume
feature to suspend the connection. (markt)
Web applications
Add support for responses in JSON format from the examples application
RequestHeaderExample. (schultz)
Other
Correct the remaining OSGi contract references in the manifest files to
refer to the Jakarta EE contract names rather than the Java EE contract
names. Based on pull request #685 provided by Paul A. Nicolucci.
(markt)
Update Checkstyle to 10.13.0. (markt)
Update JSign to 6.0. (markt)
Update the packaged version of the Tomcat Migration Tool for Jakarta EE
to 1.0.7. (markt)
Update Tomcat Native to 2.0.7. (markt)
Add strings for debug level messages. (remm)
Improvements to French translations. (remm)
Improvements to Japanese translations by tak7iji. (markt)
2024-01-09 Tomcat 11.0.0-M16 (markt)
Catalina
Allow alternate redirect status code for directory redirects issued by
the default servlet via the init param
directoryRedirectStatusCode. (funkman/markt)
68378: Align extension to MIME type mappings in the global
web.xml with those in httpd by adding
application/vnd.geogebra.slides for ggs,
text/javascript for mjs and
audio/ogg for opus. (markt)
Coyote
Refactor the VirtualThreadExecutor so that it can be used
by the NIO2 connector which was using platform threads even when
configured to use virtual threads. (markt)
Correct a regression in the fix for 67675 that broke TLS key
file parsing for PKCS#8 format keys that do not specify an explicit
pseudo-random function and rely on the default. This typically affects
keys generated by OpenSSL 1.0.2. (markt)
Allow multiple operations with the same name on introspected mbeans,
fixing a regression caused by the introduction of a second
addSslHostConfig method. (remm)
Relax the check that the HTTP Host header is consistent with the host
used in the request line, if any, to make the check case insensitive
since host names are case insensitive. (markt)
68348: Add support for the partitioned attribute for cookies
including session cookies. (markt)
Jasper
The defaults for compilerSourceVM and
compilerTargetVM have been updated to 21 to align with Java
21 being the minimum Java version required for Tomcat 11. (markt)
Web Applications
68035: Additional fix to the Manager application to enable
the deployment of a web application located in a Host's
appBase where the web application is specified by a bare
(no path) WAR or directory name as shown in the documentation. (markt)
Other
Update to the Eclipse JDT compiler 4.30. (markt)
Update Checkstyle to 10.12.7. (markt)
Update SpotBugs to 4.8.3. (markt)
Improvements to French translations. (remm)
Improvements to Japanese translations by tak7iji. (markt)
2023-12-12 Tomcat 11.0.0-M15 (markt)
Catalina
Background processes should not be run concurrently with lifecycle
operations of a container. (remm)
Add support for the jakarta.servlet.request.secure_protocol
request attribute that has been added in Jakarta Servlet 6.1. This
replaces the now deprecated Tomcat specific request attribute
org.apache.tomcat.util.net.secure_protocol_version. (markt)
Align behaviour with the latest addition to the Servlet 6.1
specification that requires that all HTTP error dispatches use the GET
method. (markt)
Correct unintended escaping of XML in some WebDAV responses. The XML
list of support locks when provided in response to a PROPFIND request
was incorrectly XML escaped. (markt)
68227: Ensure that AsyncListener.onComplete() is
called if AsyncListener.onError() calls
AsyncContext.dispatch(). (markt)
68228: Use a 408 status code if a read timeout occurs during
HTTP request processing. Includes a test case based on code provided by
adwsingh. (markt)
Coyote
Use Java code to load certificate chain when using OpenSSL through
the FFM API. (remm)
Jasper
68119: Refactor the CompositeELResolver to
improve performance during type conversion operations. (markt)
Web Applications
Examples. Improve the error handling so snakes associated with a user
that drops from the network are removed from the game. (markt)
Other
Update the OWB module to Apache OpenWebBeans 4.0.1. (remm)
68124: Migrate sample.war from javax to jakarta. (lihan)
Update UnboundID to 6.0.11. (markt)
Update Checkstyle to 10.12.5. (markt)
Update SpotBugs to 4.8.2. (markt)
Update Derby to 10.17.1. (markt)
Improvements to French translations. (remm)
Improvements to Japanese translations by tak7iji. (markt)
Improvements to Brazilian Portuguese translations by John William
Vicente. (markt)
Improvements to Russian translations by usmazat and remm. (markt)
2023-11-15 Tomcat 11.0.0-M14 (markt)
Catalina
67667: TLSCertificateReloadListener prints
unreadable rendering of X509Certificate#getNotAfter().
(michaelo)
The status servlet included in the manager webapp can now output
statistics as JSON, using the JSON=true URL parameter.
(remm)
Optionally allow ServiceBindingPropertySource to trim a trailing newline
from a file containing a property-value. (schultz)
Use Files.move instead of File.renameTo in the FarmWebDeployer to
support a broader range of environments, and to give better information
in the event of a failure. (schultz)
67793: Ensure the original session timeout is restored after
FORM authentication if the user refreshes a page during the FORM
authentication process. Based on a suggestion by Mircea Butmalai.
(markt)
67926: PEMFile prints unidentifiable string
representation of ASN.1 OIDs. (michaelo)
66875: Ensure that setting the request attribute
jakarta.servlet.error.exception is not sufficient to
trigger error handling for the current request and response. (markt)
68054: Avoid some file canonicalization calls introduced
by the fix for 65433. (remm)
68089: Improve performance of request attribute access for
ApplicationHttpRequest and ApplicationRequest.
(markt)
Use a 400 status code to report an error due to a bad request (e.g. an
invalid trailer header) rather than a 500 status code. (markt)
Ensure that an IOException during the reading of the
request triggers always error handling, regardless of whether the
application swallows the exception. (markt)
Coyote
66670: Add SSLHostConfig#certificateKeyPasswordFile and
SSLHostConfig#certificateKeystorePasswordFile. (michaelo)
When calling
SSLHostConfigCertificate.setCertificateKeystore(ks),
automatically call
setCertificateKeystoreType(ks.getType()). (markt)
Add OpenSSL integration using the FFM API rather than Tomcat Native.
OpenSSL support may be enabled by adding the
org.apache.catalina.core.OpenSSLLifecycleListener
listener on the Server element when using Java 22
(starting with preview build 20) or later. (remm)
67628: Clarify how the ciphers attribute of the
SSLHostConfig is used. (markt)
67666: Ensure TLS connectors using PEM files either work with
the TLSCertificateReloadListener or, in the rare case that
they do not, log a warning on Connector start. (markt)
67675: Support a wider range of KDF and ciphers for PEM files
than the combinations supported by the JVM by default. Specifically,
support the OpenSSL default of HmacSHA256 and DES-EDE3-CBC. (markt)
67927: Reloading TLS configuration can cause the Connector to
refuse new connections or the JVM to crash. (markt)
67938: Correct handling of large TLS client hello messages
that were causing the TLS handshake to fail. (markt)
68026: Convert selected MessageByte values to
String when first accessed to speed up subsequent accesses and reduce
garbage collection. (markt)
Jasper
Add support for Records to expression language. (markt)
68068: Performance improvement for EL. Based on a suggestion
by John Engebretson. (markt)
WebSocket
Correct missing metadata in the MANIFEST of the for WebSocket client API
JAR file. (markt)
Web applications
68035: Correct a regression in the fix for 56248
that prevented deployment via the Manager of a WAR or directory that was
already present in the appBase or a context file that was
already present in the xmlBase. (markt)
Other
67538: Make use of Ant's <javaversion /> task
to enfore the mininum Java build version. (michaelo)
Update Checkstyle to 10.12.4. (markt)
Update JaCoCo to 0.8.11. (markt)
Update SpotBugs to 4.8.0. (markt)
Update BND to 7.0.0. (markt)
2023-10-14 Tomcat 11.0.0-M13 (markt)
Coyote
67670: Fix regression with HTTP compression after code
refactoring. (remm)
jdbc-pool
67664: Correct a regression in the clean-up of unnecessary
use of fully qualified class names in 11.0.0-M12 that broke the
jdbc-pool. (markt)
2023-10-10 Tomcat 11.0.0-M12 (markt)
Catalina
65770: Provide a lifecycle listener that will automatically
reload TLS configurations a set time before the certificate is due to
expire. This is intended to be used with third-party tools that
regularly renew TLS certificates. (markt)
Fix handling of an error reading a context descriptor on deployment.
(remm)
Fix rewrite rule qsd (query string discard) being ignored if qsa was
also use, while it should instead take precedence. (remm)
67472: Send fewer CORS-related headers when CORS is not
actually being engaged. (schultz)
Improve handling of failures within recycle() methods.
(markt)
Coyote
67198: Ensure that the AJP connector attribute
tomcatAuthorization takes precedence over the
tomcatAuthentication attribute when processing an
auth_type attribute received from a proxy server. (markt)
67235: Fix a NullPointerException when an
AsyncListener handles an error with a dispatch rather than
a complete. (markt)
When an error occurs during asynchronous processing, ensure that the
error handling process is only triggered once per asynchronous cycle.
(markt)
Fix logic issue trying to match no argument method in IntropectionUtil.
(remm)
Improve thread safety around readNotify and writeNotify in the NIO2
endpoint. (remm)
Improve statistics collection for upgraded connections under load.
(remm)
PushBuilder has been deprecated in line with the changes
for the Servlet 6.1 specification. It will be replaced in a future
Tomcat 11 milestone with support for 103 early hints. (markt)
Remove support for HTTP/2 server push. Calls to
newPushBuilder() will always return null.
(markt)
Align validation of HTTP trailer fields with standard fields. (markt)
Improvements to HTTP/2 overhead protection. (markt)
Jasper
67080: Improve performance of EL expressions in JSPs that use
implicit objects. Based on suggestions by John Engebretson, Anurag Dubey
and Christopher Schultz. (markt)
Other
Update the internal fork of Apache Commons FileUpload to 7a8c324
(2023-09-16, 1.x-SNAPSHOT). Due to significant refactoring in the 2.x
branch requiring additional Commons IO dependencies, Tomcat has switched
to tracking the 1.x branch. (markt)
Add the Bundle-License header to the JAR manifest for all
Tomcat JARs. (markt)
Update to the Eclipse JDT compiler 4.29. (markt)
Update UnboundID to 6.0.10. (markt)
Update Checkstyle to 10.12.3. (markt)
Update Tomcat Native to 2.0.6. (markt)
Update Commons Pool to 2.12.0. (markt)
67611: Correct the download link in BUILDING.txt. (lihan)
Improvements to French translations. (remm)
Improvements to Japanese translations by tak7iji. (markt)
Improvements to Russian translations by usmazat. (markt)
2023-08-25 Tomcat 11.0.0-M11 (markt)
Catalina
If an application or library sets both a non-500 error code and the
jakarta.servlet.error.exception request attribute, use the
provided error code during error page processing rather than assuming an
error code of 500. (markt)
Update code comments and Tomcat output to use MiB for 1024 * 1024 bytes
and KiB for 1024 bytes rather than MB and kB. (martk)
Update the HTTP parameter handling to align with the changes in the
Jakarta Servlet 6.1 API Javadoc for the ServletRequest
methods used to obtain request parameters. Invalid parameters and/or
exceeding parameter size and/or quantity limits now trigger
exceptions. As a consequence, the FailedRequestFilter has
been removed. (markt)
Avoid protocol relative redirects in FORM authentication. (markt)
Web applications
Documentation. Update documentation to use MiB for 1024 * 1024 bytes and
KiB for 1024 bytes rather than MB and kB. (martk)
Other
Improvements to Chinese translations. (lihan)
Improvements to French translations. (remm)
Improvements to Japanese translations by tak7iji. (markt)
2023-08-14 Tomcat 11.0.0-M10 (markt)
Catalina
Fix potential database connection leaks in
DataSourceUserDatabase identified by Coverity Scan. (markt)
Make parsing of ExtendedAccessLogValve patterns more
robust. (markt)
Fix failure trying to persist configuration for an internal credential
handler. (remm)
66680: When serializing a session during the session
presistence process, do not log a warning that null Principals are not
serializable. Pull request #638 provided by tsryo. (markt)
66822: Use the same naming format in log messages for
Connector instances as the associated ProtocolHandler instance. (markt)
The parts count should also lower the actual
maxParameterCount used for parsing parameters if parts are
parsed first. (remm)
Coyote
Refactor blocking reads and writes for the NIO connector to remove
code paths that could allow a notification from the Poller to be missed
resuting in a timeout rather than the expected read or write. (markt)
Refactor waiting for an HTTP/2 stream or connection window update to
handle spurious wake-ups during the wait. (markt)
Improve extensibility of endpoints for socket channel creation and TLS.
Pull request #639 provided by Marco Fargetta. (remm)
Correct a regression introduced in 11.0.0-M9 and use the correct
constant when constructing the default value for the
certificateKeystoreFile attribute of an
SSLHostConfigCertificate instance. (markt)
Refactor HTTP/2 implementation to reduce pinning when using virtual
threads. (markt)
Pass through ciphers referring to an OpenSSL profile, such as
PROFILE=SYSTEM instead of producing an error trying to
parse it. (remm)
66841: Ensure that AsyncListener.onError() is
called after an error during asynchronous processing with HTTP/2.
(markt)
66842: When using asynchronous I/O (the default), include
DATA frames when calculating the HTTP/2 overhead count to ensure that
connections are not prematurely terminated. (markt)
Correct a race condition that could cause spurious RST messages to be
sent after the response had been written to an HTTP/2 stream. (markt)
WebSocket
66681: Fix a NullPointerException when flushing
batched messages with compression enabled using
permessage-deflate. (markt)
jdbc-pool
Fix the releaseIdleCounter does not increment when testAllIdle
releases them. Pull request #241 provided by Arun Chaitanya Miriappalli
(lihan)
Fix the ConnectionState state will be inconsistent with actual
state on the connection when an exception occurs while writing. Pull request
#643 provided by Wenjun Xiao. (lihan)
Other
Update NSIS to 3.09. (markt)
Update Checkstyle to 10.12.2. (markt)
Improvements to French translations. (remm)
Improvements to Japanese translations. Contributed by tak7iji and
Shirayuking. (markt)
66829: Fix quoting so users can use the _RUNJAVA
environment variable as intended on Windows when the path to the Java
executable contains spaces. (markt)
66834: Correct the OSGi contract references in the manifest
files to refer to the Jakarta EE contract names rather than the Java EE
contract names. (markt)
Update Tomcat Native to 2.0.5. (markt)
2023-07-10 Tomcat 11.0.0-M9 (markt)
Other
Correct properties for JSign dependency. (rjung)
not released Tomcat 11.0.0-M8 (markt)
Catalina
59232: Add
org.apache.catalina.core.ContextNamingInfoListener,
a listener which creates context naming information environment entries.
(michaelo)
66665: Add
org.apache.catalina.core.PropertiesRoleMappingListener,
a listener which populates the context's role mapping from a properties
file. (michaelo)
Fix an edge case where intra-web application symlinks would be followed
if the web applications were deliberately crafted to allow it even when
allowLinking was set to false. (markt)
Add utlity config file resource lookup on Context to allow
looking up resources from the webapp (prefixed with
webapp:) and make the resource lookup API more visible.
(remm)
Coyote
66627: Restore the documented behaviour of
MessageBytes.getType() that it returns the type of the
original content rather than reflecting the most recent conversion.
(markt)
66635: Correct certificate logging on start-up so it
differentiates between keystore based keys/certificates and PEM file
based keys/certificates and logs the relevant information for each.
(markt)
Jasper
Add java.util.Optional support via the
jakarta.el.OptionalELResolver to Tomcat's implementation
of the Jakarta EL API to align with the latest proposals for the Jakarta
EL 6.0 API. (markt)
Add support for specifying Java 22 (with the value 22) as
the compiler source and/or compiler target for JSP compilation. If used
with an Eclipse JDT compiler version that does not support these values,
a warning will be logged and the default will used.
(markt)
WebSocket
Improve handling of error conditions for the WebSocket server,
particularly during Tomcat shutdown. (markt)
Correct a regression in the fix for 66574 that meant the
WebSocket session could return false for onOpen() before
the onClose() event had been completed. (markt)
Update the WebSocket API provided by Tomcat to align with the latest
proposals from the Jakarta WebSocket project and make the WebSocket
Session instance available via SendResult.
(markt)
Web applications
Documentation. Expand the security guidance to cover the embedded use
case and add notes on the uses made of the java.io.tmpdir
system property. (markt)
66662: Documentation. Fix a typo in the name of the
algorithms attribute in the configuration section for
the Digest authentication valve. Pull request #629 provided by
gohilmca. (markt)
Other
Improvements to French translations. (remm)
Include the Windows specific binary distributions in the files uploaded
to Maven Central. (markt)
Remove support for running Tomcat on 32-bit Windows operating systems as
Java 21 is not available for that platform. (markt)
Improvements to Japanese translations. Contributed by tak7iji. (markt)
Update to the Eclipse JDT compiler 4.28. (markt)
Update UnboundID to 6.0.9. (markt)
Update Checkstyle to 10.12.1. (markt)
Update BND to 6.4.1. (markt)
Update JSign to 5.0. (markt)
2023-06-08 Tomcat 11.0.0-M7 (markt)
General
Increase the minimum supported Java version to Java 21. (markt)
Catalina
Move the management of the utility executor from the
init()/destroy() methods of components to the
start()/stop() methods. (markt)
Add RateLimitFilter which can be used to mitigate DoS and Brute Force
attacks. (isapir)
Remove support for using the ^ character to separate the
WAR file and WAR contents in Tomcat's custom WAR URL handler. The
current default separator character of * remains unchanged.
(markt)
Add org.apache.catalina.core.StandardVirtualThreadExecutor,
a virtual thread based executor that may be used with one or more
Connectors to process requests received by those Connectors using
virtual threads. (markt)
66513: Add a per session Semaphore to the
PersistentValve that ensures that, within a single Tomcat
instance, there is no more than one concurrent request per session. Also
expand the debug logging to include whether a request bypasses the Valve
and the reason if a request fails to obtain the per session Semaphore.
(markt)
66609: Ensure that the default servlet correctly escapes
file names in directory listings when using XML output. Based on pull
request #621 by Alex Kachanov. (markt)
66618: Add a numeric last modified field to the XML directory
listings produced by the default servlet to enable sorting in the XSLT.
Pull request #622 by Alex Kachanov. (markt)
66621: Attempts to lock a collection with WebDAV may
incorrectly fail if a child collection has an expired lock. (markt)
66622: Remove the xssProtectionEnabled setting
from the HttpHeaderSecurityFilter as support for the
associated HTTP header has been removed from all major browsers. (markt)
Coyote
66602: not sending WINDOW_UPDATE when dataLength is ZERO
on call SwallowedDataFramePayload. Pull request #619 by
ledefe. (lihan)
Other
Update to Commons Daemon 1.3.4. (markt)
Improvements to French translations. (remm)
Update Checkstyle to 10.12.0. (markt)
Update the packaged version of the Apache Tomcat Native Library to 2.0.4
to pick up the Windows binaries built with with OpenSSL 3.0.9. (markt)
2023-05-09 Tomcat 11.0.0-M6 (markt)
Catalina
66567: Fix missing IllegalArgumentException
after the Tomcat code was converted to using URI instead of URL. (remm)
Escape timestamp output in AccessLogValve if a
SimpleDateFormat is used which contains verbatim
characters that need escaping. (rjung)
Change output of vertical tab in AccessLogValve from
\v to \u000b. (rjung)
Improve performance of escaping in AccessLogValve
roughly by a factor of two. (rjung)
Improve JsonAccessLogValve: support more patterns
like for headers and attributes. Those will be logged as sub objects.
(rjung)
#613: Fix possible partial corrupted file copies when using
file locking protection or the manager servlet. Submitted
by Jack Shirazi. (remm)
Coyote
Add support for a new character set, gb18030-2022 -
introduced in Java 21, to the character set caching mechanism. (markt)
Fix an edge case in HTTP header parsing and ensure that HTTP headers
without names are treated as invalid. (markt)
Remove support for the HTTP Connector settings
rejectIllegalHeader and
allowHostHeaderMismatch. These are now hard-coded to the
previous defaults. (markt)
66591: Fix a regression introduced in the fix for
66512 that meant that an AJP Send Headers was not sent for
responses where no HTTP headers were set. (markt)
Jasper
66582: Account for EL having stricter requirements for static
imports than JSPs when adding JSP static imports to the EL context.
(markt)
WebSocket
66574: Refactor WebSocket session close to remove the lock on
the SocketWrapper which was a potential cause of deadlocks
if the application code used simulated blocking. (markt)
66575: Avoid unchecked use of the backing array of a
buffer provided by the user in the compression transformation. (remm)
Improve exception handling when flushing batched messages during
WebSocket session close. (markt)
66581: Update AsyncChannelGroupUtil to align it
with the current defaults for AsynchronousChannelGroup. Pull request
#612 by Matthew Painter. (markt)
Other
Improvements to French translations. (remm)
Improvements to Chinese translations. (lihan)
Update Checkstyle to 10.10.0. (markt)
Update Jacoco to 0.8.10. (markt)
Update the packaged version of the Tomcat Migration Tool for Jakarta EE
to 1.0.7. (markt)
2023-04-19 Tomcat 11.0.0-M5 (markt)
Catalina
Add a doPatch method to HttpServlet to provide
support for the HTTP PATCH method as defined in RFC 5789.
This is one of the changes in the Servlet 6.1 API. (markt)
65995: Implement RFC 9239 and use
text/javascript as the media type for JavaScript rather
than application/javascript. (markt)
Tomcat no longer sets the java.protocol.handler.pkgs system
property when starting. Users are now free to configure this property if
they wish. (markt)
Add an access log valve that uses a json format. Based on pull request
#539 provided by Thomas Meyer. (remm)
Harden the FORM authentication process against DoS attacks by using a
reduced session timeout if the FORM authentication process creates a
session. The duration of this timeout is configured by the
authenticationSessionTimeout attribute of the FORM
authenticator. (markt)
Implement the new Servlet API methods that provide additional control
when sending a redirect to the client. (markt)
Update Digest authentication support to align with RFC 7616. This adds a
new configuration attribute, algorithms, to the
DigestAuthenticator with a default of
SHA-256,MD5. (markt)
Reduce the default value of maxParameterCount from 10,000
to 1,000. (markt)
66527: Correct the Javadoc for the
Tomcat.addWebapp() methods that incorrectly stated that the
docBase parameter could be a relative path. (markt)
66524 Correct eviction ordering in WebResource cache to
be LRU as intended. (schultz)
Add support code for custom user attributes in RealmBase.
Based on code from #473 by Carsten Klein. (remm)
Expand the set of HTTP request headers considered sensitive that should
be skipped when generating a response to a TRACE request.
This aligns with the current draft of the Servlet 6.1 specification.
(markt)
66541: Improve handling for cached resources for resources
that use custom URL schemes. The scheme specific equals()
and hashCode() algorithms, if present, will now be used for
URLs for these resources. This addresses a potential performance issue
with some OSGi custom URL schemes that can trigger potentially slow DNS
lookups in some configurations. Based on a patch provided by Tom
Whitmore. (markt)
When using a custom session manager deployed as part of the web
application, avoid ClassNotFoundExceptions when validating
session IDs extracted from requests. (markt)
66543: Give StandardContext#fireRequestDestroyEvent
its own log message. (fschumacher)
66554: Initialize Random during server initialization to
avoid possible JVM thread creation in the webapp context on some
platforms. (remm)
Make the server utility executor available to webapps using a Servlet
context attribute named
org.apache.tomcat.util.threads.ScheduledThreadPoolExecutor. (remm)
Coyote
JSON filter should support specific escaping for common special
characters as defined in RFC 8259. Based on code submitted by
Thomas Meyer. (remm)
66511: Fix GzipOutputFilter (used for compressed
HTTP responses) when used with direct buffers. Patch suggested by Arjen
Poutsma. (markt)
66512: Align AJP handling of invalid HTTP response headers
(they are now removed from the response) with HTTP. (markt)
66530: Correct a regression in the fix for bug
66442 that meant that streams without a response body did not
decrement the active stream count when completing leading to
ERR_HTTP2_SERVER_REFUSED_STREAM for some connections.
(markt)
Remove use of deprecated classes in the javax.security.cert
package. Pull request #608 provided by Eirik Bjorsnos. (markt)
Jasper
Fix bug that meant some instances of coercing a
LambdaExpression to a functional interface invocation
failed. (markt)
66536: Fix parsing of tag files that meant that tag
directives could be ignored for some tag files. (markt)
Align the EL implementation with the latest changes to the Jakarta EL
specification and add support for the length attribute to the
ArrayELResolver. (markt)
Cluster
66535: Redefine the maxValidTime attribute of
FarmWarDeployer to be the maximum time allowed between
receiving parts of a transferred file before the transfer is cancelled
and the associated resources cleaned-up. A new warning message will be
logged if the file transfer is cancelled. (markt)
WebSocket
66508: When using WebSocket with NIO2, avoid waiting for
a timeout before sending the close frame if an I/O error occurs during a
write. (markt)
66548: Expand the validation of the value of the
Sec-Websocket-Key header in the HTTP upgrade request that
initiates a WebSocket connection. The value is not decoded but it is
checked for the correct length and that only valid characters from the
base64 alphabet are used. (markt)
Web applications
66542: Documentation. Update the JNDI documentation to
replace references to JavaMail with references to Jakarta Mail. (markt)
Other
Improvements to French translations. (remm)
Improvements to Japanese translations. Contributed by Shirayuking and
tak7iji. (markt)
Improvements to Chinese translations. Contributed by totoo. (markt)
Refactor code using MD5Encoder to use
HexUtils.toHexString(). (markt)
66507: Fix a bug that $JAVA_OPTS is not passed
to the jvm in catalina.sh when calling version.
Patch suggested by Eric Hamilton. (lihan)
Update the internal fork of Commons DBCP to f131286 (2023-03-08,
2.10.0-SNAPSHOT). This corrects a regression introduced in 11.0.0-M2.
(markt)
Improve the error messages if JRE_HOME or
JAVA_HOME are not set correctly. On windows, align the
handling of JRE_HOME and JAVA_HOME for the
start-up scripts and the service install script. (markt)
Update to the Eclipse JDT compiler 4.27. (markt)
Update UnboundID to 6.0.8. (markt)
Update Checkstyle to 10.9.3. (markt)
Update Jacoco to 0.8.9. (markt)
Enhance PEMFile to load from an InputStream. Patch provided by
Romain Manni-Bucau. (schultz)
2023-03-06 Tomcat 11.0.0-M4 (markt)
General
Fix a bug that memory allocation is larger than limit in
SynchronizedStack to reduce memory footprint. (lihan)
Catalina
Add support for txt: and rnd: rewrite map
types from mod_rewrite. Based on a pull request #591
provided by Dimitrios Soumis. (remm)
Provide a more appropriate response (501 rather than 400) when rejecting
an HTTP request using the CONNECT method. (markt)
66491: Revert the switch to using the ServiceLoader mechanism
to load the custom URL protocol handlers that Tomcat uses. The original
system property based approach has been restored. (markt)
Coyote
Add a check for the validity of the scheme pseudo-header in HTTP/2.
(markt)
66482: Restore inline state after async operation in NIO2,
to account the fact that unexpected exceptions are sometimes thrown
by the implementation. Patch submitted by zhougang. (remm)
Jasper
Provide an implementation of the sub-set of JavaBeans support that does
not depend on the java.beans package. This for use by
Expression Language when the java.desktop module (which is
where the java.beans package resides) is not available.
(markt)
2023-02-23 Tomcat 11.0.0-M3 (markt)
General
Increase the minimum supported Java version to Java 17. Note that
Jakarta EE 11 permits a minimum Java version of 21. The minimum Java
version for Tomcat 11 may be increased to Java 21 before the first
stable release. (markt)
Catalina
Allow a Valve to access cookies from a request that cannot be mapped to
a Context. (markt)
Implement the new Servlet API methods for setting character encodings
that accept Charset objects. (markt)
The default HEAD response no longer includes some HTTP header fields
where the value is determined only while generating the content as per
section 9.3.2 of RFC 9110. (markt)
66438: Correct names of Jakarta modules in JPMS metadata.
(markt)
Switch to using the ServiceLoader mechanism to load the custom URL
protocol handlers that Tomcat uses. (markt)
Switch to using LongAdder rather than
AtomicInteger to track request count and error count for
servlets. (markt)
Implement the clarification from the Jakarta Servlet project that
Servlets mapped to the context root should be mapped for requests to the
context root with or without the trailing /. (markt)
Implement the clarification from the Jakarta Servlet project that
calling ServletOutputStream.close() on a stream in
non-blocking mode returns immediately with the stream effectively closed
and any data remaining to be written is written in the background by the
container. (markt)
Avoid possible ISE when scanning from bad JAR URLs, to restore the
previous behavior following the removal of Java 9+ reflection code which
caught the ISE. (remm)
Refactor uses of String.replaceAll() to use
String.replace() where regular expressions where not being
used. Pull request #581 provided by Andrei Briukhov. (markt)
Add error report valve that allows redirecting to of proxying from an
external web server. Based on code and ideas from pull request
#506 provided by Max Fortun. (remm)
66470: Add the Shared Address Space defined by RFC 6598
(100.64.0.0/10) to the regular expression used to identify internal
proxies for the RemoteIpFilter and
RemoteIpValve. (markt)
66471: Fix JSessionId secure attribute missing When
RemoteIpFilter determines that this request was submitted
via a secure channel. (lihan)
Add the additional HTTP status code constants to
HttpServletResponse defined by the Jakarta Servlet project
for the Servlet 6.1 API. (markt)
Implement the clarification from the Jakarta Servlet project that
calling one of the HttpServletResponse methods for setting
HTTP header values with null as the new header value
removes any existing header of that name. (markt)
Coyote
Log basic information for each configured TLS certificate when Tomcat
starts. (markt)
66442: When an HTTP/2 response must not include a body,
ensure that the end of stream flag is set on the headers frame and that
no data frame is sent. (markt)
Fix a bug that prevented HTTP/2 connections from timing out when using
a Connector configured with useAsyncIO=true (the default).
(markt)
Provided dedicated loggers
(org.apache.tomcat.util.net.NioEndpoint.certificate /
org.apache.tomcat.util.net.Nio2Endpoint.certificate) for
logging of configured TLS certificates. (markt)
Jasper
66419: Fix calls from expression language to a method that
accepts varargs when only one argument was passed. (markt)
66441: Make imports of static fields in JSPs visible to any
EL expressions used on the page. (markt)
Web applications
66429: Documentation. Limit access to the documentation web
application to localhost by default. (markt)
66429: Examples. Limit access to the examples web application
to localhost by default. (markt)
Other
Update BND to 6.4.0. (markt)
Remove support for starting Tomcat under a SecurityManager. (markt)
Improvements to Chinese translations. (lihan)
Improvements to French translations. (remm)
Improvements to Japanese translations. Contributed by tak7iji. (markt)
Improvements to Korean translations. (woonsan)
Update the packaged version of the Apache Tomcat Native Library to 2.0.3
to pick up the Windows binaries built with with OpenSSL 3.0.8. (markt)
not released Tomcat 11.0.0-M2 (markt)
Catalina
Update the ServletInputStream and
ServletOuputStream classes in the Servlet API to align with
the recent updates in the Jakarta Servlet specification to support
reading and writing with ByteBuffers. The changes also
clarified various aspects of the Servlet non-blocking API. (markt)
66388: Correct a regression in the refactoring that replaced
the use of the URL constructors. The regression broke
lookups for resources that contained one or more characters in their
name that required escaping when used in a URI path. (markt)
66392: Change the default value of AccessLogValve's
file encoding to UTF-8 and update documentation. (lihan)
66393: Align ExtendedAccessLogValve's x-P(XXX) with the
documentation. (lihan)
Remove JAX-RPC support which was removed from the Jakarta EE platform
for Jakarta EE 9. (markt)
Coyote
Update Cookie parsing and handling to treat the quotes in a quoted
cookie value as part of the value as required by RFC 6265 and explicitly
clarified in RFC 6265bis. (markt)
Add an RFC 8941 structured field parser. (markt)
Add a parser for the priority HTTP header field defined in
RFC 9218. (markt)
When resetting an HTTP/2 stream because the final response has been
generated before the request has been fully read, use the HTTP/2 error
code NO_ERROR so that client does not discard the response.
Based on a suggestion by Lorenzo Dalla Vecchia. (markt)
66385: Correct a bug in HTTP/2 where a non-blocking read for
a new frame with the NIO2 connector was incorrectly made using the read
timeout leading to unexpected stream closure. (markt)
Jasper
66370: Change the default of the
org.apache.el.GET_CLASSLOADER_USE_PRIVILEGED system
property to true unless the EL library is running on Tomcat
in which case the default remains false as the EL library
is already called from within a privileged block and skipping the
unnecessary privileged block improves performance. (markt)
Add support for specifying Java 21 (with the value 21) as
the compiler source and/or compiler target for JSP compilation. If used
with an Eclipse JDT compiler version that does not support these values,
a warning will be logged and the default will used.
(markt)
Other
Update the packaged version of the Apache Tomcat Migration Tool for
Jakarta EE to 1.0.6. (markt)
Update the internal fork of Apache Commons BCEL to 2ee2bff (2023-01-03,
6.7.1-SNAPSHOT). (markt)
Update the internal fork of Apache Commons Codec to 3eafd6c (2023-01-03,
1.16-SNAPSHOT). (markt)
Update the internal fork of Apache Commons FileUpload to 34eb241
(2023-01-03, 2.0-SNAPSHOT). (markt)
Update the internal fork of Apache Commons DBCP to f131286 (2023-01-03,
2.10.0-SNAPSHOT). (markt)
Improvements to Japanese translations. Contributed by Shirayuking.
(markt)
Improvements to Portuguese translations. Contributed by Guilherme
Custódio. (markt)
Update to the Eclipse JDT compiler 4.26. (markt)
Update Checkstyle to 10.6.0. (markt)
Update Unboundid to 6.0.7. (markt)
Update SpotBugs to 4.7.3. (markt)
2022-12-05 Tomcat 11.0.0-M1 (markt)
General
This release contains all of the changes up to and including those in
Apache Tomcat 10.1.1 plus the additional changes listed below. (markt)
Catalina
66175: Change the default character set used by the
BasicAuthenticator from ISO-8859-1 to UTF-8. (markt)
66209: Add a configuration option to allow bloom filters used
to index JAR files to be retained for the lifetime of the web
application. Prior to this addition, the indexes were always flushed by
the periodic calls to WebResourceRoot.gc(). As part of this
addition, configuration of archive indexing moves from
Context to WebResourceRoot. Based on a patch
provided by Rahul Jaisimha. (markt)
66330: Correct a regression introduced when fixing
62897 that meant any value configured for
skipMemoryLeakChecksOnJvmShutdown on the
Context was ignored and the default was always used.
(markt)
66331: Fix a regression in refactoring for Stack
on the SystemLogHandler which caught incorrect exception.
(lihan)
66338: Fix a regression that caused a nuance in refactoring
for ErrorReportValve. (lihan)
Escape values used to construct output for the
JsonErrorReportValve to ensure that it always outputs valid
JSON. (markt)
Correct the default implementation of
HttpServletRequest.isTrailerFieldsReady() to return
true so it is consistent with the default implementation of
HttpServletRequest.getTrailerFields() and with the Servlet
API provided by the Jakarta EE project. (markt)
Refactor WebappLoader so it only has a runtime dependency
on the migration tool for Jakarta EE if configured to use the converter
as classes are loaded. (markt)
Improve the behavior of the credential handler attribute that is set in
the Servlet context so that it actually reflects what is used during
authentication. (remm)
66359: Update javadoc for RemoteIpValve and RemoteIpFilter with
correct protocolHeader default value of "X-Forwarded-Proto".
(lihan)
Add support for the new attribute for error dispatches
jakarta.servlet.error.query_string. (markt)
Update ignoreAnnotation attribute on Context
to dissociate it from metadata-complete. (remm)
Coyote
Correct the date format used with the expires attribute of HTTP cookies.
A single space rather than a single dash should be used to separate the
day, month and year components to be compliant with RFC 6265. (markt)
Include the name of the current stream state in the error message when a
stream is cancelled due to an attempt to write to the stream when it is
in a state that does not permit writes. (markt)
NIO writes never return -1 so refactor CLOSED_NIO_CHANNEL
not to do so and remove checks for this return value. Based on
#562 by tianshuang. (markt)
Remove unnecessary code that exposed the asyncTimeout to
components that never used it. (markt)
Ensure that all MessageBytes conversions to byte arrays are
valid for the configured character set and throw an exception if not.
(markt)
When an HTTP/2 stream was reset, the current active stream count was not
reduced. If enough resets occurred on a connection, the current active
stream count limit was reached and no new streams could be created on
that connection. (markt)
Jasper
66294: Make the use of a privileged block to obtain the
thread context class loader added to address 62080 optional
and disabled by default. This is now controlled by the
org.apache.el.GET_CLASSLOADER_USE_PRIVILEGED system
property. (markt)
66317: Fix for Lambda coercion security manager missing
privileges. Based on pull request #557 by Isaac Rivera Rivas (lihan)
66325: Fix concurrency issue in evaluation of expression
language containing lambda expressions. (markt)
Update the ErrorData class in the JSP API to align with the
recent changes in the Jakarta Pages specification to support the new
error dispatch attribute
jakarta.servlet.error.query_string.
Web applications
66348: Update the JARs listed in the class loader
documentation and note which ones are optional. (markt)
Documentation. Replace references in the application developer's guide
to CVS with more general references to a source code control system.
(markt)
jdbc-pool
66346: Ensure all JDBC pool JARs are reproducible. Pull
request #566 provided by John Neffenger. (markt)
Other
Update to Commons Daemon 1.3.3. (markt)
66323: Move module start up parameters from
JDK_JAVA_OPTIONS to JAVA_OPTS now that the
minimum Java version is 11 and these options are always required.
(markt)
Improvements to Chinese translations. Contributed by DigitalCat and
lihan. (markt)
Improvements to French translations. Contributed by Mathieu Bouchard.
(markt)
Improvements to Japanese translations. Contributed by Shirayuking and
tak7iji. (markt)
Improvements to Korean translations. (markt)
Improvements to Spanish translations. (markt)
Correct a regression in the removal of the APR connector that broke
Graal native image support. Pull request #564 provided by
Sébastien Deleuze. (markt)
Update the packaged version of the Apache Tomcat Native Library to 2.0.2
to pick up the Windows binaries built with with OpenSSL 3.0.7. (markt)
Update the packaged version of the Apache Tomcat Migration Tool for
Jakarta EE to 1.0.5. (markt)
Refactor code base to replace use of URL constructors. While they are
deprecated in Java 20 onwards, the reasons for deprecation are valid for
all versions so move away from them now. (markt)
Refine the Tomcat native image metadata to avoid including unintended
non-Tomcat resources. Pull request #569 provided by Sébastien
Deleuze. (markt)
Update the internal fork of Apache Commons BCEL to b015e90 (2022-11-28,
6.7.0-RC1). (markt)
Update the internal fork of Apache Commons Codec to ae32a3f (2022-11-29,
1.16-SNAPSHOT). (markt)
Update the internal fork of Apache Commons FileUpload to aa8eff6
(2022-11-29, 2.0-SNAPSHOT). (markt)
70262: Fix service.bat so install
<name> --rename renames the Windows service executables in
CATALINA_HOME\bin. remove now restores the
default executable names only when the service name differs from the
default. Based on pull request #1095 provided by StrongOx.
(markt)