This is an automated email from the ASF dual-hosted git repository. andy pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/jena.git
commit b2e978129329c155fcfcd24954eae359b2c4c1ac Author: Andy Seaborne <[email protected]> AuthorDate: Sun Nov 23 21:13:08 2025 +0000 Query cancellation HTTP status code --- .../src/main/java/org/apache/jena/fuseki/Fuseki.java | 5 +++++ .../src/main/java/org/apache/jena/fuseki/servlets/ActionExecLib.java | 2 +- .../src/main/java/org/apache/jena/fuseki/servlets/Responses.java | 3 ++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/Fuseki.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/Fuseki.java index e7a996dd11..7d49fdca77 100644 --- a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/Fuseki.java +++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/Fuseki.java @@ -32,6 +32,7 @@ import org.apache.jena.riot.system.stream.LocatorHTTP; import org.apache.jena.riot.system.stream.StreamManager; import org.apache.jena.sparql.util.Context; import org.apache.jena.sparql.util.Symbol; +import org.apache.jena.web.HttpSC; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -169,6 +170,10 @@ public class Fuseki { public static final String compactLogName = PATH + ".Compact"; public static final Logger compactLog = LoggerFactory.getLogger(compactLogName);; + // There isn't an ideal status code for a cancelled query. + // HTTP 408 "Request timeout" which is about connection management + public static int SC_QueryCancelled = HttpSC.SERVICE_UNAVAILABLE_503; + // Servlet context attribute names used by the core engine. // Also in FusekiServerCtl for Fuseki server public static final String attrVerbose = "org.apache.jena.fuseki:verbose"; diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/ActionExecLib.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/ActionExecLib.java index 96ec9dca2e..18f5597fb2 100644 --- a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/ActionExecLib.java +++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/ActionExecLib.java @@ -129,7 +129,7 @@ public class ActionExecLib { // dataset -- dataset.getContect(ARQ.queryTimeout) // protocol -- SPARQL_Query.setAnyTimeouts String message = "Query timed out"; - ServletOps.responseSendError(response, HttpSC.SERVICE_UNAVAILABLE_503, message); + ServletOps.responseSendError(response, Fuseki.SC_QueryCancelled, message); } catch (QueryDeniedException ex) { // Typically a configuration setting blocks the query. ServletOps.responseSendError(response, HttpSC.UNPROCESSABLE_ENTITY_422, ex.getMessage()); diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/Responses.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/Responses.java index 018a6290a0..4ba8b5cd6b 100644 --- a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/Responses.java +++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/Responses.java @@ -132,7 +132,8 @@ public class Responses // Status code 200 may have already been sent. // We can try to set the HTTP response code anyway. // Breaking the results is the best we can do to indicate the timeout. - action.setResponseStatus(HttpSC.BAD_REQUEST_400); + // There isn't an ideal status code. Keep this aligned with the status used in ActionExecLib. execActionSub + action.setResponseStatus(Fuseki.SC_QueryCancelled); action.log.info(format("[%d] Query Cancelled - results truncated (but 200 may have already been sent)", action.id)); PrintStream ps = new PrintStream(out); ps.println();
