Skip to content

Commit

Permalink
Consuming multiple media types from a resource method does not work
Browse files Browse the repository at this point in the history
Closes quarkusio#29732

(cherry picked from commit 9dcbd7d)
  • Loading branch information
pedroigor authored and gsmet committed Dec 14, 2022
1 parent 4a46c5c commit aecee1f
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,27 +28,27 @@
*/
public class MediaTypeMapper implements ServerRestHandler {

private static final MediaType[] DEFAULT_MEDIA_TYPES = new MediaType[] { MediaType.WILDCARD_TYPE };
private static final List<MediaType> DEFAULT_MEDIA_TYPES_LIST = List.of(DEFAULT_MEDIA_TYPES);

final Map<MediaType, Holder> resourcesByConsumes;
final List<MediaType> consumesTypes;

public MediaTypeMapper(List<RuntimeResource> runtimeResources) {
resourcesByConsumes = new HashMap<>();
consumesTypes = new ArrayList<>();
for (RuntimeResource runtimeResource : runtimeResources) {
MediaType consumesMT = runtimeResource.getConsumes().isEmpty() ? MediaType.WILDCARD_TYPE
: runtimeResource.getConsumes().get(0);
if (!resourcesByConsumes.containsKey(consumesMT)) {
consumesTypes.add(consumesMT);
resourcesByConsumes.put(consumesMT, new Holder());
}
MediaType[] produces = runtimeResource.getProduces() != null
? runtimeResource.getProduces().getSortedOriginalMediaTypes()
: null;
if (produces == null) {
produces = new MediaType[] { MediaType.WILDCARD_TYPE };
List<MediaType> consumesMediaTypes = getConsumesMediaTypes(runtimeResource);
for (MediaType consumedMediaType : consumesMediaTypes) {
if (!resourcesByConsumes.containsKey(consumedMediaType)) {
consumesTypes.add(consumedMediaType);
resourcesByConsumes.put(consumedMediaType, new Holder());
}
}
for (MediaType producesMT : produces) {
resourcesByConsumes.get(consumesMT).setResource(runtimeResource, producesMT);
for (MediaType producesMT : getProducesMediaTypes(runtimeResource)) {
for (MediaType consumedMediaType : consumesMediaTypes) {
resourcesByConsumes.get(consumedMediaType).setResource(runtimeResource, producesMT);
}
}
}
for (Holder holder : resourcesByConsumes.values()) {
Expand Down Expand Up @@ -116,6 +116,17 @@ public MediaType selectMediaType(ResteasyReactiveRequestContext requestContext,
return selected;
}

private MediaType[] getProducesMediaTypes(RuntimeResource runtimeResource) {
return runtimeResource.getProduces() == null
? DEFAULT_MEDIA_TYPES
: runtimeResource.getProduces().getSortedOriginalMediaTypes();
}

private List<MediaType> getConsumesMediaTypes(RuntimeResource runtimeResource) {
return runtimeResource.getConsumes().isEmpty() ? DEFAULT_MEDIA_TYPES_LIST
: runtimeResource.getConsumes();
}

private static final class Holder {

private final Map<MediaType, RuntimeResource> mtWithoutParamsToResource = new HashMap<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -216,4 +216,28 @@ public void postInteger() throws Exception {
String responseContent = response.readEntity(String.class);
LOG.debug(String.format("Response: %s", responseContent));
}

@Test
@DisplayName("Post Multi Media Type Consumer")
public void testConsumesMultiMediaType() {
WebTarget target = client.target(generateURL("/postMultiMediaTypeConsumer"));
Response response = target.request().post(Entity.entity("payload", "application/soap+xml"));
Assertions.assertEquals(Response.Status.OK.getStatusCode(),
response.getStatus());
Assertions.assertEquals("postMultiMediaTypeConsumer", response.readEntity(String.class));

response = target.request().post(Entity.entity("payload", MediaType.TEXT_XML));
Assertions.assertEquals(Response.Status.OK.getStatusCode(),
response.getStatus());
Assertions.assertEquals("postMultiMediaTypeConsumer", response.readEntity(String.class));

response = target.request().post(Entity.entity("payload", "any/media-type"));
Assertions.assertEquals(Response.Status.OK.getStatusCode(),
response.getStatus());
Assertions.assertEquals("any/media-type", response.readEntity(String.class));

response = target.request().post(Entity.entity("payload", "unexpected/media-type"));
Assertions.assertEquals(Response.Status.UNSUPPORTED_MEDIA_TYPE.getStatusCode(),
response.getStatus());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
import java.util.Date;

import javax.ws.rs.Consumes;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

Expand Down Expand Up @@ -75,4 +77,18 @@ public Response postIntegerProduce(String source) throws Exception {
public Response postInteger(String source) throws Exception {
return Response.ok().entity(5).build();
}

@Path("postMultiMediaTypeConsumer")
@Consumes({ "application/soap+xml", MediaType.TEXT_XML })
@POST
public Response postMultiMediaTypeConsumer() {
return Response.ok("postMultiMediaTypeConsumer").build();
}

@Path("postMultiMediaTypeConsumer")
@Consumes({ "any/media-type" })
@POST
public Response postMultiMediaTypeConsumerAnyContentType(@HeaderParam(HttpHeaders.CONTENT_TYPE) String contentType) {
return Response.ok(contentType).build();
}
}

0 comments on commit aecee1f

Please sign in to comment.