Skip to content

Commit

Permalink
Improve reactive rest client "process paths before sub resources" sce…
Browse files Browse the repository at this point in the history
…nario

There is an issue in upstream (quarkusio/quarkus#29821) that
only happends under some RestClient definition hierarchy.

This commit reproduces the problem in Quarkus 2.12 and earlier versions
  • Loading branch information
pablo gonzalez granados committed Jan 14, 2023
1 parent 2fad57f commit 6862185
Show file tree
Hide file tree
Showing 16 changed files with 138 additions and 122 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package io.quarkus.ts.http.restclient.reactive;

import javax.ws.rs.Path;

public interface AuthorizationResource {
@Path("/permission")
PermissionsResource permissions();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package io.quarkus.ts.http.restclient.reactive;

import javax.ws.rs.Path;

public interface ClientResource {

@Path("/authz/resource-server")
AuthorizationResource authorization();

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package io.quarkus.ts.http.restclient.reactive;

import javax.ws.rs.Path;
import javax.ws.rs.PathParam;

public interface ClientsResource {
@Path("{id}")
ClientResource get(@PathParam("id") String id);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package io.quarkus.ts.http.restclient.reactive;

import javax.ws.rs.Path;

public interface PermissionsResource {
@Path("resource")
ResourcePermissionsResource resource();
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package io.quarkus.ts.http.restclient.reactive;

import javax.ws.rs.Consumes;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import org.eclipse.microprofile.rest.client.annotation.RegisterClientHeaders;
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;

@RegisterRestClient
@RegisterClientHeaders
@Consumes(MediaType.TEXT_PLAIN)
@Produces(MediaType.TEXT_PLAIN)
public interface RealmResource {
@Path("clients")
ClientsResource clients();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package io.quarkus.ts.http.restclient.reactive;

import javax.ws.rs.DELETE;

public interface ResourcePermissionResource {
@DELETE
String remove();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package io.quarkus.ts.http.restclient.reactive;

import javax.ws.rs.Path;
import javax.ws.rs.PathParam;

public interface ResourcePermissionsResource {
@Path("{id}")
ResourcePermissionResource findById(@PathParam("id") String id);
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package io.quarkus.ts.http.restclient.reactive;
package io.quarkus.ts.http.restclient.reactive.resources;

import java.util.ArrayList;
import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package io.quarkus.ts.http.restclient.reactive.resources;

import java.net.URI;
import java.net.URISyntaxException;

import javax.inject.Inject;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;

import org.eclipse.microprofile.rest.client.RestClientBuilder;
import org.eclipse.microprofile.rest.client.inject.RestClient;

import io.quarkus.ts.http.restclient.reactive.RealmResource;

@Path("clients/{clientId}/clientResource")
@Consumes("text/plain")
@Produces("text/plain")
public class PlainComplexClientResource {
@Inject
@RestClient
RealmResource realmResource;

@DELETE
@Path("/{id}")
@Produces(MediaType.TEXT_PLAIN)
public String deleteClientResource(@PathParam("clientId") String rootParam, @PathParam("id") String id) {
return realmResource.clients().get(rootParam).authorization().permissions().resource().findById(id).remove();
}

@DELETE
@Path("/{id}/manual/build")
@Produces(MediaType.TEXT_PLAIN)
public String deleteClientResource(@PathParam("clientId") String rootParam, @PathParam("id") String id,
@QueryParam("baseUri") String baseUri) throws URISyntaxException {
RealmResource rClient = RestClientBuilder.newBuilder().baseUri(new URI(baseUri)).build(RealmResource.class);
return rClient.clients().get(rootParam).authorization().permissions().resource().findById(id).remove();
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package io.quarkus.ts.http.restclient.reactive;
package io.quarkus.ts.http.restclient.reactive.resources;

import java.util.List;
import java.util.Map;
Expand All @@ -14,6 +14,7 @@

import org.eclipse.microprofile.rest.client.inject.RestClient;

import io.quarkus.ts.http.restclient.reactive.BookClient;
import io.quarkus.ts.http.restclient.reactive.json.Book;
import io.quarkus.ts.http.restclient.reactive.json.BookIdWrapper;
import io.quarkus.ts.http.restclient.reactive.json.IdBeanParam;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package io.quarkus.ts.http.restclient.reactive.resources;

import javax.ws.rs.DELETE;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;

@Path("/clients/{rootPath}/authz/resource-server/permission/resource")
public class ReactivecomplexClientResource {
@Path("/{id}")
@DELETE
public String deleteById(@PathParam("rootPath") String rootPath, @PathParam("id") String id) {
return "/clients/" + rootPath + "/authz/resource-server/permission/resource/" + id;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ quarkus.rest-client."io.quarkus.ts.http.restclient.reactive.json.JsonRestInterfa
quarkus.rest-client."io.quarkus.ts.http.restclient.reactive.files.FileClient".url=http://localhost:${quarkus.http.port}
quarkus.rest-client."io.quarkus.ts.http.restclient.reactive.BookClient".url=http://localhost:${quarkus.http.port}
quarkus.rest-client."io.quarkus.ts.http.restclient.reactive.BookClient.AuthorClient".url=http://localhost:${quarkus.http.port}
quarkus.rest-client."io.quarkus.ts.http.restclient.reactive.SubResourcesClient".url=http://localhost:${quarkus.http.port}
quarkus.rest-client."io.quarkus.ts.http.restclient.reactive.RealmResource".url=http://localhost:${quarkus.http.port}

quarkus.rest-client.logging.scope=request-response
quarkus.log.category."org.jboss.resteasy.reactive.client.logging".level=DEBUG
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package io.quarkus.ts.http.restclient.reactive;

import static io.quarkus.ts.http.restclient.reactive.PlainBookResource.SEARCH_TERM_VAL;
import static io.quarkus.ts.http.restclient.reactive.resources.PlainBookResource.SEARCH_TERM_VAL;
import static org.hamcrest.Matchers.nullValue;
import static org.junit.jupiter.api.Assertions.assertEquals;

Expand Down Expand Up @@ -202,22 +202,24 @@ public void checkSuffixPriority() {
@Test
public void checkProcessPathBeforeSubResources() {
// should result in sending GET root/method/sub/sub/subsub
String result = app.given().get("/plain-root/root/method/sub/subsub").then()
String id = "3479dd56-02e9-4222-94fe-6a13cd065195";
String result = app.given().delete("clients/myRealm/clientResource/" + id).then()
.statusCode(HttpStatus.SC_OK)
.extract().asString();

assertEquals("root/method/sub/sub/subsub", result);
assertEquals("/clients/myRealm/authz/resource-server/permission/resource/" + id, result);
}

@Tag("QUARKUS-2741")
@Test
public void checkProcessPathBeforeSubResourcesManualRestClientBuild() {
String id = "3479dd56-02e9-4222-94fe-6a13cd065195";
String baseUri = String.format("http://%s:%s", app.getURI().getHost(), "" + app.getURI().getPort());
// should result in sending GET root/method/sub/sub/subsub
String result = app.given().get("/plain-root/root/manualClient/method/sub/subsub?baseUri=" + baseUri).then()
String result = app.given().get("clients/myRealm/clientResource" + id + "/manual/build?baseUri=" + baseUri).then()
.statusCode(HttpStatus.SC_OK)
.extract().asString();

assertEquals("root/method/sub/sub/subsub", result);
assertEquals("/clients/myRealm/authz/resource-server/permission/resource/" + id, result);
}
}

0 comments on commit 6862185

Please sign in to comment.