Raymond created CAMEL-17389:
-------------------------------

             Summary: toD (Dynamic To URI) doesn't work with Windows paths
                 Key: CAMEL-17389
                 URL: https://issues.apache.org/jira/browse/CAMEL-17389
             Project: Camel
          Issue Type: Improvement
          Components: camel-core
    Affects Versions: 3.14.0
         Environment: OS: Windows 8 / Windows 10
Java: OpenJDK 11 (OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.10+9))
Camel: 3.14.0 (Same behavior on 3.11.X)
            Reporter: Raymond


I had a Camel route like this:

from(uri)
    to("file:" + path);

The path is set by an end-user like for example

1) path/to/dir (Linux)
2) C:\dir (Windows)

 

This works. Now I like to change the route so that the path can also set 
dynamically by the user (for example with a header). Thus I changed the route 
to a dynamic to uri "toD".

from(uri)
    toD("file:" + path);

This works on Linux, but not on Windows paths. For example:



1) C:\test (does not work)
2) C:\\test (does not work)

3) C:/test (does work)

In the first two cases I get the following error:


org.apache.camel.ResolveEndpointFailedException: Failed to resolve endpoint: 
file://C:  est due to: Illegal character i
n authority at index 7: file://C:       est
        at 
org.apache.camel.impl.engine.AbstractCamelContext.doGetEndpoint(AbstractCamelContext.java:968)
        at 
org.apache.camel.impl.engine.AbstractCamelContext.getEndpoint(AbstractCamelContext.java:859)
        at 
org.apache.camel.support.CamelContextHelper.getMandatoryEndpoint(CamelContextHelper.java:73)
        at 
org.apache.camel.support.ExchangeHelper.resolveEndpoint(ExchangeHelper.java:120)
        at 
org.apache.camel.support.ExchangeHelper.resolveEndpoint(ExchangeHelper.java:99)
        at 
org.apache.camel.processor.SendDynamicProcessor.resolveEndpoint(SendDynamicProcessor.java:296)
        at 
org.apache.camel.processor.SendDynamicProcessor.process(SendDynamicProcessor.java:157)
        at 
org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$RedeliveryTask.doRun(RedeliveryErrorHandler.ja
va:810)
        at 
org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$RedeliveryTask.run(RedeliveryErrorHandler.java
:718)
        at 
org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:187)
        at 
org.apache.camel.impl.engine.DefaultReactiveExecutor.scheduleMain(DefaultReactiveExecutor.java:64)
        at org.apache.camel.processor.Pipeline.process(Pipeline.java:184)
        at 
org.apache.camel.impl.engine.CamelInternalProcessor.process(CamelInternalProcessor.java:398)
        at 
org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:492)
        at 
org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:245)
        at 
org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:206)
        at 
org.apache.camel.support.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:202)
        at 
org.apache.camel.support.ScheduledPollConsumer.run(ScheduledPollConsumer.java:116)
        at 
java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
        at 
java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305)
        at 
java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecuto
r.java:305)
        at 
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at 
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.net.URISyntaxException: Illegal character in authority at index 
7: file://C:    est
        at java.base/java.net.URI$Parser.fail(URI.java:2913)
        at java.base/java.net.URI$Parser.parseAuthority(URI.java:3247)
        at java.base/java.net.URI$Parser.parseHierarchical(URI.java:3158)
        at java.base/java.net.URI$Parser.parse(URI.java:3114)
        at java.base/java.net.URI.<init>(URI.java:600)
        at 
org.apache.camel.support.DefaultComponent.createEndpoint(DefaultComponent.java:97)
        at 
org.apache.camel.impl.engine.AbstractCamelContext.doGetEndpoint(AbstractCamelContext.java:934)
        ... 23 common frames omitted


This behavior is probably because with toD the uri is handled by a simple 
expression and this does some escaping. I could build in some input validation 
or change the backward slashes to forward slashed in my application, but I 
rather would like to change from "to" to "toD" without side-effects where it 
also works for Windows paths.

Side note: As a user I would expect toD as replacement for to where it works 
exactly the same only it evaluates expressions. In the long run maybe there 
should be not difference between to and toD in Camel, so that toD can replace 
the currect "to" step and toD is not needed anymore.

 



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

Reply via email to