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 happens under some RestClient definition hierarchy.

This commit reproduces the problem in Quarkus 2.12 and earlier versions

(cherry picked from commit 0ffedd5)
  • Loading branch information
pablo gonzalez granados committed Jan 17, 2023
1 parent 75f0375 commit c345c60
Show file tree
Hide file tree
Showing 7 changed files with 132 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package io.quarkus.ts.http.restclient.reactive;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
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 ResourceAndSubResourcesClient {
@Path("clients")
ClientsResource clients();

interface ClientsResource {
@Path("{id}")
ClientResource get(@PathParam("id") String id);
}

interface ClientResource {
@Path("/resource-server")
SubResource sub();
}

interface LeafResource {
@GET
String retrieve();
}

interface SubResource {
@Path("{id}")
LeafResource findById(@PathParam("id") String id);
}
}
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,44 @@
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.GET;
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.apache.commons.lang3.StringUtils;
import org.eclipse.microprofile.rest.client.RestClientBuilder;
import org.eclipse.microprofile.rest.client.inject.RestClient;

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

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

@GET
@Path("/{id}")
@Produces(MediaType.TEXT_PLAIN)
public String getClientResource(@PathParam("clientId") String rootParam,
@PathParam("id") String id,
@QueryParam("baseUri") String baseUri) throws URISyntaxException {

ResourceAndSubResourcesClient restClient = resourceAndSubResourcesClient;
if (!StringUtils.isEmpty(baseUri)) {
restClient = RestClientBuilder.newBuilder().baseUri(new URI(baseUri))
.build(ResourceAndSubResourcesClient.class);
}

return restClient.clients().get(rootParam).sub().findById(id).retrieve();
}
}
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.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;

@Path("/clients/{rootPath}/resource-server")
public class ReactivecomplexClientResource {
@Path("/{id}")
@GET
public String retrieveById(@PathParam("rootPath") String rootPath, @PathParam("id") String id) {
return "/clients/" + rootPath + "/resource-server/" + id;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ 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.ResourceAndSubResourcesClient".url=http://localhost:${quarkus.http.port}

quarkus.rest-client.logging.scope=request-response
quarkus.log.category."org.jboss.resteasy.reactive.client.logging".level=DEBUG
quarkus.http.limits.max-body-size=3G
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
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;

import java.util.UUID;

import org.apache.http.HttpStatus;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.DisabledOnOs;
import org.junit.jupiter.api.condition.OS;

import io.quarkus.test.bootstrap.Protocol;
import io.quarkus.test.bootstrap.RestService;
import io.quarkus.test.scenarios.QuarkusScenario;
import io.quarkus.test.scenarios.annotations.DisabledOnQuarkusVersion;
Expand Down Expand Up @@ -197,4 +200,29 @@ public void checkSuffixPriority() {
assertEquals(HttpStatus.SC_OK, suffix.statusCode());
assertEquals("Heller_text", suffix.getBody().asString());
}

@Tag("QUARKUS-2741")
@Test
public void checkProcessPathBeforeSubResources() {
final String randomId = UUID.randomUUID().toString();
String result = app.given().get("clients/myRealm/clientResource/" + randomId).then()
.statusCode(HttpStatus.SC_OK)
.extract().asString();

assertEquals("/clients/myRealm/resource-server/" + randomId, result);
}

@Tag("QUARKUS-2741")
@Test
public void checkProcessPathBeforeSubResourcesManualRestClientBuild() {
final String randomId = UUID.randomUUID().toString();
String result = app.given()
.get("clients/myRealm/clientResource/" + randomId + "/?baseUri=" + app.getURI(Protocol.HTTP).toString())
.then()
.statusCode(HttpStatus.SC_OK)
.extract().asString();

assertEquals("/clients/myRealm/resource-server/" + randomId, result);
}

}

0 comments on commit c345c60

Please sign in to comment.