Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use headers set in PreMatching filter during media type negotiation #38131

Merged
merged 1 commit into from
Jan 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
import org.jboss.resteasy.reactive.common.util.ServerMediaType;
import org.jboss.resteasy.reactive.server.core.ResteasyReactiveRequestContext;
import org.jboss.resteasy.reactive.server.mapping.RuntimeResource;
import org.jboss.resteasy.reactive.server.spi.ServerHttpRequest;
import org.jboss.resteasy.reactive.server.spi.ServerRestHandler;

/**
Expand Down Expand Up @@ -100,12 +99,13 @@ public void handle(ResteasyReactiveRequestContext requestContext) throws Excepti

public MediaType selectMediaType(ResteasyReactiveRequestContext requestContext, Holder holder) {
MediaType selected = null;
ServerHttpRequest httpServerRequest = requestContext.serverRequest();
if (httpServerRequest.containsRequestHeader(HttpHeaders.ACCEPT)) {
List<String> accepts = requestContext.getHttpHeaders().getRequestHeader(HttpHeaders.ACCEPT);
for (String accept : accepts) {
Map.Entry<MediaType, MediaType> entry = holder.serverMediaType
.negotiateProduces(requestContext.serverRequest().getRequestHeader(HttpHeaders.ACCEPT), null);
.negotiateProduces(accept, null);
if (entry.getValue() != null) {
selected = entry.getValue();
break;
}
}
if (selected == null) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
package org.jboss.resteasy.reactive.server.vertx.test.matching;

import static io.restassured.RestAssured.given;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.equalTo;

import java.util.function.Supplier;

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.container.ContainerRequestContext;
import jakarta.ws.rs.container.ContainerRequestFilter;
import jakarta.ws.rs.container.PreMatching;
import jakarta.ws.rs.core.HttpHeaders;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.MultivaluedMap;
import jakarta.ws.rs.ext.Provider;

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 PreMatchAcceptInHeader {

@RegisterExtension
static ResteasyReactiveUnitTest test = new ResteasyReactiveUnitTest()
.setArchiveProducer(new Supplier<>() {
@Override
public JavaArchive get() {
return ShrinkWrap.create(JavaArchive.class)
.addClass(PathSegmentTest.Resource.class);
}
});

@Test
void browserDefault() {
given().accept("text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
.when()
.get("test")
.then()
.statusCode(200)
.body(containsString("<html>"));
}

@Test
void text() {
given().accept("text/plain")
.when()
.get("test")
.then()
.statusCode(200)
.body(equalTo("test"));
}

@Test
void html() {
given().accept("text/html")
.when()
.get("test")
.then()
.statusCode(200)
.body(equalTo("test"));
}

@Test
void json() {
given().accept("application/json")
.when()
.get("test")
.then()
.statusCode(404);
}

@Test
void setAcceptToTextInFilter() {
given().accept("application/json")
.header("x-set-accept-to-text", "true")
.when()
.get("test")
.then()
.statusCode(200)
.body(equalTo("test"));
}

@Path("/test")
public static class Resource {

@GET
@Produces(MediaType.TEXT_PLAIN)
public String text() {
return "text";
}

@GET
@Produces(MediaType.TEXT_HTML)
public String html() {
return """
<html>
<head>
</head>
<body>
Hello World
</body>
</html>
""";
}
}

@PreMatching
@Provider
public static class SetAcceptHeaderFilter implements ContainerRequestFilter {

@Override
public void filter(ContainerRequestContext requestContext) {
MultivaluedMap<String, String> headers = requestContext.getHeaders();
if ("true".equals(headers.getFirst("x-set-accept-to-text"))) {
headers.putSingle(HttpHeaders.ACCEPT, MediaType.TEXT_PLAIN);
}
}
}
}