This is an automated email from the ASF dual-hosted git repository.

tballison pushed a commit to branch TIKA-4809-stage-9
in repository https://gitbox.apache.org/repos/asf/tika.git

commit 81e06085d7e496f63e54ad7112b9f3a1f3398373
Author: tallison <[email protected]>
AuthorDate: Mon Aug 10 14:01:00 2026 -0400

    TIKA-4809: Remove returnStackTrace and the redaction it implied
---
 .../migration-to-4x/migrating-tika-server-4x.adoc  | 14 +++--
 .../ROOT/pages/using-tika/server/index.adoc        | 34 +++++++-----
 .../java/org/apache/tika/utils/ExceptionUtils.java | 22 +-------
 .../apache/tika/server/core/TikaServerConfig.java  |  8 ---
 .../core/TikaServerParseExceptionMapper.java       |  6 +--
 .../apache/tika/server/core/TikaServerProcess.java |  6 +--
 .../server/core/resource/PipesParsingHelper.java   | 63 +++-------------------
 .../tika/server/core/resource/PipesResource.java   |  7 +--
 .../tika/server/core/resource/TikaResource.java    |  3 +-
 .../org/apache/tika/server/core/CXFTestBase.java   |  7 +--
 .../core/ConfigEndpointSecurityEnabledTest.java    |  2 +-
 .../server/core/ConfigEndpointSecurityTest.java    |  2 +-
 .../tika/server/core/LanguageResourceTest.java     |  2 +-
 .../apache/tika/server/core/StackTraceTest.java    |  7 +--
 .../org/apache/tika/server/core/TikaPipesTest.java |  4 +-
 .../apache/tika/server/core/TikaResourceTest.java  | 11 ++--
 .../tika/server/core/TranslateResourceTest.java    |  2 +-
 .../tika/server/standard/DetectorResourceTest.java |  2 +-
 .../server/standard/JsonMaxFieldLengthTest.java    |  2 +-
 .../tika/server/standard/MetadataResourceTest.java |  2 +-
 .../apache/tika/server/standard/TikaPipesTest.java |  4 +-
 .../tika/server/standard/TikaResourceTest.java     |  2 +-
 .../UnpackerResourceConfigDisabledTest.java        |  2 +-
 .../tika/server/standard/UnpackerResourceTest.java |  2 +-
 .../standard/UnpackerResourceWithConfigTest.java   |  2 +-
 25 files changed, 69 insertions(+), 149 deletions(-)

diff --git 
a/docs/modules/ROOT/pages/migration-to-4x/migrating-tika-server-4x.adoc 
b/docs/modules/ROOT/pages/migration-to-4x/migrating-tika-server-4x.adoc
index 3eda1ecd1d..376789ff4c 100644
--- a/docs/modules/ROOT/pages/migration-to-4x/migrating-tika-server-4x.adoc
+++ b/docs/modules/ROOT/pages/migration-to-4x/migrating-tika-server-4x.adoc
@@ -100,8 +100,8 @@ at least a `status` field:
 {"status": "TIMEOUT"}
 ----
 
-When the server is configured with `returnStackTrace=true`, a `message` field 
is also
-included (it may contain a server-side stack trace), e.g. `{"status": 
"TIMEOUT", "message": "Task timed out after 60000ms"}`.
+A `message` field is included when one is available and may contain a 
server-side stack
+trace, e.g. `{"status": "TIMEOUT", "message": "Task timed out after 60000ms"}`.
 
 The HTTP status codes are also more precise:
 
@@ -132,8 +132,7 @@ xref:using-tika/server/index.adoc#_error_responses[Error 
Responses]):
 **Migration:** clients that treated any non-`200` from `/meta` as "parse 
failed"
 should check the new status codes above. Clients that inspected the response 
body
 for error text should check `tk:exception:container-exception` (full-object
-endpoints) or the `422` body (`/meta/\{field}`, populated only when
-`returnStackTrace=true`).
+endpoints) or the `422` body (`/meta/\{field}`).
 
 Two changes to the returned metadata come with this, neither of which produces 
an
 error:
@@ -172,6 +171,13 @@ The `/tika` endpoint no longer routes based on `Accept` 
headers. Use explicit pa
 
 The following `TikaServerConfig` options have been removed:
 
+* `returnStackTrace` - Removed as misleading. It gated only the error-response 
body, while
+  exception detail — including messages carrying file paths and document 
fragments —
+  continued to travel in `tk:exception:*` metadata on successful parses and 
inside
+  `/unpack` zips. Setting it to `false` did not keep stack traces inside the 
server, which
+  is what the name implied. Exception detail is now always returned; filter 
Tika's output
+  with a `MetadataFilter` before forwarding it somewhere less trusted.
+
 * `taskTimeoutMillis` - Now configured via 
