Index: trunk/jaxrs/resteasy-jaxrs/src/main/java/org/jboss/resteasy/mock/MockHttpRequest.java =================================================================== --- trunk/jaxrs/resteasy-jaxrs/src/main/java/org/jboss/resteasy/mock/MockHttpRequest.java (revision 1383) +++ trunk/jaxrs/resteasy-jaxrs/src/main/java/org/jboss/resteasy/mock/MockHttpRequest.java (revision ) @@ -19,6 +19,7 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.PathSegment; +import javax.ws.rs.core.UriBuilder; import javax.ws.rs.core.UriInfo; import java.io.ByteArrayInputStream; import java.io.IOException; @@ -66,8 +67,14 @@ request.httpHeaders.setCookies(new HashMap()); request.httpHeaders.setRequestHeaders(new Headers()); //request.uri = new UriInfoImpl(absoluteUri, absoluteUri, absoluteUri.getPath(), absoluteUri.getQuery(), PathSegmentImpl.parseSegments(absoluteUri.getPath())); - List encodedPathSegments = PathSegmentImpl.parseSegments(absoluteUri.getRawPath(), false); - request.uri = new UriInfoImpl(absoluteUri, baseUri, absoluteUri.getRawPath(), absoluteUri.getRawQuery(), encodedPathSegments); + + // remove query part + URI absolutePath = UriBuilder.fromUri(absoluteUri).replaceQuery(null).build(); + // path must be relative to the application's base uri + URI relativeUri = baseUri.relativize(absoluteUri); + + List encodedPathSegments = PathSegmentImpl.parseSegments(relativeUri.getRawPath(), false); + request.uri = new UriInfoImpl(absolutePath, baseUri, "/" + relativeUri.getRawPath(), absoluteUri.getRawQuery(), encodedPathSegments); request.preprocessedPath = request.uri.getPath(false); return request; } Index: trunk/jaxrs/resteasy-jaxrs/src/main/java/org/jboss/resteasy/spi/InternalDispatcher.java =================================================================== --- trunk/jaxrs/resteasy-jaxrs/src/main/java/org/jboss/resteasy/spi/InternalDispatcher.java (revision 1342) +++ trunk/jaxrs/resteasy-jaxrs/src/main/java/org/jboss/resteasy/spi/InternalDispatcher.java (revision ) @@ -6,8 +6,10 @@ import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.Response; -import java.net.URISyntaxException; +import javax.ws.rs.core.UriInfo; +import java.net.URI; + import static org.jboss.resteasy.spi.ResteasyProviderFactory.*; /** @@ -134,16 +136,13 @@ return request.getHttpHeaders().getRequestHeaders(); } - public static MockHttpRequest createRequest(String uri, String verb) + public static MockHttpRequest createRequest(String relativeUri, String verb) { - try - { - return MockHttpRequest.create(verb, uri); + UriInfo uriInfo = ResteasyProviderFactory.getContextData(UriInfo.class); + + URI baseUri = uriInfo.getBaseUri(); + URI absoluteUri = baseUri.resolve(relativeUri); + + return MockHttpRequest.create(verb, absoluteUri, baseUri); - } + } - catch (URISyntaxException e) - { - throw new RuntimeException( - "could not create uri for internal dispatching", e); - } +} - } -} Index: trunk/jaxrs/resteasy-jaxrs/src/test/java/org/jboss/resteasy/test/finegrain/InternalDispatcherTest.java =================================================================== --- trunk/jaxrs/resteasy-jaxrs/src/test/java/org/jboss/resteasy/test/finegrain/InternalDispatcherTest.java (revision 1342) +++ trunk/jaxrs/resteasy-jaxrs/src/test/java/org/jboss/resteasy/test/finegrain/InternalDispatcherTest.java (revision ) @@ -10,6 +10,7 @@ import org.jboss.resteasy.spi.ResteasyProviderFactory; import org.jboss.resteasy.test.EmbeddedContainer; import org.junit.AfterClass; +import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; @@ -25,7 +26,10 @@ import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; +import javax.ws.rs.core.UriInfo; +import java.util.Stack; + import static org.jboss.resteasy.test.TestPortProvider.*; /** @@ -39,6 +43,7 @@ { private static Dispatcher dispatcher; + private static ForwardingResource forwardingResource; @Path("/") public interface Client @@ -94,13 +99,18 @@ @Path("/") public static class ForwardingResource { + public Stack uriStack = new Stack(); String basic = "basic"; + @Context + UriInfo uriInfo; + @GET @Produces("text/plain") @Path("/basic") public String getBasic() { + uriStack.push(uriInfo.getAbsolutePath().toString()); return basic; } @@ -109,6 +119,7 @@ @Path("/forward/basic") public String forwardBasic(@Context InternalDispatcher dispatcher) { + uriStack.push(uriInfo.getAbsolutePath().toString()); return (String) dispatcher.getEntity("/basic"); } @@ -118,6 +129,7 @@ @Path("/basic") public void putBasic(String basic) { + uriStack.push(uriInfo.getAbsolutePath().toString()); this.basic = basic; } @@ -125,6 +137,7 @@ @Path("/basic") public void deleteBasic() { + uriStack.push(uriInfo.getAbsolutePath().toString()); this.basic = "basic"; } @@ -134,6 +147,7 @@ public void putForwardBasic(String basic, @Context InternalDispatcher dispatcher) { + uriStack.push(uriInfo.getAbsolutePath().toString()); dispatcher.putEntity("/basic", basic); } @@ -143,6 +157,7 @@ public void postForwardBasic(String basic, @Context InternalDispatcher dispatcher) { + uriStack.push(uriInfo.getAbsolutePath().toString()); dispatcher.postEntity("/basic", basic); } @@ -150,6 +165,7 @@ @Path("/forward/basic") public void deleteForwardBasic(@Context InternalDispatcher dispatcher) { + uriStack.push(uriInfo.getAbsolutePath().toString()); dispatcher.delete("/basic"); } @@ -158,6 +174,7 @@ @Path("/object/{id}") public Response getObject(@PathParam("id") Integer id) { + uriStack.push(uriInfo.getAbsolutePath().toString()); if (id == 0) return Response.noContent().build(); else @@ -169,6 +186,7 @@ public Response forwardObject(@PathParam("id") Integer id, @Context InternalDispatcher dispatcher) { + uriStack.push(uriInfo.getAbsolutePath().toString()); return dispatcher.getResponse("/object/" + id); } @@ -177,6 +195,7 @@ public int infinitFoward(@Context InternalDispatcher dispatcher, @QueryParam("count") @DefaultValue("0") int count) { + uriStack.push(uriInfo.getAbsolutePath().toString()); try { dispatcher.getEntity("/infinite-forward?count=" + (count + 1)); @@ -203,9 +222,15 @@ public static void before() throws Exception { dispatcher = EmbeddedContainer.start().getDispatcher(); - dispatcher.getRegistry().addSingletonResource(new ForwardingResource()); + forwardingResource = new ForwardingResource(); + dispatcher.getRegistry().addSingletonResource(forwardingResource); } + @Before + public void setup() { + forwardingResource.uriStack.clear(); + } + @AfterClass public static void after() throws Exception { @@ -245,4 +270,24 @@ Assert.assertEquals(1, client.infiniteForward()); } + @Test + public void testUriInfoBasic() { + String baseUrl = generateBaseUrl(); + Client client = ProxyFactory.create(Client.class, baseUrl); + + client.getBasic(); + Assert.assertEquals(baseUrl + "/basic", forwardingResource.uriStack.pop()); + Assert.assertTrue(forwardingResource.uriStack.isEmpty()); -} \ No newline at end of file + } + + @Test + public void testUriInfoForwardBasic() { + String baseUrl = generateBaseUrl(); + Client client = ProxyFactory.create(Client.class, baseUrl); + + client.getForwardBasic(); + Assert.assertEquals(baseUrl + "/basic", forwardingResource.uriStack.pop()); + Assert.assertEquals(baseUrl + "/forward/basic", forwardingResource.uriStack.pop()); + Assert.assertTrue(forwardingResource.uriStack.isEmpty()); + } +} \ No newline at end of file