Hi,

The JUnit test below illustrates a Stack Overflow bug when using a long
recipient list with the default delimiter (a comma).

The overflow is caused by a regex (",(?!(?:[^\\(,]|[^\\)],[^\\)])+\\))") in
the 'createIterator()' method in the class
'org.apache.camel.util.ObjectHelper', which is used to iterate a recipient
list while handling bean expressions with OGNL.

The problem is that this complex regex is used *by default* with recipient
lists, and if that list is long, it will stack overflow.

Thankfully the work-around we use is trivial - we simply use ", " as the
delimiter (note the space), and this bypasses using the regex and so
everything works fine (illustrated in the Junit test too) - but ultimately I
think the regex needs to be re-worked to not overflow on long lists.

Here's the simple failing JUnit test:


import junit.framework.Assert;

import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.impl.DefaultExchange;
import org.junit.Test;

public class LongRecipientListTest {
    static int recipientCount = 0;
    

    /**
     * 
     */
    @Test
    public void stackOverflowWithLongRecipientListAndDefaultDelimiter()
throws Exception {
        DefaultCamelContext camelContext = new DefaultCamelContext();

        StringBuilder buffer = new StringBuilder("direct://long-uri/");
        for (int i=0; i < 100; i++) {
            buffer.append("123456789/");
        }
        final String longUri = buffer.toString();

        
        camelContext.addRoutes(new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                from("direct://defaultDelimiter")
                    .recipientList(header("X-Test")).parallelProcessing();
            
                from("direct://customDelimiter")
                    .recipientList(header("X-Test")).parallelProcessing()
                    .delimiter(", ");
            
                from(longUri).process(new Processor() {
                    @Override
                    public void process(Exchange exchange) throws Exception
{
                        recipientCount++;
                    }
                });
            }
        });

        camelContext.start();
        
        int sendCount = 100;
        StringBuilder buffer2 = new StringBuilder(longUri);
        for (int i=0; i < (sendCount - 1); i++) {
            buffer2.append(", ").append(longUri);
        }
        
        final DefaultExchange exchange = new DefaultExchange(camelContext);
        exchange.getIn().setHeader("X-Test", buffer2.toString());
        
        recipientCount = 0;
       
camelContext.createProducerTemplate().send("direct://customDelimiter",
exchange);
        *Assert.assertEquals(sendCount, recipientCount);  // PASSES*

        recipientCount = 0;
       
camelContext.createProducerTemplate().send("direct://defaultDelimiter",
exchange);
        *Assert.assertEquals(sendCount, recipientCount);  // FAILS!*
    }
}




--
View this message in context: 
http://camel.465427.n5.nabble.com/BUG-Stack-Overflow-with-long-recipient-list-using-default-delimiter-tp5745679.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Reply via email to