`parse-context.timeout-limits.progressTimeoutMillis` (and optionally 
`totalTaskTimeoutMillis`); see xref:pipes/timeouts.adoc[Timeouts].
 * `taskPulseMillis` - No longer needed
 * `minimumTimeoutMillis` - No longer needed
diff --git a/docs/modules/ROOT/pages/using-tika/server/index.adoc 
b/docs/modules/ROOT/pages/using-tika/server/index.adoc
index 113cdb6071..5e39c5a99b 100644
--- a/docs/modules/ROOT/pages/using-tika/server/index.adoc
+++ b/docs/modules/ROOT/pages/using-tika/server/index.adoc
@@ -213,9 +213,8 @@ JSON body whose shape matches the `PipesResult` status:
 {"status": "TIMEOUT"}
 ----
 
-The `status` field is the `PipesResult.RESULT_STATUS` enum name. By default 
the body
-carries only the `status`. When the server is configured with 
`returnStackTrace=true`,
-a `message` field is also included (it often contains a server-side stack 
trace), e.g.
+The `status` field is the `PipesResult.RESULT_STATUS` enum name. A `message` 
field is
+included when one is available, and often contains a server-side stack trace, 
e.g.
 `{"status": "TIMEOUT", "message": "Task timed out after 60000ms"}`.
 
 [cols="1,1,3"]
@@ -284,13 +283,24 @@ any files already unpacked before the exception are 
discarded. This is a known
 gap, not yet addressed.
 |===
 
-By default (`returnStackTrace=false`), any exception text exposed this way is 
trimmed
-to just the exception's class and message — not the full stack trace, which can
-reveal internal file paths and library internals. For the `200 OK` family the
-trimmed field is still always present when a failure occurred, so callers can 
detect
-it either way; for the `422` family, the body carries no exception text at all 
unless
-`returnStackTrace=true`. Set `returnStackTrace=true` to get the full trace — 
useful
-in development, best left off in production.
+[IMPORTANT]
+====
+Exception detail is returned in full, and Tika does not redact it.
+
+Stack traces and their messages can contain the spooled file's path, the source
+filename, and fragments of the document. That detail appears in 
`tk:exception:*`
+metadata on **successful** parses as well as in error bodies — including 
inside the
+`*.metadata.json` entries of an `/unpack` zip — so there is no single switch 
that keeps
+it inside the server.
+
+A `returnStackTrace` setting previously suggested otherwise. It governed only 
the error
+body, left the metadata untouched, and has been removed rather than left in 
place
+implying a boundary it did not provide.
+
+If Tika's output is forwarded somewhere less trusted than the server itself, 
filter it
+on the way out: configure a `MetadataFilter` to drop the fields you do not 
want, and
+treat the whole response as potentially containing document-derived text.
+====
 
 == Configuration
 
@@ -318,10 +328,6 @@ Server behavior beyond host/port is controlled by a JSON 
config file passed via
 |`""` (off)
 |`*` to allow any origin, or an explicit origin string. Empty disables CORS.
 
-|`returnStackTrace`
-|`false`
-|Include parser stack traces in error responses. Useful in dev, dangerous in 
production (leaks internals).
-
 |`digest`
 |`""` (off)
 |Compute a digest of the parsed bytes. Comma-separated algorithm names: `md5`, 
`sha1`, `sha256`, `sha384`, `sha512`.
diff --git a/tika-core/src/main/java/org/apache/tika/utils/ExceptionUtils.java 
b/tika-core/src/main/java/org/apache/tika/utils/ExceptionUtils.java
index 8f071e2569..1c8bd8dfed 100644
--- a/tika-core/src/main/java/org/apache/tika/utils/ExceptionUtils.java
+++ b/tika-core/src/main/java/org/apache/tika/utils/ExceptionUtils.java
@@ -21,15 +21,11 @@ import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.io.Writer;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 import org.apache.tika.exception.TikaException;
 
 public class ExceptionUtils {
 
-    private final static Pattern MSG_PATTERN = Pattern.compile(":[^\r\n]+");
-
     /**
      * Simple util to get stack trace.
      * <p>
@@ -71,21 +67,5 @@ public class ExceptionUtils {
         return result.toString();
     }
 
-    /**
-     * Utility method to trim the message from a stack trace
-     * string.
-     * <p>
-     * E.g. <code>java.lang.IllegalStateException: Potential loop detected 
</code>
-     * will be trimmed to <code>java.lang.IllegalStateException</code>
-     *
-     * @param trace string view of stack trace
-     * @return trimmed stack trace
-     */
-    public static String trimMessage(String trace) {
-        Matcher msgMatcher = MSG_PATTERN.matcher(trace);
-        if (msgMatcher.find()) {
-            return msgMatcher.replaceFirst("");
-        }
-        return trace;
-    }
+
 }
