[ 
https://issues.apache.org/jira/browse/CAMEL-9281?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14985571#comment-14985571
 ] 

Edward Welch commented on CAMEL-9281:
-------------------------------------

My initial suggestion will not work, this is what I'm thinking now:

{code}
        if (path != null) {
            // if both the path and the uri have slashes, remove a slash from 
the uri
            // we don't remove it from "path" to handle the case where the path 
is equal to "/"
            if (path.startsWith("/") && uri.endsWith("/")) {
                uri = uri.substring(0, uri.length());
            }
            if (path.length() > 0) {
                // make sure that there is exactly one "/" between HTTP_URI and
                // HTTP_PATH
                if (!uri.endsWith("/") && !path.startsWith("/")) {
                    uri = uri + "/";
                }
                uri = uri.concat(path);
            }
        }
{code}

I haven't tested all the cases yet, just wanted to get some opinions if this 
solution looks workable?

Also, if I were going to make a PR, is it ok if I make my PR branch from 
2.15.x?  I get a lot more build errors from master and would be easier to work 
with 2.15.x branch

> Http4 component removes trailing slashes from http requests (producer)
> ----------------------------------------------------------------------
>
>                 Key: CAMEL-9281
>                 URL: https://issues.apache.org/jira/browse/CAMEL-9281
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-http, camel-http4
>    Affects Versions: 2.15.4
>            Reporter: Edward Welch
>
> I have created a scenario which seems to exploit a bug in the HttpHelper 
> createURL method.
> My use case:
> Using http4 component in an http proxy with bridgeEndpoint true
> Send a request such as http://somesite/contextpath
> Request is forwarded by my proxy to a tomcat server.  Tomcat will reply with 
> a 302 and a new Location of http://somesite/contextpath/ as this is a built 
> in behavior of tomcat to redirect the caller to the contextpath INCLUDING the 
> trailing slash
> I have http client configured with httpClient.redirectsEnabled=false
> Therefore the 302 is sent back through my proxy to the caller.
> The caller then makes the call to http://somesite/contextpath/
> This is where the problem occurs,  within the createUrl method:
> {code}
>         String path = exchange.getIn().getHeader(Exchange.HTTP_PATH, 
> String.class);
>         // NOW the HTTP_PATH is just related path, we don't need to trim it
>         if (path != null) {
>             if (path.startsWith("/")) {
>                 path = path.substring(1);
>             }
>             if (path.length() > 0) {
>                 // make sure that there is exactly one "/" between HTTP_URI 
> and
>                 // HTTP_PATH
>                 if (!uri.endsWith("/")) {
>                     uri = uri + "/";
>                 }
>                 uri = uri.concat(path);
>             }
>         }
> {code}
> When the second request is made with the trailing slash, the string "path" is 
> / (just a single forward slash)
> This hits the first conditional and results in true, which the following 
> substring then removes this slash.
> Now path.length() is not > 0 so the second conditional evaluates false.
> And we end up with a uri returned that no longer has the trailing slash.
> This is sent to Tomcat, Tomcat then promptly returns another 302 and a 
> redirect loop is created.
> I think the intent of this block of code is to combine the uri and path and 
> make sure there isn't a duplicate forward slash?
> So the simplest fix I can suggest would be something like
> {code}
>         String path = exchange.getIn().getHeader(Exchange.HTTP_PATH, 
> String.class);
>         // NOW the HTTP_PATH is just related path, we don't need to trim it
>         if (path != null && ! path.equals("/")) {
>             if (path.startsWith("/")) {
>                 path = path.substring(1);
>             }
>             if (path.length() > 0) {
>                 // make sure that there is exactly one "/" between HTTP_URI 
> and
>                 // HTTP_PATH
>                 if (!uri.endsWith("/")) {
>                     uri = uri + "/";
>                 }
>                 uri = uri.concat(path);
>             }
>         }
> {code}
> Where we would just check for this case explicitly with:
> if (path != null && ! path.equals("/")) {
> Thoughts?
> I could probably put together a PR and add some test cases



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to