From 95ce4e98953a310d44c015709fb35b02e0c4bb81 Mon Sep 17 00:00:00 2001 From: Georgios Andrianakis Date: Thu, 30 Jan 2025 11:31:42 +0200 Subject: [PATCH] Fix incorrect response code when media type is invalid Fixes: #45385 --- .../server/handlers/MediaTypeMapper.java | 8 +- .../test/matching/InvalidHeaderTest.java | 78 +++++++++++++++++++ 2 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 independent-projects/resteasy-reactive/server/vertx/src/test/java/org/jboss/resteasy/reactive/server/vertx/test/matching/InvalidHeaderTest.java diff --git a/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/handlers/MediaTypeMapper.java b/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/handlers/MediaTypeMapper.java index 2f82f025a1b0a..5ae07a07f6d09 100644 --- a/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/handlers/MediaTypeMapper.java +++ b/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/handlers/MediaTypeMapper.java @@ -75,7 +75,13 @@ public void handle(ResteasyReactiveRequestContext requestContext) throws Excepti if (selectedHolder.mtWithoutParamsToResource.size() == 1) { selectedResource = selectedHolder.mtWithoutParamsToResource.values().iterator().next(); } else { - MediaType produces = selectMediaType(requestContext, selectedHolder); + MediaType produces; + try { + produces = selectMediaType(requestContext, selectedHolder); + } catch (Exception e) { + // there is TCK testing this, but some of the legacy RESTEasy tests do expect the result to be 400 + throw new WebApplicationException(Response.status(Response.Status.BAD_REQUEST).build()); + } requestContext.setResponseContentType(produces); MediaType key = produces; if (!key.getParameters().isEmpty()) { diff --git a/independent-projects/resteasy-reactive/server/vertx/src/test/java/org/jboss/resteasy/reactive/server/vertx/test/matching/InvalidHeaderTest.java b/independent-projects/resteasy-reactive/server/vertx/src/test/java/org/jboss/resteasy/reactive/server/vertx/test/matching/InvalidHeaderTest.java new file mode 100644 index 0000000000000..4bfc7e7ab768b --- /dev/null +++ b/independent-projects/resteasy-reactive/server/vertx/src/test/java/org/jboss/resteasy/reactive/server/vertx/test/matching/InvalidHeaderTest.java @@ -0,0 +1,78 @@ +package org.jboss.resteasy.reactive.server.vertx.test.matching; + +import static io.restassured.RestAssured.given; +import static org.hamcrest.CoreMatchers.is; + +import java.util.function.Supplier; + +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; + +import org.jboss.resteasy.reactive.RestPath; +import org.jboss.resteasy.reactive.server.vertx.test.framework.ResteasyReactiveUnitTest; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class InvalidHeaderTest { + + @RegisterExtension + static ResteasyReactiveUnitTest test = new ResteasyReactiveUnitTest() + .setArchiveProducer(new Supplier<>() { + @Override + public JavaArchive get() { + return ShrinkWrap.create(JavaArchive.class) + .addClasses(TestResource.class); + } + }); + + @Test + void test() { + given() + .header("Accept", "application/json") + .when().get("/test/1") + .then() + .statusCode(200) + .body(is("{\"id\": \"1\"}")); + + given() + .header("Accept", "text/plain") + .when().get("/test/1") + .then() + .statusCode(200) + .body(is("1")); + + given() + .header("Accept", "foobar") + .when().get("/test/1") + .then() + .statusCode(400); + } + + @Path("/test") + public static class TestResource { + + @GET + @Produces("*/*") + public String hello() { + return "Hello from Quarkus REST"; + } + + @GET + @Path("/{id}") + @Produces(MediaType.TEXT_PLAIN) + public String file(@RestPath String id) { + return id; + } + + @GET + @Path("/{id}") + @Produces(MediaType.APPLICATION_JSON) + public String file2(@RestPath String id) { + return "{\"id\": \"" + id + "\"}"; + } + } +}