diff --git 
a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerConfig.java
 
b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerConfig.java
index 69f30fced8..d334359007 100644
--- 
a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerConfig.java
+++ 
b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerConfig.java
@@ -70,7 +70,6 @@ private long forkedProcessShutdownMillis = 
DEFAULT_FORKED_PROCESS_SHUTDOWN_MILLI
     private boolean allowPipes = false;
     private boolean allowPerRequestConfig = false;
     private String cors = "";
-    private boolean returnStackTrace = false;
     private String idBase = UUID
             .randomUUID()
             .toString();
@@ -268,13 +267,6 @@ private long forkedProcessShutdownMillis = 
DEFAULT_FORKED_PROCESS_SHUTDOWN_MILLI
         this.digest = digest;
     }
 
-    public boolean isReturnStackTrace() {
-        return returnStackTrace;
-    }
-
-    public void setReturnStackTrace(boolean returnStackTrace) {
-        this.returnStackTrace = returnStackTrace;
-    }
 
     public TlsConfig getTlsConfig() {
         return tlsConfig;
diff --git 
a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerParseExceptionMapper.java
 
b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerParseExceptionMapper.java
index cbf5bfbd1e..76ceac24fd 100644
--- 
a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerParseExceptionMapper.java
+++ 
b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerParseExceptionMapper.java
@@ -34,10 +34,8 @@ import org.apache.tika.exception.UnsupportedFormatException;
 @Provider
 public class TikaServerParseExceptionMapper implements 
ExceptionMapper<TikaServerParseException> {
 
-    private final boolean returnStack;
 
-    public TikaServerParseExceptionMapper(boolean returnStack) {
-        this.returnStack = returnStack;
+    public TikaServerParseExceptionMapper() {
     }
 
     public Response toResponse(TikaServerParseException e) {
@@ -72,7 +70,7 @@ public class TikaServerParseExceptionMapper implements 
ExceptionMapper<TikaServe
     }
 
     private Response buildResponse(Throwable cause, int i) {
-        if (returnStack && cause != null) {
+        if (cause != null) {
             Writer result = new StringWriter();
             PrintWriter writer = new PrintWriter(result);
             cause.printStackTrace(writer);
diff --git 
a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerProcess.java
 
b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerProcess.java
index 93bde62770..d51586aeed 100644
--- 
a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerProcess.java
+++ 
b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerProcess.java
@@ -309,7 +309,7 @@ public class TikaServerProcess {
         writers.add(new JSONMessageBodyWriter());
         writers.add(new TextMessageBodyWriter());
         writers.addAll(loadWriterServices());
-        writers.add(new 
TikaServerParseExceptionMapper(tikaServerConfig.isReturnStackTrace()));
+        writers.add(new TikaServerParseExceptionMapper());
         writers.add(new JSONObjWriter());
 
         // Add ConfigEndpointSecurityFilter to gate /config endpoints
@@ -431,7 +431,7 @@ public class TikaServerProcess {
             // not by PipesResource.
             PipesParsingHelper helper = tikaResource.getPipesParsingHelper();
             resourceProviders.add(new SingletonResourceProvider(
-                    new PipesResource(helper.getPipesParser(), 
helper.isReturnStackTrace())));
+                    new PipesResource(helper.getPipesParser())));
         }
         resourceProviders.addAll(loadResourceServices(serverStatus));
         return resourceProviders;
@@ -536,7 +536,7 @@ public class TikaServerProcess {
 
         // Create and return the helper
         PipesParsingHelper helper = new PipesParsingHelper(pipesParser, 
pipesConfig,
-                inputTempDirectory, unpackTempDirectory, 
tikaServerConfig.isReturnStackTrace());
+                inputTempDirectory, unpackTempDirectory);
 
         // Register shutdown hook to clean up PipesParser and temp directories
         final Path inputDirToClean = inputTempDirectory;
diff --git 
a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/PipesParsingHelper.java
 
b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/PipesParsingHelper.java
index 2d87de0605..0b61676b14 100644
--- 
a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/PipesParsingHelper.java
+++ 
b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/PipesParsingHelper.java
@@ -34,7 +34,6 @@ import org.slf4j.LoggerFactory;
 
 import org.apache.tika.io.TikaInputStream;
 import org.apache.tika.metadata.Metadata;
-import org.apache.tika.metadata.Property;
 import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.pipes.api.FetchEmitTuple;
@@ -73,7 +72,6 @@ public class PipesParsingHelper {
     private final PipesConfig pipesConfig;
     private final Path inputTempDirectory;
     private final Path unpackEmitterBasePath;
-    private final boolean returnStackTrace;
 
     /**
      * Creates a PipesParsingHelper.
@@ -85,19 +83,13 @@ public class PipesParsingHelper {
      * @param unpackEmitterBasePath the basePath where the unpack-emitter 
writes files.
      *                              This is where the server will find the zip 
files created
      *                              by UNPACK mode. May be null if UNPACK mode 
won't be used.
-     * @param returnStackTrace whether failure responses may include the 
(potentially
-     *                         stack-trace-bearing) {@code PipesResult} 
message. When false
-     *                         (the default), error bodies carry only the 
status. Mirrors
-     *                         {@code TikaServerConfig.isReturnStackTrace()}.
      */
     public PipesParsingHelper(PipesParser pipesParser, PipesConfig pipesConfig,
-                              Path inputTempDirectory, Path 
unpackEmitterBasePath,
-                              boolean returnStackTrace) {
+                              Path inputTempDirectory, Path 
unpackEmitterBasePath) {
         this.pipesParser = pipesParser;
         this.pipesConfig = pipesConfig;
         this.inputTempDirectory = inputTempDirectory;
         this.unpackEmitterBasePath = unpackEmitterBasePath;
-        this.returnStackTrace = returnStackTrace;
 
         if (inputTempDirectory == null || 
!Files.isDirectory(inputTempDirectory)) {
             throw new IllegalArgumentException(
@@ -170,7 +162,6 @@ public class PipesParsingHelper {
 
             // Process result
             List<Metadata> metadataList = processResult(result);
-            redactExceptionDetail(metadataList);
             return metadataList;
 
         } catch (InterruptedException e) {
@@ -209,9 +200,9 @@ public class PipesParsingHelper {
      * Builds a JSON error response carrying a subset of the {@code 
PipesResult}
      * serialization. By default the body is just {@code {"status": 
"TIMEOUT"}}. The
      * {@code PipesResult} message frequently contains a server-side stack 
trace
-     * (e.g. for {@code *_EXCEPTION} statuses), so the {@code message} field 
is included
-     * only when {@code returnStackTrace} is enabled — matching the legacy
-     * {@code TikaServerParseExceptionMapper}, which gates stack traces the 
same way.
+     * (e.g. for {@code *_EXCEPTION} statuses) and is included: exception 
detail already
+     * travels in {@code tk:exception:*} metadata on successful parses, so 
withholding it
+     * here bought nothing while implying a confidentiality boundary that did 
not exist.
      * Successful-parse fields such as {@code emitData} are never part of an 
error body.
      * <p>
      * This allows clients to distinguish failure modes (TIMEOUT, OOM, 
UNSPECIFIED_CRASH, …)
@@ -221,7 +212,7 @@ public class PipesParsingHelper {
         ObjectMapper mapper = new ObjectMapper();
         ObjectNode node = mapper.createObjectNode();
         node.put("status", result.status().name());
-        if (returnStackTrace && result.message() != null && 
!result.message().isBlank()) {
+        if (result.message() != null && !result.message().isBlank()) {
             node.put("message", result.message());
         }
         String json;
@@ -284,39 +275,6 @@ public class PipesParsingHelper {
         return Collections.emptyList();
     }
 
-    /**
-     * Trims CONTAINER_EXCEPTION/EMBEDDED_EXCEPTION to one line unless 
returnStackTrace is
-     * on -- unlike buildProcessFailureResponse's family, a 200 response has 
no other way
-     * to signal a per-document exception, so we can't omit these fields 
entirely.
-     */
-    private void redactExceptionDetail(List<Metadata> metadataList) {
-        if (returnStackTrace || metadataList == null) {
-            return;
-        }
-        for (Metadata m : metadataList) {
-            summarizeInPlace(m, TikaCoreProperties.CONTAINER_EXCEPTION);
-            summarizeInPlace(m, TikaCoreProperties.EMBEDDED_EXCEPTION);
-        }
-    }
-
-    private static void summarizeInPlace(Metadata m, Property property) {
-        String full = m.get(property);
-        if (full != null) {
-            m.set(property, summarizeStackTrace(full, false));
-        }
-    }
-
-    /**
-     * First line of a stack trace (the caught exception's own class + 
message); no-op if
-     * returnStackTrace.
-     */
-    public static String summarizeStackTrace(String fullTrace, boolean 
returnStackTrace) {
-        if (returnStackTrace || fullTrace == null || fullTrace.isBlank()) {
-            return fullTrace;
-        }
-        int newline = fullTrace.indexOf('\n');
-        return newline < 0 ? fullTrace : fullTrace.substring(0, newline);
-    }
 
     /**
      * Maps PipesResult status to HTTP response status.
@@ -351,13 +309,6 @@ public class PipesParsingHelper {
         return pipesParser;
     }
 
-    /**
-     * Whether failure responses may include the (potentially 
stack-trace-bearing)
-     * {@code PipesResult} message. Mirrors {@code 
TikaServerConfig.isReturnStackTrace()}.
-     */
-    public boolean isReturnStackTrace() {
-        return returnStackTrace;
-    }
 
     /**
      * Gets the PipesConfig instance.
@@ -487,10 +438,8 @@ public class PipesParsingHelper {
                 Metadata containerMetadata = metadataList.get(0);
                 String containerException = 
containerMetadata.get(TikaCoreProperties.CONTAINER_EXCEPTION);
                 if (containerException != null) {
-                    // 422 already signals failure, so (unlike 
redactExceptionDetail's
-                    // 200 family) the body can be omitted entirely when off.
                     Response response = Response.status(422)
-                            .entity(returnStackTrace ? containerException : "")
+                            .entity(containerException)
                             .type("text/plain")
                             .build();
                     throw new WebApplicationException(response);
diff --git 
a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/PipesResource.java
 
b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/PipesResource.java
index 6b7eb9fccd..09956bbf5e 100644
--- 
a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/PipesResource.java
+++ 
b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/PipesResource.java
@@ -52,18 +52,15 @@ public class PipesResource {
     private static final Logger LOG = 
LoggerFactory.getLogger(PipesResource.class);
 
     private final PipesParser pipesParser;
-    private final boolean returnStackTrace;
 
     /**
      * @param pipesParser shared parser, also used by /tika, /rmeta, and 
/unpack.
      *                     Lifecycle (construction, shutdown) is owned by 
whoever
      *                     built it, not by this class.
-     * @param returnStackTrace whether parse_exception may include the full 
stack trace
      *                         vs. just the first line.
      */
-    public PipesResource(PipesParser pipesParser, boolean returnStackTrace) {
+    public PipesResource(PipesParser pipesParser) {
         this.pipesParser = pipesParser;
-        this.returnStackTrace = returnStackTrace;
     }
 
 
@@ -135,7 +132,7 @@ public class PipesResource {
         Map<String, String> statusMap = new HashMap<>();
         statusMap.put("status", "ok");
         // 200 response, so trim rather than omit -- same reasoning as 
redactExceptionDetail.
-        statusMap.put("parse_exception", 
PipesParsingHelper.summarizeStackTrace(msg, returnStackTrace));
+        statusMap.put("parse_exception", msg);
         statusMap.put("emitted", Boolean.toString(emitted));
         return statusMap;
     }
diff --git 
a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaResource.java
 
b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaResource.java
index 5ac7fe1b4b..17a0110ad1 100644
--- 
a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaResource.java
+++ 
b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaResource.java
@@ -815,8 +815,7 @@ public class TikaResource {
             }
         }
         // No separate field for the exception here, unlike JSON bodies -- 
append it,
-        // gated by returnStackTrace like TikaServerParseExceptionMapper.
-        if (hasException && pipesParsingHelper != null && 
pipesParsingHelper.isReturnStackTrace()) {
+        if (hasException) {
             content = content.isEmpty() ? exceptionMessage : content + "\n" + 
exceptionMessage;
         }
         final String finalContent = content;
diff --git 
a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/CXFTestBase.java
 
b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/CXFTestBase.java
index ed557ad8cb..1761be32ef 100644
--- 
a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/CXFTestBase.java
+++ 
b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/CXFTestBase.java
@@ -215,7 +215,7 @@ public abstract class CXFTestBase {
             pipesConfig.setEmitStrategy(new 
EmitStrategyConfig(EmitStrategy.PASSBACK_ALL));
             this.pipesParser = PipesParser.load(tikaJsonConfig, pipesConfig, 
this.pipesConfigPath);
             PipesParsingHelper pipesParsingHelper = new 
PipesParsingHelper(this.pipesParser, pipesConfig,
-                    inputTempDirectory, getUnpackEmitterBasePath(), 
isReturnStackTrace());
+                    inputTempDirectory, getUnpackEmitterBasePath());
 
             tikaResource = new TikaResource(tika, new ServerStatus(), 
pipesParsingHelper, isAllowPerRequestConfig());
         } finally {
@@ -378,12 +378,9 @@ public abstract class CXFTestBase {
     }
 
     /**
-     * Mirrors TikaServerConfig.isReturnStackTrace(); defaults to false 
(production
+     * Mirrors TikaServerConfig.; defaults to false (production
      * default). Override in tests that exercise exception-detail visibility.
      */
-    protected boolean isReturnStackTrace() {
-        return false;
-    }
 
     protected InputStream getPipesConfigInputStream() throws IOException {
         if (getPipesInputPath() == null) {
diff --git 
a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/ConfigEndpointSecurityEnabledTest.java
 
b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/ConfigEndpointSecurityEnabledTest.java
index 03a048450f..5897fdf9a7 100644
--- 
a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/ConfigEndpointSecurityEnabledTest.java
+++ 
b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/ConfigEndpointSecurityEnabledTest.java
@@ -53,7 +53,7 @@ public class ConfigEndpointSecurityEnabledTest extends 
CXFTestBase {
     @Override
     protected void setUpProviders(JAXRSServerFactoryBean sf) {
         List<Object> providers = new ArrayList<>();
-        providers.add(new TikaServerParseExceptionMapper(false));
+        providers.add(new TikaServerParseExceptionMapper());
         providers.add(new JSONMessageBodyWriter());
         // Add security filter with allowPerRequestConfig=true
         providers.add(new ConfigEndpointSecurityFilter(true));
diff --git 
a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/ConfigEndpointSecurityTest.java
 
b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/ConfigEndpointSecurityTest.java
index 03b45bedb5..dd9d319a51 100644
--- 
a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/ConfigEndpointSecurityTest.java
+++ 
b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/ConfigEndpointSecurityTest.java
@@ -54,7 +54,7 @@ public class ConfigEndpointSecurityTest extends CXFTestBase {
     @Override
     protected void setUpProviders(JAXRSServerFactoryBean sf) {
         List<Object> providers = new ArrayList<>();
-        providers.add(new TikaServerParseExceptionMapper(false));
+        providers.add(new TikaServerParseExceptionMapper());
         providers.add(new JSONMessageBodyWriter());
         // Add security filter with allowPerRequestConfig=false
         providers.add(new ConfigEndpointSecurityFilter(false));
diff --git 
a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/LanguageResourceTest.java
 
b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/LanguageResourceTest.java
index a700d20c13..d3f1e30dca 100644
--- 
a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/LanguageResourceTest.java
+++ 
b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/LanguageResourceTest.java
@@ -53,7 +53,7 @@ public class LanguageResourceTest extends CXFTestBase {
         List<Object> providers = new ArrayList<>();
         providers.add(new TarWriter());
         providers.add(new ZipWriter());
-        providers.add(new TikaServerParseExceptionMapper(false));
+        providers.add(new TikaServerParseExceptionMapper());
         sf.setProviders(providers);
 
     }
diff --git 
a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/StackTraceTest.java
 
b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/StackTraceTest.java
index 752a8af690..c89c60e801 100644
--- 
a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/StackTraceTest.java
+++ 
b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/StackTraceTest.java
@@ -67,11 +67,6 @@ public class StackTraceTest extends CXFTestBase {
     @TempDir
     private static Path unpackTempDir;
 
-    @Override
-    protected boolean isReturnStackTrace() {
-        // Matches this class's own TikaServerParseExceptionMapper(true) below.
-        return true;
-    }
 
     @Override
     protected void setUpResources(JAXRSServerFactoryBean sf) {
@@ -87,7 +82,7 @@ public class StackTraceTest extends CXFTestBase {
     @Override
     protected void setUpProviders(JAXRSServerFactoryBean sf) {
         List<Object> providers = new ArrayList<>();
-        providers.add(new TikaServerParseExceptionMapper(true));
+        providers.add(new TikaServerParseExceptionMapper());
         providers.add(new JSONMessageBodyWriter());
         providers.add(new CSVMessageBodyWriter());
         //providers.add(new XMPMessageBodyWriter());
diff --git 
a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaPipesTest.java
 
b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaPipesTest.java
index d43abc4c43..852916636c 100644
--- 
a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaPipesTest.java
+++ 
b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaPipesTest.java
@@ -153,7 +153,7 @@ public class TikaPipesTest extends CXFTestBase {
             PipesConfig pipesConfig = PipesConfig.load(tikaJsonConfig);
             pipesConfig.setEmitStrategy(new 
EmitStrategyConfig(EmitStrategy.EMIT_ALL));
             pipesParser = PipesParser.load(tikaJsonConfig, pipesConfig, 
tikaConfigPath);
-            pipesResource = new PipesResource(pipesParser, false);
+            pipesResource = new PipesResource(pipesParser);
             rCoreProviders.add(new SingletonResourceProvider(pipesResource));
         } catch (IOException | TikaConfigException e) {
             throw new RuntimeException(e);
@@ -164,7 +164,7 @@ public class TikaPipesTest extends CXFTestBase {
     @Override
     protected void setUpProviders(JAXRSServerFactoryBean sf) {
         List<Object> providers = new ArrayList<>();
-        providers.add(new TikaServerParseExceptionMapper(true));
+        providers.add(new TikaServerParseExceptionMapper());
         providers.add(new JSONObjWriter());
         sf.setProviders(providers);
     }
diff --git 
a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaResourceTest.java
 
b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaResourceTest.java
index c0f01e0863..94eb1bf756 100644
--- 
a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaResourceTest.java
+++ 
b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaResourceTest.java
@@ -55,7 +55,7 @@ public class TikaResourceTest extends CXFTestBase {
     @Override
     protected void setUpProviders(JAXRSServerFactoryBean sf) {
         List<Object> providers = new ArrayList<>();
-        providers.add(new TikaServerParseExceptionMapper(false));
+        providers.add(new TikaServerParseExceptionMapper());
         providers.add(new JSONMessageBodyWriter());
         sf.setProviders(providers);
     }
@@ -109,11 +109,12 @@ public class TikaResourceTest extends CXFTestBase {
         assertEquals("Nikolai Lobachevsky", metadata.get("author"));
         assertEquals("application/mock+xml", 
metadata.get(Metadata.CONTENT_TYPE));
         assertContains("some content", 
metadata.get(TikaCoreProperties.TIKA_CONTENT));
-        // returnStackTrace defaults to false here, so CONTAINER_EXCEPTION is 
trimmed to
-        // the caught exception's own class + message -- the NPE detail 
underneath it is
-        // intentionally not exposed by default.
+        // Exception detail is reported in full. Tika does not redact it: any 
scheme that
+        // strips the message has to parse the rendered trace, and it would in 
any case be
+        // undone by the same detail travelling in tk:exception:* on other 
responses. Filter
+        // metadata before forwarding it somewhere less trusted.
         assertContains("TikaException", 
metadata.get(TikaCoreProperties.CONTAINER_EXCEPTION));
-        assertNotFound("null pointer message", 
metadata.get(TikaCoreProperties.CONTAINER_EXCEPTION));
+        assertContains("null pointer message", 
metadata.get(TikaCoreProperties.CONTAINER_EXCEPTION));
     }
 
     @Test
diff --git 
a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TranslateResourceTest.java
 
b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TranslateResourceTest.java
index d79c57a937..ec7316525b 100644
--- 
a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TranslateResourceTest.java
+++ 
b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TranslateResourceTest.java
@@ -54,7 +54,7 @@ public class TranslateResourceTest extends CXFTestBase {
         List<Object> providers = new ArrayList<>();
         providers.add(new TarWriter());
         providers.add(new ZipWriter());
-        providers.add(new TikaServerParseExceptionMapper(false));
+        providers.add(new TikaServerParseExceptionMapper());
         sf.setProviders(providers);
 
     }
diff --git 
a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/DetectorResourceTest.java
 
b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/DetectorResourceTest.java
index cf2ebc0a1f..6ba7d2ab1b 100644
--- 
a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/DetectorResourceTest.java
+++ 
b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/DetectorResourceTest.java
@@ -55,7 +55,7 @@ public class DetectorResourceTest extends CXFTestBase {
         List<Object> providers = new ArrayList<>();
         providers.add(new TarWriter());
         providers.add(new ZipWriter());
-        providers.add(new TikaServerParseExceptionMapper(false));
+        providers.add(new TikaServerParseExceptionMapper());
         sf.setProviders(providers);
 
     }
diff --git 
a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/JsonMaxFieldLengthTest.java
 
b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/JsonMaxFieldLengthTest.java
index 4e2af3c6c5..b5274d2813 100644
--- 
a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/JsonMaxFieldLengthTest.java
+++ 
b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/JsonMaxFieldLengthTest.java
@@ -55,7 +55,7 @@ public class JsonMaxFieldLengthTest extends CXFTestBase {
     @Override
     protected void setUpProviders(JAXRSServerFactoryBean sf) {
         List<Object> providers = new ArrayList<>();
-        providers.add(new TikaServerParseExceptionMapper(false));
+        providers.add(new TikaServerParseExceptionMapper());
         providers.add(new JSONMessageBodyWriter());
         sf.setProviders(providers);
     }
diff --git 
a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/MetadataResourceTest.java
 
b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/MetadataResourceTest.java
index e548f9d5c6..d099e9ea3a 100644
--- 
a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/MetadataResourceTest.java
+++ 
b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/MetadataResourceTest.java
@@ -75,7 +75,7 @@ public class MetadataResourceTest extends CXFTestBase {
     protected void setUpProviders(JAXRSServerFactoryBean sf) {
         List<Object> providers = new ArrayList<>();
         // Needed by getMetadataField's TikaServerParseException throw.
-        providers.add(new TikaServerParseExceptionMapper(false));
+        providers.add(new TikaServerParseExceptionMapper());
         providers.add(new JSONMessageBodyWriter());
         providers.add(new CSVMessageBodyWriter());
         providers.add(new XMPMessageBodyWriter());
diff --git 
a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaPipesTest.java
 
b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaPipesTest.java
index 08844f84df..f8eb51fe27 100644
--- 
a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaPipesTest.java
+++ 
b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaPipesTest.java
@@ -145,7 +145,7 @@ public class TikaPipesTest extends CXFTestBase {
             PipesConfig pipesConfig = PipesConfig.load(tikaJsonConfig);
             pipesConfig.setEmitStrategy(new 
EmitStrategyConfig(EmitStrategy.EMIT_ALL));
             pipesParser = PipesParser.load(tikaJsonConfig, pipesConfig, 
tikaConfigPath);
-            pipesResource = new PipesResource(pipesParser, false);
+            pipesResource = new PipesResource(pipesParser);
             rCoreProviders.add(new SingletonResourceProvider(pipesResource));
         } catch (IOException | TikaConfigException e) {
             throw new RuntimeException(e);
@@ -170,7 +170,7 @@ public class TikaPipesTest extends CXFTestBase {
     @Override
     protected void setUpProviders(JAXRSServerFactoryBean sf) {
         List<Object> providers = new ArrayList<>();
-        providers.add(new TikaServerParseExceptionMapper(true));
+        providers.add(new TikaServerParseExceptionMapper());
         providers.add(new JSONObjWriter());
         sf.setProviders(providers);
     }
diff --git 
a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaResourceTest.java
 
b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaResourceTest.java
index fce1711635..6229bb07c1 100644
--- 
a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaResourceTest.java
+++ 
b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaResourceTest.java
@@ -80,7 +80,7 @@ public class TikaResourceTest extends CXFTestBase {
     @Override
     protected void setUpProviders(JAXRSServerFactoryBean sf) {
         List<Object> providers = new ArrayList<>();
-        providers.add(new TikaServerParseExceptionMapper(false));
+        providers.add(new TikaServerParseExceptionMapper());
         providers.add(new JSONMessageBodyWriter());
         sf.setProviders(providers);
     }
diff --git 
a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceConfigDisabledTest.java
 
b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceConfigDisabledTest.java
index 59e13a302e..93a00cf01a 100644
--- 
a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceConfigDisabledTest.java
+++ 
b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceConfigDisabledTest.java
@@ -66,7 +66,7 @@ public class UnpackerResourceConfigDisabledTest extends 
CXFTestBase {
         List<Object> providers = new ArrayList<>();
         providers.add(new TarWriter());
         providers.add(new ZipWriter());
-        providers.add(new TikaServerParseExceptionMapper(false));
+        providers.add(new TikaServerParseExceptionMapper());
         sf.setProviders(providers);
     }
 
diff --git 
a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceTest.java
 
b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceTest.java
index 2620d84465..1ae4bb0592 100644
--- 
a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceTest.java
+++ 
b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceTest.java
@@ -113,7 +113,7 @@ public class UnpackerResourceTest extends CXFTestBase {
     protected void setUpProviders(JAXRSServerFactoryBean sf) {
         List<Object> providers = new ArrayList<>();
         providers.add(new ZipWriter());
-        providers.add(new TikaServerParseExceptionMapper(false));
+        providers.add(new TikaServerParseExceptionMapper());
         sf.setProviders(providers);
     }
 
diff --git 
a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceWithConfigTest.java
 
b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceWithConfigTest.java
index 92e28a6730..9d8b5ed59a 100644
--- 
a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceWithConfigTest.java
+++ 
b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/UnpackerResourceWithConfigTest.java
@@ -88,7 +88,7 @@ public class UnpackerResourceWithConfigTest extends 
CXFTestBase {
         List<Object> providers = new ArrayList<>();
         providers.add(new TarWriter());
         providers.add(new ZipWriter());
-        providers.add(new TikaServerParseExceptionMapper(false));
+        providers.add(new TikaServerParseExceptionMapper());
         sf.setProviders(providers);
     }
 

Reply via email to