This is an automated email from the ASF dual-hosted git repository. luigidemasi pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel-kit.git
commit f29378fbcf704ca02827876cb45f98297abded89 Author: Jinal Sarvaiya <[email protected]> AuthorDate: Fri Nov 6 10:24:43 2026 +0000 fix #100: parse inline backtick spans with Jackson to detect escaped envelope keys --- .../apache/camel/kit/ship/controller/ShipStageResult.java | 13 ++++++++++--- .../camel/kit/ship/controller/ShipStageResultTest.java | 15 +++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/kit/camel-kit-core/src/main/java/org/apache/camel/kit/ship/controller/ShipStageResult.java b/kit/camel-kit-core/src/main/java/org/apache/camel/kit/ship/controller/ShipStageResult.java index 40110174..71628e01 100644 --- a/kit/camel-kit-core/src/main/java/org/apache/camel/kit/ship/controller/ShipStageResult.java +++ b/kit/camel-kit-core/src/main/java/org/apache/camel/kit/ship/controller/ShipStageResult.java @@ -380,8 +380,6 @@ record ShipStageResult( return result; } - private static final String ENVELOPE_MARKER = "\"materialAmbiguity\""; - private static boolean hasBareJsonStart(String fragment) { int i = 0; int len = fragment.length(); @@ -394,7 +392,7 @@ record ShipStageResult( } if (j < len && fragment.charAt(j) == '`') { String span = fragment.substring(i + 1, j); - if (span.contains(ENVELOPE_MARKER)) { + if (looksLikeEnvelope(span)) { return true; } i = j + 1; @@ -409,6 +407,15 @@ record ShipStageResult( return false; } + private static boolean looksLikeEnvelope(String span) { + try { + JsonNode node = JSON.readTree(span); + return node.isObject() && node.has("materialAmbiguity"); + } catch (JsonProcessingException e) { + return false; + } + } + static byte[] utf8(String value, int maximum, String label) throws IOException { if (value == null || value.length() > maximum) { throw new IOException("Pi " + label + " exceeds its size limit"); diff --git a/kit/camel-kit-core/src/test/java/org/apache/camel/kit/ship/controller/ShipStageResultTest.java b/kit/camel-kit-core/src/test/java/org/apache/camel/kit/ship/controller/ShipStageResultTest.java index a1b400cf..f7d27a63 100644 --- a/kit/camel-kit-core/src/test/java/org/apache/camel/kit/ship/controller/ShipStageResultTest.java +++ b/kit/camel-kit-core/src/test/java/org/apache/camel/kit/ship/controller/ShipStageResultTest.java @@ -521,6 +521,21 @@ class ShipStageResultTest { "backtick-wrapped correction envelope"); } + @Test + void rejectsInlineBacktickWrappedCorrectionWithEscapedKey() throws Exception { + ObjectNode fenced = result(null, null); + ObjectNode bare = result(null, null); + bare.put("materialAmbiguity", true); + bare.withArray("unansweredQuestions").addObject() + .put("question", "Which retry limit?").putNull("defaultApplied"); + String bareJson = JSON.writeValueAsString(bare) + .replace("\"materialAmbiguity\"", "\"\\u006daterialAmbiguity\""); + String input = "```json\n" + JSON.writeValueAsString(fenced) + + "\n```\nCorrection, use this instead: `" + bareJson + "`"; + assertRejected(Stage.DESIGN, input, + "backtick-wrapped correction envelope with escaped key"); + } + @Test void acceptsHarmlessInlineJsonExample() throws Exception { ObjectNode valid = result("149-local-controller", null);
