Markus Rathgeb created CXF-8190:
-----------------------------------

             Summary: UriBuilder / HttpUtils replace 127.0.0.1 by localhost
                 Key: CXF-8190
                 URL: https://issues.apache.org/jira/browse/CXF-8190
             Project: CXF
          Issue Type: Bug
            Reporter: Markus Rathgeb


If you access a locally running REST endpoint in the brower using the IP 
address 127.0.0.1 and the REST endpoint implementation is using the UriInfo to 
build a new URL by the URI builder (e.g. a created resource), the reply will 
not use the host as accessed (127.0.0.1) but replaces the host by "localhost".

If the web application then tries to access the location, the browsers will 
block that request because of a cross origin access.

 

Assume a very simple REST endpoint:
 
{code:java}
@Component(service = { Resource.class }, scope = ServiceScope.PROTOTYPE)
 @JaxrsResource
 public class Resource {
     @POST
     @Path("create")
     @Produces(MediaType.APPLICATION_JSON)
     public Object createTest(@Context final UriInfo uriInfo) {
         final URI uri =
 uriInfo.getBaseUriBuilder().path("foo").path("bar").build();
         return Response.created(uri).build();
     }
 }{code}

If I call the post method of that endpoint using the URL
 "[http://localhost:8080/create]"; I get a created location that looks
 like "[http://localhost:8080/foo/bar]";.
 
 All fine.
 
{noformat}
$ curl -v -X POST http://localhost:8080/create
 *   Trying ::1:8080...
 * TCP_NODELAY set
 * Connected to localhost (::1) port 8080 (#0)
 > POST /create HTTP/1.1
 > Host: localhost:8080
 > User-Agent: curl/7.67.0
 > Accept: */*
 >
 * Mark bundle as not supporting multiuse
 < HTTP/1.1 201 Created
 < Date: Tue, 10 Dec 2019 17:41:47 GMT
 < Location: http://localhost:8080/foo/bar
 < Content-Length: 0
 <
 * Connection #0 to host localhost left intact{noformat}

But, I would expect if I access the endpoint using the IP instead of
 the hostname "[http://127.0.0.1:8080/create]"; the created response's
 location should look like "[http://127.0.0.1:8080/foo/bar]";.
 
 But that is not the case...
 
 The response provides "[http://localhost:8080/foo/bar]";
 
{noformat}
curl -v -X POST http://127.0.0.1:8080/create
 *   Trying 127.0.0.1:8080...
 * TCP_NODELAY set
 * Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
 > POST /create HTTP/1.1
 > Host: 127.0.0.1:8080
 > User-Agent: curl/7.67.0
 > Accept: */*
 >
 * Mark bundle as not supporting multiuse
 < HTTP/1.1 201 Created
 < Date: Tue, 10 Dec 2019 17:44:00 GMT
 < Location: http://localhost:8080/foo/bar
 < Content-Length: 0
 <
 * Connection #0 to host 127.0.0.1 left intact{noformat}

 If the website that is accessed using 127.0.0.1 provides a location
 using localhost and that one is used by the browser, the browser fails
 because of CORS.

 

I already looked at the sources who is causing the change from 127.0.0.1 to
 localhost and found it:
 
 After the line
 
[https://github.com/apache/cxf/blob/cxf-3.2.5/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriInfoImpl.java#L83]
 has been executed the variable u looks like
 [http://127.0.0.1:8080/]
 
 After that "toAbsoluteUri" of HttpUtils is called.
 That's the part of the code that replaces 127.0.0.1 by localhost
 
[https://github.com/apache/cxf/blob/cxf-3.2.5/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java#L388-L391]
 
 The commit that added that part of code is
 
[https://github.com/apache/cxf/commit/ebc910780b2b9b971a7c1c2e4019bdf9ec35e460#diff-1e4a62a6414e4007d2f5be9f0313c8c0R311-R314]

The git commit referenced the wrong Jira (2007) - it should have been 
https://issues.apache.org/jira/browse/CXF-5007

 



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to