shashank created CAMEL-26312:
--------------------------------

             Summary: camel-core-languages - Simple: a space after a comma is 
part of the next argument of replace, substring, substringBefore, 
substringAfter, substringBetween and contains, so the documented 
${replace(" , ')} does not replace
                 Key: CAMEL-26312
                 URL: https://issues.apache.org/jira/browse/CAMEL-26312
             Project: Camel
          Issue Type: Bug
          Components: camel-core
            Reporter: shashank
            Assignee: shashank


These functions split their arguments with 
{{StringQuoteHelper.splitSafeQuote(values, ',', false)}}, which keeps the white 
space around a value, also outside its quotes (main aa63c0a4cb94; {{replace}} 
and {{substring}} since 4.7.0, CAMEL-20845, the other four since 4.18.0). So a 
space after the comma becomes part of the next argument:
{code}
body: Hello World
${replace('o', '0')}                       -> Hell 0 W 0rld   (replaced with " 
0")
${replace('o', '0', ${header.foo})}        -> " Hell 0 W 0rld" (the expression 
is " ${header.foo}")
${substringBetween(${body}, ' ', 'o')}     -> null            (looks for "  " 
and " o")
${contains(${body}, 'hello')}              -> false
${substring(1, -1)}                        -> TypeConversionException (" -1")
{code}
The examples of the replace function in simple-advanced.adoc ("Replacing double 
and single quotes", in Java, XML and YAML) write a space around the comma, and 
none of them works:
{code}
body: say "hi" it's
${replace(" , ')}   -> say "hi 'it's   (expected: say 'hi' it's)
${replace(' , ")}   -> say "hi" it's   (expected: say "hi" it"s)
${replace(" , ∅)}  -> say "hi ∅it's
{code}
The collection functions had the same bug, fixed in 4.23.0 by CAMEL-24969 ("a 
space after a comma no longer leaks into the argument: {{${sort(${body}, 
true)}}}, mapAdd, listAdd, ...") with 
{{CollectionFunctionFactory.splitArguments}}; the string functions were not in 
its list. Other functions, such as escape, concat and pad, already take an 
argument without the white space around it; the escape example of the functions 
page writes {{${escape(html, 'Tom & Jerry')}}}.

*Fix* (proposed): use the {{splitArguments}} helper of CAMEL-24969 for these 
functions too (moved to {{SimpleFunctionHelper}}): split the arguments keeping 
their quotes, then take each one without the white space around it and without 
the quotes around it. The spaces inside quotes are kept ({{' '}}), and an 
argument of only white space is kept as it is, so {{${replace( 
,-,${header.msg})}}} (pinned by 
{{StringFunctionFactoryTest.testReplaceWithExpression}}) still replaces a 
space. So trimming every argument ({{splitSafeQuote}} with trim=true) is not an 
option: it would make that argument empty. A quote inside an argument 
({{a'b'c}}, {{'it''s'}}) is now kept instead of removed, as in the collection 
functions (upgrade guide). {{join}} splits the same way ({{${join(&, id=)}}} 
prefixes " id=") and is left for a follow-up, as its separator may be white 
space on purpose.

*Tests*: {{SimpleTest.testReplaceAllExpressionWithSpacesAroundTheComma}} (the 
three documented examples, and nested expressions), 
{{StringFunctionFactoryTest.testArgumentsWithASpaceAfterTheComma}} (each 
function) and {{StringFunctionFactoryTest.testQuoteInsideAnArgumentIsKept}} 
fail on main and pass with the fix. The language tests of camel-core and the 
whole camel-core suite pass. In apache/camel and camel-kamelets 4.23.0 the six 
functions are written in 97 distinct ways; only the documented examples split 
differently.

*How it was found*: a readable semantics of Simple written from the 
documentation (Rocq), extracted to an oracle and compared with the language on 
about 4.9 million generated programs (8 200 disagreements of this class). The 
from and to texts that {{StringFunctionFactory}} gives the replace function are 
also checked on the real class files of main and of the fix in a JVM model in 
Rocq (kernel-checked).

*Affected*: main and every release since 4.7.0 (replace, substring) / 4.18.0 
(substringBefore, substringAfter, substringBetween, contains).

_Filed with Claude Code on behalf of allthingssecurity._



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to